Generate and recognize barcodes in AWS Lambda

Blog category: Barcode.NET

May 22, 2020

AWS Lambda is an event-driven, serverless computing platform provided by Amazon as a part of Amazon Web Services.

This tutorial shows how to create AWS Lambda project in Visual Studio .NET 2017, generate DataMatrix barcode image and recognize DataMatrix barcode in generated image in AWS Lambda function.

First, we have to open Visual Studio 2017 and create new AWS Lambda project:
Create AWS Lambda project in Visual Studio

Next, we need to specify that simple SQS function must be used as content for AWS Lambda function:
Use simple SQS function as content for AWS Lambda function in Visual Studio

Here is a created AWS Lambda project in Visual Studio 2017:
AWS Lambda project in Visual Studio



Next, we have to add references to System.Drawing.Common nuget-package and Vintasoft.Barcode.dll for .NET Core.
System.Drawing.Common is necessary for Vintasoft.Barcode assembly. Vintasoft.Barcode assembly is necessary for generating and recognizing of barcodes.
Add Vintasoft.Barcode.dll to AWS Lambda project in Visual Studio



Next, we need to open the code of AWS Lambda function:
Open code of AWS Lambda function in Visual Studio

Next, we need to add the code for barcode generation and recognition to the AWS Lambda function:
C# code for barcode generation and recognition using AWS Lambda function

Here is the C# code of AWS Lambda function, which allows to generate image with DataMatrix barcode and recognize barcode in generated image:
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: Amazon.Lambda.Core.LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda1
{
    public class Function
    {

        /// <summary>
        /// Default constructor. This constructor is used by Lambda to construct the instance. When invoked in a Lambda environment
        /// the AWS credentials will come from the IAM role associated with the function and the AWS region will be set to the
        /// region the Lambda function is executed in.
        /// </summary>
        public Function()
        {
        }



        /// <summary>
        /// This method is called for every Lambda invocation. This method takes in an SQS event object and can be used
        /// to respond to SQS messages.
        /// </summary>
        public async System.Threading.Tasks.Task FunctionHandler(Amazon.Lambda.SQSEvents.SQSEvent evnt, Amazon.Lambda.Core.ILambdaContext context)
        {
            foreach (var message in evnt.Records)
            {
                await ProcessMessageAsync(message, context);
            }
        }

        private async System.Threading.Tasks.Task ProcessMessageAsync(Amazon.Lambda.SQSEvents.SQSEvent.SQSMessage message, Amazon.Lambda.Core.ILambdaContext context)
        {
            context.Logger.LogLine($"Processed message {message.Body}");

            try
            {
                // create memory stream, where image with barcode will be stored
                using (System.IO.MemoryStream mem = new System.IO.MemoryStream())
                {
                    // create the barcode writer
                    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
                    // specify that DataMatrix barcode must be created
                    barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.DataMatrix;
                    // specify the barcode value
                    barcodeWriter.Settings.Value = "1234567890987654321";
                    // generate barcode image and save to the memory stream as PNG file
                    barcodeWriter.SaveBarcodeAsImage(mem, Vintasoft.Barcode.BarcodeImageFormat.Png);

                    // create the barcode reader
                    using (Vintasoft.Barcode.BarcodeReader barcodeReader = new Vintasoft.Barcode.BarcodeReader())
                    {
                        // specify that reader must search for DataMatrix barcodes
                        barcodeReader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.DataMatrix;
                        // specify that reader must search horizontal barcodes only
                        barcodeReader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal;

                        // read barcodes from image
                        Vintasoft.Barcode.IBarcodeInfo[] infos = barcodeReader.ReadBarcodes(mem);

                        // if barcodes are not detected
                        if (infos.Length == 0)
                        {
                            context.Logger.LogLine($"No barcodes found.");
                        }
                        // if barcodes are detected
                        else
                        {
                            // get information about searched barcodes

                            for (int i = 0; i &lt; infos.Length; i++)
                            {
                                Vintasoft.Barcode.IBarcodeInfo info = infos[i];
                                context.Logger.LogLine(string.Format("Barcode: Type={0}, Value={1}", info.BarcodeType, info.Value));
                            }
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                context.Logger.LogLine(string.Format("Error: {0}", ex.Message));
            }

            await System.Threading.Tasks.Task.CompletedTask;
        }
    }
}



Finally, we need to run our AWS Lambda function in AWS .NET Mock Lambda Test Tool:
Run AWS Lambda function in AWS .NET Mock Lambda Test Tool

Send a SQS request to our AWS Lambda function:
Send a SQS request to our AWS Lambda function

And see the result of barcode recognition using AWS Lambda function:
Result of barcode recognition using AWS Lambda function