Генерация 2D штрих-кодов с XFA сжатием в .NET

Категория: Штрих-коды.NET

16 июня 2020

Данные штрих-кода, которые содержат повторяющиеся последовательности символов (например список серийных номеров, XML данные, веб-адреса и т.д.), могут быть уменьшены в размере, если данные штрих-кода сжать с помощью алгоритма компрессии данных Flate (ZIP).

Уменьшить размер данных штрих-кода может потребоваться, если нужно:
VintaSoft Barcode .NET SDK предоставляет 2 способа для сжатия данных двумерного штрих-кода.

ВАРИАНТ 1: Сжать данные самостоятельно и сгенерировать двумерный штрих-код с сжатыми бинарными данными. Это возможно потому что все двумерные штрих-коды позволяют хранить бинарные данные (подробную информацию смотрите в классе Vintasoft.Barcode.BarcodeInfo.BinaryValueItem).

ВАРИАНТ 2: Сгенерировать двумерный штрих-код в соответствии с спецификацией XML Forms Architecture (XFA). В данном случае данные штрих-кода будут сжаты с помощью алгоритма сжатия "DEFLATE Compressed Data Format" (RFC1951).


В данной статье мы покажем, как сгенерировать двумерные штрих-коды в соответствии с спецификацией XML Forms Architecture (XFA).

VintaSoft Barcode .NET SDK предоставляет классы, которые позволяют легко создавать и распознавать штрих-коды с XFA сжатием данных:

Вот C# код, который позволяет создать Aztec штрих-код с данными сжатыми в соответствии с XFA спецификацией:
/// <summary>
/// Generates Aztec barcode with XFA compression.
/// </summary>
public void GenerateAztecBarcodeWithXfaCompression()
{
    string barcodeText =
        "https://www.vintasoft.ru/vsbarcode-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsimaging-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsannotation-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vspdf-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjbig2-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjpeg2000-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdoccleanup-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsocr-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdicom-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsformsprocessing-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsoffice-dotnet-index.html";

    // create the barcode writer
    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();

    // create the XFA compressed Aztec barcode symbology
    Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedAztecBarcodeSymbology xfaCompressedAztecBarcodeSymbology =
        new Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedAztecBarcodeSymbology();
    // encode barcode text using XFA compressed Aztec barcode symbology
    xfaCompressedAztecBarcodeSymbology.Encode(barcodeText, barcodeWriter.Settings);

    // get barcode as image
    using (System.Drawing.Image barcodeImage = barcodeWriter.GetBarcodeAsBitmap())
    {
        // save the barcode image to a file
        barcodeImage.Save("aztec-barcode-with-xfa-compression.png");
    }
}

Вот изображение Aztec штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией:
Изображение Aztec штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией
Вот изображение Aztec штрих-кода, который содержит список URL адресов в виде не сжатого текста:
Изображение Aztec штрих-кода, который содержит список URL адресов в виде не сжатого текста

Вот C# код, который позволяет создать DataMatrix штрих-код, который содержит данные сжатые в соответствии с XFA спецификацией:
/// <summary>
/// Generates DataMatrix barcode with XFA compression.
/// </summary>
public void GenerateDataMatrixBarcodeWithXfaCompression()
{
    string barcodeText =
        "https://www.vintasoft.ru/vsbarcode-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsimaging-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsannotation-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vspdf-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjbig2-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjpeg2000-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdoccleanup-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsocr-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdicom-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsformsprocessing-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsoffice-dotnet-index.html";

    // create the barcode writer
    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();

    // create the XFA compressed DataMatrix barcode symbology
    Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedDataMatrixBarcodeSymbology xfaCompressedDataMatrixBarcodeSymbology =
        new Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedDataMatrixBarcodeSymbology();
    // encode barcode text using XFA compressed DataMatrix barcode symbology
    xfaCompressedDataMatrixBarcodeSymbology.Encode(barcodeText, barcodeWriter.Settings);

    // get barcode as image
    using (System.Drawing.Image barcodeImage = barcodeWriter.GetBarcodeAsBitmap())
    {
        // save the barcode image to a file
        barcodeImage.Save("dataMatrix-barcode-with-xfa-compression.png");
    }
}

Вот изображение DataMatrix штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией:
Изображение DataMatrix штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией
Вот изображение DataMatrix штрих-кода, который содержит список URL адресов в виде не сжатого текста:
Изображение DataMatrix штрих-кода, который содержит список URL адресов в виде не сжатого текста

Вот C# код, который позволяет создать PDF417 штрих-код, который содержит данные сжатые в соответствии с XFA спецификацией:
/// <summary>
/// Generates PDF417 barcode with XFA compression.
/// </summary>
public void GeneratePdf417BarcodeWithXfaCompression()
{
    string barcodeText =
        "https://www.vintasoft.ru/vsbarcode-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsimaging-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsannotation-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vspdf-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjbig2-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjpeg2000-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdoccleanup-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsocr-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdicom-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsformsprocessing-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsoffice-dotnet-index.html";

    // create the barcode writer
    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();

    // create the XFA compressed PDF417 barcode symbology
    Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedPDF417BarcodeSymbology xfaCompressedPdf417BarcodeSymbology =
        new Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedPDF417BarcodeSymbology();
    // encode barcode text using XFA compressed PDF417 barcode symbology
    xfaCompressedPdf417BarcodeSymbology.Encode(barcodeText, barcodeWriter.Settings);

    // get barcode as image
    using (System.Drawing.Image barcodeImage = barcodeWriter.GetBarcodeAsBitmap())
    {
        // save the barcode image to a file
        barcodeImage.Save("pdf417-barcode-with-xfa-compression.png");
    }
}

Вот изображение PDF417 штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией:
Изображение PDF417 штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией
Вот изображение PDF417 штрих-кода, который содержит список URL адресов в виде не сжатого текста:
Изображение PDF417 штрих-кода, который содержит список URL адресов в виде не сжатого текста

Вот C# код, который позволяет создать QR штрих-код, который содержит данные сжатые в соответствии с XFA спецификацией:
/// <summary>
/// Generates QR barcode with XFA compression.
/// </summary>
public void GenerateQrCodeBarcodeWithXfaCompression()
{
    string barcodeText =
        "https://www.vintasoft.ru/vsbarcode-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vstwain-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsimaging-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsannotation-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vspdf-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjbig2-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsjpeg2000-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdoccleanup-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsocr-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsdicom-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsformsprocessing-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.ru/vsoffice-dotnet-index.html";

    // create the barcode writer
    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();

    // create the XFA compressed QR barcode symbology
    Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedQRCodeBarcodeSymbology xfaCompressedQrCodeBarcodeSymbology =
        new Vintasoft.Barcode.SymbologySubsets.XFACompressed.XFACompressedQRCodeBarcodeSymbology();
    // encode barcode text using XFA compressed QR barcode symbology
    xfaCompressedQrCodeBarcodeSymbology.Encode(barcodeText, barcodeWriter.Settings);

    // get barcode as image
    using (System.Drawing.Image barcodeImage = barcodeWriter.GetBarcodeAsBitmap())
    {
        // save the barcode image to a file
        barcodeImage.Save("qr-barcode-with-xfa-compression.png");
    }
}

Вот изображение QR штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией:
Изображение QR штрих-кода, который содержит список URL адресов сжатый в соответствии с XFA спецификацией
Вот изображение QR штрих-кода, который содержит список URL адресов в виде не сжатого текста:
Изображение QR штрих-кода, который содержит список URL адресов в виде не сжатого текста


Вот C# код, который позволяет распознать двумерные штрих-коды сгенерированные в соответствии с XFA спецификацией:
/// <summary>
/// Recognizes 2D barcode with XFA compressed data.
/// </summary>
/// <param name="barcodeImageFile">A path to a barcode image file.</param>
public void Recognize2DBarcodeWithXfaCompressedData(string barcodeImageFile)
{
    // create barcode reader
    using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
    {
        // specify that reader must search for XFA compressed Aztec barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.XFACompressedAztec);
        // specify that reader must search for XFA compressed DataMatrix barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.XFACompressedDataMatrix);
        // specify that reader must search for XFA compressed PDF417 barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.XFACompressedPDF417);
        // specify that reader must search for XFA compressed QR barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.XFACompressedQRCode);

        // specify that reader must search for horizontal barcodes only
        reader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal;

        // read barcodes from image file
        Vintasoft.Barcode.IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes(barcodeImageFile);

        // if barcodes are not detected
        if (barcodeInfos.Length == 0)
        {
            System.Console.WriteLine("Barcodes are not found.");
        }
        // if barcodes are detected
        else
        {
            // get information about recognized barcodes

            System.Console.WriteLine(string.Format("{0} barcode(s) found:", barcodeInfos.Length));
            System.Console.WriteLine();
            for (int i = 0; i < barcodeInfos.Length; i++)
            {
                Vintasoft.Barcode.IBarcodeInfo barcodeInfo = barcodeInfos[i];
                System.Console.WriteLine(string.Format("[{0}:{1}]", i + 1, barcodeInfo.BarcodeType));
                System.Console.WriteLine(string.Format("Value:      {0}", barcodeInfo.Value));
                System.Console.WriteLine(string.Format("Region:     {0}", barcodeInfo.Region));
                System.Console.WriteLine();
            }
        }
    }
    System.Console.WriteLine();
    System.Console.WriteLine();
}


Необходимо отметить что сжатие Flate (ZIP) может увеличить объем данных, если имеется небольшая избыточность данных или если поток данных является слишком коротким.