Reconheça e gere códigos de barras PDF417 usando o VintaSoft Barcode .NET SDK.

Categoria do blog: Código de barras.NET

30.01.2026

O VintaSoft Barcode .NET SDK é um SDK multiplataforma profissional para Windows, Linux e macOS, que permite reconhecer e gerar códigos de barras PDF417 em .NET, WPF, Web e MAUI. Você só precisa de algumas linhas de código para adicionar a capacidade de reconhecer e gerar códigos de barras PDF417 ao seu aplicativo .NET.

O que é um código de barras PDF417?

O código de barras PDF417 é um código de barras 2D multicamadas de alta densidade usado para armazenar grandes quantidades de dados (até 1850 caracteres ou 1108 bytes). Inventado em 1991, é amplamente utilizado em cartões de identificação governamentais, cartões de embarque e na logística. Utiliza um padrão de 4 barras/4 espaços, com 17 elementos por palavra-código, suporta correção de erros integrada e proporciona armazenamento de dados compacto e confiável.

Aqui está a imagem do código de barras PDF417:


O código de barras PDF417 suporta os seguintes modos de armazenamento de dados:

O código de barras PDF417 utiliza o algoritmo de correção de erros Reed-Solomon, que permite reconhecer códigos de barras PDF417 danificados.

O código de barras PDF417 pode codificar os seguintes caracteres especiais:

Estrutura do código de barras PDF417

O código de barras PDF417 consiste em vários módulos, que podem ser divididos em três grupos distintos:



Cada módulo começa com uma coluna preta sólida e termina com uma coluna branca sólida para indicar visualmente onde cada módulo começa e termina. Há também uma área em branco em cada lado do código de barras, conhecida como zona silenciosa.

Os padrões de busca de início e fim indicam as áreas de início e fim do código de barras. Eles ajudam o leitor de código de barras a detectar o código de barras, mas não contêm nenhum dado.

Os indicadores esquerdo e direito contêm informações sobre o código de barras, como o número de linhas no código de barras,o nível de correção de erros, etc.

O módulo de palavras-código de dados contém os dados do código de barras. O tamanho de um código de barras PDF417 depende da quantidade de dados codificados. O módulo de palavras-código de dados pode conter de 1 a 30 palavras-código e de 3 a 90 linhas. Na figura acima, o módulo de palavras-código de dados contém 4 palavras-código por linha, marcadas em roxo. Na figura acima, o módulo de palavras-código de dados consiste em 4 linhas.

Cada palavra-código tem 17 células de comprimento e consiste em 4 faixas pretas e 4 células brancas, daí o nome PDF417. Cada dado palavra-código é lido da esquerda para a direita, de cima para baixo.


O que é o código de barras PDF417 Compact?

O código de barras PDF417 Compact é uma variante do código de barras PDF417 que remove o indicador de posição à direita e o padrão de parada de busca para economizar espaço.
Aqui está uma imagem do código de barras PDF417 Compact:



O que é o código de barras Micro PDF417?

O código de barras Micro PDF417 é uma versão compacta do código de barras PDF417. Os códigos de barras Micro PDF417 são normalmente usados ​​como parte de códigos compostos (como o GS1 DataBar) para rotulagem de produtos, rotulagem de documentos e aplicações na área da saúde:


O código de barras Micro PDF417 suporta os seguintes modos de armazenamento de dados:

O código de barras Micro PDF417 pode codificar os seguintes caracteres especiais:

O que é um código de barras AAMVA?

Código de barras AAMVA (DL/ID Card Design Standard) - este é um código de barras PDF417 que armazena informações da carteira de motorista. O VintaSoft Barcode .NET SDK pode codificar e decodificar dados no formato AAMVA.
Aqui está uma imagem do código de barras AAMVA:



O que é um código de barras PDF417 comprimido por XFA?

O código de barras "PDF417 comprimido por XFA" é um código de barras PDF417 que armazena dados comprimidos de acordo com a especificação Adobe XFA. O VintaSoft Barcode .NET SDK pode gerar e reconhecer códigos de barras "XFA Compressed PDF417".
Aqui está uma imagem do código de barras "XFA Compressed QR":



O caractere especial "Structure Append"

O código de barras PDF417 suporta um caractere especial "Structure Append", que permite que os dados sejam divididos em vários (até 99.999) códigos de barras PDF417. O caractere especial "Structure Append" é codificado dentro do código de barras e permite a identificação exclusiva do número de partes do código de barras e sua ordem.

Aqui está uma imagem de um código de barras PDF417 com o texto: "Para se ajustar a uma área não quadrada ou para lidar com mensagens maiores do que as que são práticas em um único símbolo, uma mensagem de dados pode ser distribuída por vários símbolos. Os símbolos Aztec, Code 16K, DataMatrix, DotCode, MaxiCode, QR Code, PDF417 e Micro PDF417 podem ser concatenados em um formato estruturado."

Aqui estão cinco códigos de barras PDF417 com o mesmo texto, porém em tamanho menor. Esses cinco códigos de barras PDF417 são combinados em um único valor usando o caractere especial "Anexo de Estrutura":

VintaSoft Barcode .NET SDK contém um algoritmo para recuperar dados de um conjunto de partes de código de barras PDF417 que foram separadas usando o caractere especial "Structure Append".


Quais códigos de barras PDF417 podem ser reconhecidos usando o VintaSoft Barcode .NET SDK?

O VintaSoft Barcode .NET SDK reconhece todos os tipos de códigos de barras PDF417: PDF417, PDF417 Compact, Micro PDF417, AAMVA e XFA Compressed PDF417. Algoritmos exclusivos são utilizados para o reconhecimento, permitindo a rápida identificação de códigos de barras em imagens com diversos problemas.



Segue um código C# que demonstra como reconhecer códigos de barras PDF417 em uma imagem capturada por uma câmera:
/// <summary>
/// Reads PDF417 barcodes from a <see cref="System.Drawing.Bitmap"/>.
/// </summary>
/// <param name="bitmap">A bitmap with barcodes.</param>
public static void ReadPdf417BarcodesFromBitmap(System.Drawing.Bitmap bitmap)
{
    // create barcode reader
    using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
    {
        // specify that reader must search for PDF417 barcodes
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.PDF417;

        // read barcodes from image
        Vintasoft.Barcode.IBarcodeInfo[] infos = Vintasoft.Barcode.GdiExtensions.ReadBarcodes(reader, bitmap);

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

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


Segue abaixo um código C# que demonstra como gerar e reconhecer um código de barras AAMVA:
/// <summary>
/// Generates and recognizes AAMVA barcode.
/// </summary>
public static void GenerateAndRecognizeAamvaBarcode()
{
    // create DL data elements
    AamvaDataElement[] dlElements = new AamvaDataElement[] {
        new AamvaDataElement(AamvaDataElementIdentifiers.DAQ, "C12345678"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCS, "CARPENTER"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DDE, "N"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAC, "JON"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DDF, "N"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAD, "T"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DDG, "N"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCA, "D"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCB, "1"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCD, "NONE"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DBD, "10052015"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DBB, "07241984"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DBA, "01092022"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DBC, "1"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAU, "067 in"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAY, "BLK"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAG, "3211 SANCTUARY LANE"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAI, "LOUISVILLE"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAJ, "KY"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DAK, "123454321"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCF, "9876543210123456"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCG, "USA"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DCK, "1234567890123456"),
        new AamvaDataElement(AamvaDataElementIdentifiers.DDB, "01062016")
    };

    // create ZK data elements
    AamvaDataElement[] zkElements = new AamvaDataElement[] {
        new AamvaDataElement("ZKA", "Y"),
        new AamvaDataElement("ZKB", "TEST"),
        new AamvaDataElement("ZKC", "9876"),
        new AamvaDataElement("ZKD", "DUP"),
    };

    // create subfiles
    AamvaSubfile[] subfiles = new AamvaSubfile[]{
        new AamvaSubfile("DL", dlElements),
        new AamvaSubfile("ZK", zkElements)
    };
    
    // create AAMVA barcode value
    AamvaBarcodeValue barcodeValue = new AamvaBarcodeValue(AamvaVersionLevel.AAMVA2016, 636046, 0, subfiles);
    
    // generate barcode image
    using (VintasoftBitmap barcodeImage = GenerateAamvaBarcode(barcodeValue))
    {
        // recognize barcode value
        AamvaBarcodeInfo recognizedBarcode = RecognizeAamvaBarcode(barcodeImage);

        // check value
        if (barcodeValue.ToString() != recognizedBarcode.AamvaValue.ToString())
            throw new ApplicationException();

        // print value
        Console.WriteLine("Version:         {0}", recognizedBarcode.VersionLevel);
        Console.WriteLine("Country:         {0}", recognizedBarcode.CountryId);
        Console.WriteLine("IIN:             {0}", recognizedBarcode.IssuerIdentificationNumber);
        Console.WriteLine("License number:  {0}", recognizedBarcode.LicenseNumber);
        Console.WriteLine("First name:      {0}", recognizedBarcode.FirstName);
        Console.WriteLine("Family name:     {0}", recognizedBarcode.FamilyName);
        Console.WriteLine("Middle name:     {0}", recognizedBarcode.MiddleName);
        Console.WriteLine("Sex (1=M;2=F):   {0}", recognizedBarcode.Sex);
        Console.WriteLine("Eye color:       {0}", recognizedBarcode.EyeColor);            
        Console.WriteLine("Date of birth:   {0}", recognizedBarcode.DateOfBirth.ToShortDateString());
        Console.WriteLine("Issue date:      {0}", recognizedBarcode.IssueDate.ToShortDateString());
        Console.WriteLine("Expiration date: {0}", recognizedBarcode.ExpirationDate.ToShortDateString());
        Console.WriteLine("State code:      {0}", recognizedBarcode.AddressStateCode);
        Console.WriteLine("City:            {0}", recognizedBarcode.AddressCity);
        Console.WriteLine("Postal code:     {0}", recognizedBarcode.AddressPostalCode);
        Console.WriteLine("Street:          {0}", recognizedBarcode.AddressStreet1);
        Console.WriteLine();
        Console.WriteLine("Data elements:");
        foreach (AamvaSubfile subfile in recognizedBarcode.Subfiles)
        {
            Console.WriteLine("[{0}] subfile:", subfile.SubfileType);
            foreach (AamvaDataElement dataElement in subfile.DataElements)
            {
                if (dataElement.Identifier.VersionLevel != AamvaVersionLevel.Undefined)
                    Console.Write("  [{0}] {1}:", dataElement.Identifier.ID, dataElement.Identifier.Description);
                else
                    Console.Write("  [{0}]:", dataElement.Identifier.ID);
                Console.WriteLine(" {0}", dataElement.Value);
            }
        }
    }
}

/// <summary>
/// Generates the AAMVA barcode image.
/// </summary>
/// <param name="barcodeValue">The barcode value.</param>
private static VintasoftBitmap GenerateAamvaBarcode(AamvaBarcodeValue barcodeValue)
{
    // create barcode writer
    using (BarcodeWriter writer = new BarcodeWriter())
    {
        // encode AAMVA barcode to writer settings
        BarcodeSymbologySubsets.AAMVA.Encode(barcodeValue, writer.Settings);

        // generate barcode image
        return writer.GetBarcodeAsVintasoftBitmap();
    }
}

/// <summary>
/// Recognizes the AAMVA barcode from image.
/// </summary>
/// <param name="barcodeImage">The barcode image.</param>
private static AamvaBarcodeInfo RecognizeAamvaBarcode(VintasoftBitmap barcodeImage)
{
    // create barcode reader
    using (BarcodeReader reader = new BarcodeReader())
    {
        // specify that AAMVA barcode must be recognized
        reader.Settings.ScanBarcodeSubsets.Add(BarcodeSymbologySubsets.AAMVA);

        // recognize barcodes
        IBarcodeInfo info = reader.ReadBarcodes(barcodeImage)[0];

        // return information about recognized AAMVA barcode
        return (AamvaBarcodeInfo)info;
    }
}


Aqui está um código C# que demonstra como gerar e reconhecer um código de barras PDF417, que armazena dados compactados de acordo com a especificação Adobe XFA:
/// <summary>
/// Generates PDF417 barcode with XFA compression.
/// </summary>
public void GeneratePdf417BarcodeWithXfaCompression()
{
    string barcodeText =
        "https://www.vintasoft.com/vsbarcode-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vstwain-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vstwain-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsimaging-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsannotation-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vspdf-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsjbig2-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsjpeg2000-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsdoccleanup-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsocr-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsdicom-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsformsprocessing-dotnet-index.html" + System.Environment.NewLine +
        "https://www.vintasoft.com/vsoffice-dotnet-index.html";

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

        // save the barcode image to a file
        barcodeWriter.SaveBarcodeAsImage("pdf417-barcode-with-xfa-compression.png");
    }
}

/// <summary>
/// Recognizes PDF417 barcode with XFA compression.
/// </summary>
public void RecognizePdf417BarcodeWithXfaCompression()
{
    // create barcode reader
    using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
    {
        // specify that reader must search for XFA compressed PDF417 barcodes
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.XFACompressedPDF417);

        // read barcodes from image file
        Vintasoft.Barcode.IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes("pdf417-barcode-with-xfa-compression.png");

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


Quais códigos de barras PDF417 podem ser gerados pelo VintaSoft Barcode .NET SDK?

VintaSoft Barcode .NET SDK gerou todos os tipos de códigos de barras PDF417: PDF417, PDF417 Compact, Micro PDF417, AAMVA, XFA Compressed PDF417.

Aqui está um código C# que demonstra como gerar uma imagem bitmap de um código de barras PDF417:
/// <summary>
/// Returns the PDF417 barcode as <see cref="System.Drawing.Bitmap"/>.
/// </summary>
/// <param name="value">The barcode value.</param>
/// <returns>A <see cref="System.Drawing.Bitmap"/> object.</returns>
public static System.Drawing.Bitmap GetPdf417BarcodeAsBitmap(string value)
{
    // create the barcode writer
    using (Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter())
    {
        // set barcode writer settings
        barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.PDF417;
        barcodeWriter.Settings.Value = value;

        // get a barcode image as System.Drawing.Bitmap
        return Vintasoft.Barcode.GdiExtensions.GetBarcodeAsBitmap(barcodeWriter);
    }
}


Aqui está um código C# que demonstra como gerar uma imagem bitmap de um código de barras Micro PDF417:
/// <summary>
/// Returns the Micro PDF417 barcode as <see cref="System.Drawing.Bitmap"/>.
/// </summary>
/// <param name="value">The barcode value.</param>
/// <returns>A <see cref="System.Drawing.Bitmap"/> object.</returns>
public static System.Drawing.Bitmap GetMicroPdf417BarcodeAsBitmap(string value)
{
    // create the barcode writer
    using (Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter())
    {
        // set barcode writer settings
        barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.MicroPDF417;
        barcodeWriter.Settings.Value = value;

        // get a barcode image as System.Drawing.Bitmap
        return Vintasoft.Barcode.GdiExtensions.GetBarcodeAsBitmap(barcodeWriter);
    }
}


Aqui está um código C# que demonstra como gerar uma imagem vetorial (SVG) de um código de barras PDF417:
/// <summary>
/// Returns the PDF417 barcode in vector form as a SVG string.
/// </summary>
/// <param name="barcodeValue">Barcode value.</param>
public static void GetPdf417BarcodeAsSvgString(string barcodeValue)
{
    // create the barcode writer
    using (Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter())
    {
        // set barcode writer settings
        barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.PDF417;
        barcodeWriter.Settings.Value = barcodeValue;

        // generate PDF417 barcode as a SVG string
        return barcodeWriter.GetBarcodeAsSvgFile();
    }
}