I'm creating a barcode using DataMatrix.NetCore nuget package. I'm attempting to get that inserted into a PDF using PdfSharpCore. The barcode is generated and a bitmap is created, but the conversion to an ImageSource MemoryStream seems unreachable. I will be running this under Linux.

                var barcodeEncoder = new DmtxImageEncoder();
                var barcode = barcodeEncoder.EncodeImage(generateBarcodeResponse.BarcodeData);
                var barcodeStream = new MemoryStream();

                barcode.Save(barcodeStream, ImageFormat.Jpeg);

                barcodeStream.Position = 0;
                var imgSource = ImageSource.FromStream("barcode", () => barcodeStream);
                XImage xImg = XImage.FromImageSource(imgSource);

Code not allowed outside of Windows

1

There are 1 best solutions below

0
On

I figured out how to use existing open source nuget packages: PDFSharpCore, DataMatrix.NetCore and Magick.NET.Core w/ Magick.NET-Q16-AnyCPU.

Here is a test code snippet (of program.cs) that I used to prove the combination:

    using DataMatrix.NetCore;
    using ImageMagick;
    using PdfSharpCore.Drawing;
    using PdfSharpCore.Pdf;
    using System.Text;
    
    var pdf = new PdfDocument();
    var page = pdf.AddPage();
    XGraphics gfx = XGraphics.FromPdfPage(page);
    
    var barcodeEncoder = new DmtxImageEncoder();
    
    // convert string to barcode as svg stream (others not available as they use GDI+)
    byte[] byteArray = Encoding.UTF8.GetBytes(barcodeEncoder.EncodeSvgImage("0123456789", 2, 4));
    MemoryStream svgStream = new MemoryStream(byteArray);
    // now convert svg stream to gif stream using ImageMagick
    var m = new MagickImage(svgStream, MagickFormat.Svg);
    
    var barcodeStream = new MemoryStream();
    m.Write(barcodeStream, MagickFormat.Gif);
    
    barcodeStream.Seek(0, SeekOrigin.Begin);
    // now convert gif stream to XImage, ugh
    XImage xImgBarcode = XImage.FromStream(() => barcodeStream);
    
    var myXPoint = new XPoint(9, 40);
    gfx.DrawImage(xImgBarcode, myXPoint);
    
    pdf.Save("test.pdf");
    pdf.Close();
    pdf.Dispose();

It's a bit messy doing two conversions, but they are not super time consuming since the data being encoded in a datamatrix is typically small.

Hope this saves someone else the time I spent trying to figure it out!