How-To create Barcodes in C/AL using the ZXing.NET library
In a recent project, I had the requirement to create barcodes in a simple and straightforward way. In this context I came across the Open-Source component ZXing. For this component, which is originally implemented in Java, there is fortunately also a C# port on GitHub available.
With its help, you can read and write barcodes of the following formats with just a few lines of code using DotNet. Alternatively, it should be easy to implement this as a microservice in Azure Functions and get your barcode via http call.
Encode:
UPC-A, EAN-8, EAN-13, Code 39, Code 128, ITF, Codabar, Plessey, MSI, QR Code, PDF-417, Aztec, Data Matrix
Decode:
UPC-A, UPC-E, EAN-8, EAN-13, Code 39, Code 93, Code 128, ITF, Codabar, MSI, RSS-14 (all variants), QR Code, Data Matrix, Aztec and PDF-417
Create Barcodes
The initial task was to retrieve decoded information through a webservice and then re-encode it into a barcode. The resulting barcode could then be shown on a special page which will be scanned through the user for further processing.
The implementation is straight forward C/AL (Dynamics NAV or Business Central OnPrem) using old fashioned DotNet. I create a Data Matrix barcode on-the-fly using Rec.GenerateBarcode() in a page. The barcode is then saved in a Blob field of type image and could be shown i.e. in a factbox.
But keep in mind that blob fields might impact performance…
LOCAL GenerateBarcode(TextToEncode : Text)
//Barcodes in C/AL
//MemoryStream Instance
MemoryStream := MemoryStream.MemoryStream;
//Barcode Instance
BarcodeWriter := BarcodeWriter.BarcodeWriter;
//Barcode Format
BarcodeWriter.Format := BarcodeFormat.DATA_MATRIX;
//Barcode Options
BarcodeEncodingOptions := BarcodeEncodingOptions.EncodingOptions;
BarcodeEncodingOptions.Height := 200;
BarcodeEncodingOptions.Width := 200;
BarcodeWriter.Options := BarcodeEncodingOptions;
//Create barcode and save image to MemoryStream
Bitmap := BarcodeWriter.Write(TextToEncode);
Bitmap.Save(MemoryStream, ImageFormat.Gif);
//Write to blob
Rec.Barcode.CREATEOUTSTREAM(OStream);
MemoryStream.WriteTo(OStream);
Rec.MODIFY;
Variables used for Barcodes in C/AL
Name | Type | Subtype |
---|---|---|
BarcodeWriter | DotNet | ZXing.BarcodeWriter |
BarcodeFormat | DotNet | ZXing.BarcodeFormat |
BarcodeEncodingOptions | DotNet | ZXing.Common.EncodingOptions |
MemoryStream | DotNet | System.IO.MemoryStream |
Bitmap | DotNet | System.Drawing.Bitmap |
ImageFormat | DotNet | System.Drawing.Imaging.ImageFormat |
OStream | OutStream |
The Result
Read Barcodes
Reading barcodes in ZXing.NET is as easy as creating them. The component will automatically detect the format and return the content.
LOCAL ReadBarcode(VAR pInStream : InStream)
//MemoryStream Instance
MemoryStream := MemoryStream.MemoryStream;
//Copy the NAV InStream to MemoryStream
CopyStream(MemoryStream, pInStream);
//Rewind MemoryStream
MemoryStream.Position := 0;
//Map Barcode to Bitmap
Bitmap := Bitmap.FromStream(MemoryStream);
//Barcode Instance
BarcodeReader := BarcodeReader.BarcodeReader;
//Decode the Barcode
BarcodeResult := BarcodeReader.Decode(Bitmap);
//Get the Result
MESSAGE('Format: %1 - Content: %2', BarcodeResult.BarcodeFormat, BarcodeResult.Text);
Variables
Name | Type | Subtype |
---|---|---|
BarcodeResult | DotNet | ZXing.Result |
BarcodeReader | DotNet | ZXing.BarcodeReader |
MemoryStream | DotNet | System.IO.MemoryStream |
Stream | DotNet | System.IO.Stream |
Bitmap | DotNet | System.Drawing.Bitmap |
Quite an easy way to read and create Barcodes in C/AL.