Search code examples
itextqr-codeironbarcode

QR Code with iTextSharp and IronBarcode / QRCoder / Spire Barcode


IronBarcode (preferred)

We want to print a QR Code in a Label with iTextSharp. We use IronBarcode to generate the Barcode. Also see: 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);

Error:

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

QRCoder

Also we tried it with QRCoder / Found here: 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);

Error:

"Image" contain no defintion for "GetInstance".

Other try

If we use using iTextSharp.text; and using iTextSharp.text.pdf;

Error:

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

How we can fix this problem? Thanks for your input!

~ edit

This is our function to add the Image from label.cs. Have a look to this project we use as basic: SharpPDFLabel.

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

In a second step we want to add an image to our barcode, preferred is the solution of IronBarcode.


Solution

  • SOLUTION

    We open a MemoryStream and put into them our QR / picture. In our function behind them we want to read a "Stream qrstream". It must be "MemoryStream qrstream".

    We use now "Spire Barcode" instead of "IronBarcode" or "QRCoder"

    wrong

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

    correct

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

    function to create stream

                   //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);
    

    function to add image to cell

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

    Running now, great!