使用 iTextSharp 和 IronBarcode / QRCoder / Spire Barcode 的二维码

QR Code with iTextSharp and IronBarcode / QRCoder / Spire Barcode

IronBarcode(首选)

我们想用 iTextSharp 在标签中打印二维码。我们使用 IronBarcode 来生成条形码。另见:IronBarcode Tutorial

var label = new Label(Enums.Alignment.CENTER);

// label.AddText("Nr.     " + index.ToString("000000"), "Verdana", 12, embedFont: true); // YEAH this works fine

var qrcode = QRCodeWriter.CreateQrCode(index.ToString(), 100);
var image = qrcode.GetInstance(); image.ScaleToFitHeight = false;
label.AddImage(image);

labelCreator.AddLabel(label);

错误:

"GeneratedBarcode" contain no defintion for "GetInstance", and there is no method who would accept an argument from typ "GeneratedBarcode".

QRCoder

我们也用 QRCoder 尝试过/在这里找到:QRCoder Tutorial

var label = new Label(Enums.Alignment.CENTER);

// label.AddText("Nr.     " + index.ToString("000000"), "Verdana", 12, embedFont: true); // YEAH this works fine

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(index.ToString(), QRCodeGenerator.ECCLevel.Q);
var qrCode = new Base64QRCode(qrCodeData);
var qrCodeImageAsBase64 = qrCode.GetGraphic(8);
var imageBytes = Convert.FromBase64String(qrCodeImageAsBase64);

var image = Image.GetInstance(imageBytes);
image.ScaleAbsoluteWidth(40);
image.ScaleAbsoluteHeight(40);

label.AddImage(image);

labelCreator.AddLabel(label);

错误:

"Image" contain no defintion for "GetInstance".

其他试试

如果我们使用using iTextSharp.text;using iTextSharp.text.pdf;

错误:

Argument "1": Convert from "iTextSharp.text.Image" to "System.IO.Stream" not possible

我们如何解决这个问题?感谢您的输入!

~编辑

这是我们从 label.cs 添加图像的函数。看看我们用作基本的这个项目:SharpPDFLabel.

public void AddImage(Stream img)
{
var mem = new System.IO.MemoryStream();
CopyStream(img, mem);
_images.Add(mem.GetBuffer());
}

第二步我们想在条形码中添加图像,首选是 IronBarcode 的解决方案。

如果您使用 iTextSharp 为什么不在 iTextSharp 中完全使用?

        GeneratedPdf generatedPDF = new GeneratedPdf();
        Document document = new Document();

        string path = @"C:\Temp\";
        string originalFileName = "qr.pdf";

        PdfWriter pdfWriter = PdfWriter.GetInstance(document, new FileStream(path + originalFileName, FileMode.Create));
        document.Open();
        string strBarCodeValue = "hello world";
        BarcodeQRCode barcodeQRCode = new BarcodeQRCode(strBarCodeValue, 20, 20, null) ;
        
        document.Add(barcodeQRCode.GetImage());
        document.Close();

解决方案

我们打开一个 MemoryStream 并将我们的二维码/图片放入其中。在它们背后的函数中,我们想要读取“Stream qrstream”。它必须是“MemoryStream qrstream”。

我们现在使用“Spire Barcode”而不是“IronBarcode”或“QRCoder”

错误

public void AddImage(Stream qrstream)
        {

            // var mem = new MemoryStream(); // not needed
            // CopyStream(qrstream, mem); // not needed
            _images.Add(qrstream.GetBuffer());
        }

正确

public void AddImage(MemoryStream qrstream)
        {
            // var mem = new MemoryStream(); // not needed
            // CopyStream(qrstream, mem); // not needed
            _images.Add(qrstream.GetBuffer());
        }

创建流的函数

               //Create a BarcodeSettings object
               BarcodeSettings settings = new BarcodeSettings();

               //Set barcode type, error correction level, data, etc.
               settings.Type = BarCodeType.QRCode;
               settings.QRCodeECL = QRCodeECL.H;
               settings.X = 1.4f;
               settings.AutoResize = true;
               settings.HasBorder = false;
               settings.ShowText = false;
               string data = "MY TEXT IN QR CODE";
               settings.Data = data;
               settings.Data2D = data;

               //Generate QR image based on the settings
               BarCodeGenerator generator = new BarCodeGenerator(settings);
               Image image = generator.GenerateImage();

               // Put Image to Stream
               var qrstream = new System.IO.MemoryStream();
               image.Save(qrstream, System.Drawing.Imaging.ImageFormat.Png);

               // Put QR Code to Label as Image
               label.AddImage(qrstream);

向单元格添加图像的函数

foreach (var img in _images)
            {
                var pdfImg = iTextSharp.text.Image.GetInstance(img);
                cellContent.Add(new Chunk(pdfImg, 0, 0));
            }

运行现在,太棒了!

IronBarcode 没有任何具有此名称的函数 GetInstance() 您可以使用 qrcode.Image 属性 那个 return System.Drawing.Image 对象 还有很多 return 不同类型的函数 qrcode.ToBitmap() 、 qrcode.ToImage() 、 qrcode.ToStream 和许多其他 你可以在 IronSoftware Website here

中找到它们

我写了一个代码片段,展示了如何创建包含徽标和注释的二维码

var qrcode = QRCodeWriter.CreateQrCodeWithLogo(index.ToString(), @"MyLogo.png");
qrcode.AddAnnotationTextBelowBarcode(index.ToString());
var image = qrcode.Image;
label.AddImage(image);
labelCreator.AddLabel(label);

您可以进一步了解 IronBarcode IronSoftware Tutorials here