Erkennen und Generieren von PDF417-Barcodes mit dem VintaSoft Barcode .NET SDK

Blog-Kategorie: Barcode.NET

30.01.2026

Das VintaSoft Barcode .NET SDK ist ein professionelles, plattformübergreifendes SDK für Windows, Linux und macOS, mit dem Sie PDF417-Barcodes in .NET, WPF, Web und MAUI erkennen und generieren können. Sie benötigen nur wenige Codezeilen, um Ihrer .NET-Anwendung die Fähigkeit zum Erkennen und Generieren von PDF417-Barcodes hinzuzufügen.

Was ist ein PDF417-Barcode?

Der PDF417-Barcode ist ein hochdichter, mehrschichtiger 2D-Barcode, der zur Speicherung großer Datenmengen (bis zu 1850 Zeichen oder 1108 Byte) verwendet wird. Er wurde 1991 entwickelt und findet breite Anwendung bei amtlichen Ausweisen, Bordkarten und in der Logistik. Er verwendet ein 4-Balken/4-Zwischenraum-Muster mit 17 Elementen pro Codewort, unterstützt integrierte Fehlerkorrektur und bietet eine kompakte und zuverlässige Datenspeicherung.

Hier ist das Bild des PDF417-Barcodes:


Der PDF417-Barcode unterstützt die folgenden Datenspeichermodi:

Der PDF417-Barcode verwendet den Reed-Solomon-Fehlerkorrekturalgorithmus, der es uns ermöglicht, beschädigte PDF417-Barcodes zu erkennen.

Der PDF417-Barcode kann die folgenden Sonderzeichen kodieren:

PDF417-Barcodestruktur

Der PDF417-Barcode besteht aus mehreren Modulen, die in drei Gruppen unterteilt werden können:



Jedes Modul beginnt mit einer schwarzen und endet mit einer weißen Spalte, um Anfang und Ende visuell zu kennzeichnen. Zusätzlich befindet sich auf beiden Seiten des Barcodes ein leerer Bereich, die sogenannte Ruhezone.

Die Start- und Stoppsuchmuster markieren den Anfang und das Ende des Barcodes. Sie helfen dem Barcode-Scanner, den Barcode zu erkennen, enthalten aber keine Daten.

Die linken und rechten Indikatoren enthalten Informationen über den Barcode, wie z. B. die Anzahl der Zeilen im Barcode, den Fehlerkorrekturgrad usw.

Das Datencodewortmodul enthält die Barcodedaten. Die Größe eines PDF417-Barcodes hängt von der Menge der kodierten Daten ab. Das Datencodewortmodul kann 1 bis 30 Codewörter und 3 bis 90 Zeilen enthalten. In der obigen Abbildung enthält das Datencodewortmodul enthält 4 Codewörter pro Zeile, die lila markiert sind. In der obigen Abbildung enthält das Datencodewortmodul besteht es aus 4 Zeilen.

Jedes Codewort ist 17 Zellen lang und besteht aus 4 schwarzen Streifen und 4 weißen Zellen, daher der Name PDF417. Jedes Datenelement Codewort wird von links nach rechts und von oben nach unten gelesen.


Was ist der PDF417 Compact Barcode?

Der PDF417 Compact Barcode ist eine Variante des PDF417 Barcodes, bei der der Rechtsindikator und das Stoppsuchmuster entfernt wurden, um Platz zu sparen.
Hier ist ein Bild des PDF417 Compact Barcodes:



Was ist der Micro PDF417 Barcode?

Der Micro PDF417 Barcode ist eine kompakte Version des PDF417 Barcodes. Micro-PDF417-Barcodes werden typischerweise als Teil von zusammengesetzten Codes (wie z. B. GS1 DataBar) für Produktkennzeichnung, Dokumentenkennzeichnung und Anwendungen im Gesundheitswesen verwendet:


Der Micro-PDF417-Barcode unterstützt die folgenden Datenspeichermodi:

Der Micro-PDF417-Barcode kann die folgenden Sonderzeichen kodieren:

Was ist ein AAMVA-Barcode?

AAMVA (DL/ID Card Design Standard) Barcode - dies ist ein PDF417-Barcode, der Führerscheininformationen speichert. Das VintaSoft Barcode .NET SDK kann Daten im AAMVA-Format kodieren und dekodieren.
Hier ist ein Bild des AAMVA-Barcodes:



Was ist ein XFA-komprimierter PDF417-Barcode?

Der Barcode "XFA Compressed PDF417" ist ein PDF417-Barcode, der Daten gemäß der Adobe XFA-Spezifikation komprimiert speichert. Das VintaSoft Barcode .NET SDK kann "XFA Compressed PDF417"-Barcodes generieren und erkennen.
Hier ist ein Bild des "XFA Compressed QR"-Barcodes:



Das Sonderzeichen "Structure Append"

Der PDF417-Barcode unterstützt das Sonderzeichen "Structure Append", mit dem Daten in bis zu 99.999 PDF417-Barcodes aufgeteilt werden können. Das Sonderzeichen "Structure Append" ist im Barcode kodiert und ermöglicht die eindeutige Identifizierung der Anzahl der Barcode-Teile und ihrer Reihenfolge.

Hier ist ein Bild eines PDF417-Barcodes mit dem Text: "Um einen nicht-quadratischen Bereich auszufüllen oder größere Nachrichten zu verarbeiten, als in einem einzelnen Symbol praktikabel sind, kann eine Datennachricht auf mehrere Symbole verteilt werden. Aztec-, Code-16K-, DataMatrix-, DotCode-, MaxiCode-, QR-Code-, PDF417- und Micro-PDF417-Symbole können in einem strukturierten Format aneinandergereiht werden.":

Und hier sind fünf PDF417-Barcodes mit demselben Text, jedoch in kleinerer Größe. Diese fünf PDF417-Barcodes werden mithilfe des Sonderzeichens "Struktur anhängen" zu einem einzigen Wert kombiniert.:

VintaSoft Barcode .NET SDK enthält einen Algorithmus zur Wiederherstellung von Daten aus einem Satz von PDF417-Barcode-Teilen, die mithilfe des Sonderzeichens "Struktur anhängen" getrennt wurden.


Welche PDF417-Barcodes können mit dem VintaSoft Barcode .NET SDK erkannt werden?

Das VintaSoft Barcode .NET SDK kann alle Arten von PDF417-Barcodes erkennen: PDF417, PDF417 Compact, Micro PDF417, AAMVA,und XFA-komprimiertes PDF417. Für die Erkennung werden einzigartige Algorithmen verwendet, die eine schnelle Erkennung von Barcodes in Bildern mit verschiedenen Problemen ermöglichen:



Hier ist C#-Code, der zeigt, wie PDF417-Barcodes in einem mit einer Kamera aufgenommenen Bild erkannt werden:
/// <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();
            }
        }
    }
}


Hier ist C#-Code, der zeigt, wie ein AAMVA-Barcode generiert und erkannt wird:
/// <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;
    }
}


Hier ist C#-Code, der zeigt, wie ein PDF417-Barcode generiert und erkannt wird, der Daten speichert, die gemäß der Adobe XFA-Spezifikation komprimiert sind:
/// <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();
            }
        }
    }
}


Welche PDF417-Barcodes kann das VintaSoft Barcode .NET SDK generieren?

VintaSoft Barcode .NET SDK generierte alle Arten von PDF417-Barcodes: PDF417, PDF417 Compact, Micro PDF417, AAMVA, XFA Compressed PDF417.

Hier ist C#-Code, der zeigt, wie man ein Bitmap-Bild eines PDF417-Barcodes generiert:
/// <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);
    }
}


Hier ist C#-Code, der zeigt, wie man ein Bitmap-Bild eines Micro-PDF417-Barcodes generiert:
/// <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);
    }
}


Hier ist C#-Code, der zeigt, wie man ein Vektorbild (SVG) eines PDF417-Barcodes generiert:
/// <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();
    }
}