Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

AWS vs Google Vision (OCR-Funktionen Vergleich)

Dynamsoft Label Recognizer kann eine Sache außergewöhnlich gut – die Extraktion von MRZ-Nummern aus Reisepässen, das Scannen von Fahrzeugidentifikationsnummern (VIN) und das Lesen strukturierter Etiketten von Industrieverpackungen – und weigert sich, irgendetwas anderes zu tun. Diese enge Expertise wird zum Budgetproblem, sobald Ihre Anwendung zusätzlich eine allgemeine Dokumenten-OCR benötigt, denn dann lizenzieren Sie Dynamsoft Label Recognizerfür MRZ, Dynamsoft Barcode Reader für QR-Codes, Dynamsoft Document Normalizer für die Kantenerkennung und suchen immer noch nach einer vierten Bibliothek zur Verarbeitung von Dokumenten im Vollseitenformat. IronOCR deckt all diese Fähigkeiten in einem einzigen NuGet-Paket bei $999 unbefristet ab.

Dynamsoft Label Recognizerverstehen

Die Dynamsoft Corporation mit Hauptsitz in Vancouver, Kanada, entwickelte ihr Produkt Label Recognizer um ein spezifisches Versprechen herum: die zuverlässige Erkennung von maschinenlesbarem, strukturiertem Text in eingeschränkten Formaten. Das Produkt NuGet-Paket ist Dynamsoft.DotNet.LabelRecognizer, und seine kommerzielle Lizenzierung basiert ausschließlich auf Jahresabonnements – es gibt keine unbefristete Option. Kontaktieren Sie Dynamsoft für aktuelle Preisinformationen.

Das Erkennungsmodell der Bibliothek ist vorlagenbasiert. Sie konfigurieren Erkennungsaufgaben über eine JSON-Einstellungs-API (AppendSettingsFromString) und rufen dann RecognizeFile oder RecognizeByFile für Bilddateien auf. Die Ergebnisse werden als Sammlungen von Zeilenergebnissen zurückgegeben, die unformatierte Textzeichenfolgen enthalten. Das Parsen dieser Zeichenketten in aussagekräftige strukturierte Daten – Feld-Offsets, Datumskonvertierungen, Prüfziffernvalidierung – liegt vollständig in Ihrer Verantwortung.

Wichtigste architektonische Merkmale des Dynamsoft Label Recognizers:

  • Vorlagenbasierte Erkennungs-Engine: MRZ-, VIN- und Etikettenmuster erfordern eine JSON-Vorlagenkonfiguration vor der Erkennung.
  • Nur Rohtextausgabe: RecognizeFile gibt LineResult-Objekte mit Textzeichenketten zurück; kein Parsing strukturierter Felder
  • Nur Bildeingabe: Keine native PDF-Unterstützung; PDFs müssen vor der Weiterverarbeitung extern in Bilder konvertiert werden.
  • Jährliche Abonnement-Lizenzierung: Pro-Gerät und Pro-Server-Stufen verfügbar; Kontaktieren Sie Dynamsoft für aktuelle Preisinformationen; no one-time purchase
  • Separates Produkt pro Funktion: Barcode-Lesung, Dokumentennormalisierung und Kameraoptimierung erfordern jeweils ein separat lizenziertes Produkt.
  • Eingeschränkte Sprachabdeckung: Schwerpunkt auf MRZ-Formaten mit lateinischen Zeichen; es fehlt eine breite Unterstützung für mehrsprachige Dokumente

Die JSON Runtime Settings API

Jeder Workflow von Dynamsoft Label Recognizerbeginnt mit einem Konfigurationsschritt für eine Vorlage. Die MRZ-Erkennung erfordert beispielsweise das Laden eines JSON-Dokuments, das Erkennungsparameter, Zeichenmodelle und Regionsreferenzen deklariert, bevor die Bildverarbeitung erfolgen kann:

using Dynamsoft.DLR;

public class DynamsoftMrzService : IDisposable
{
    private readonly LabelRecognizer _recognizer;

    public DynamsoftMrzService(string licenseKey)
    {
        // Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey);
        _recognizer = new LabelRecognizer();

        // MRZ requires specific template configuration loaded as JSON
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _recognizer.AppendSettingsFromString(mrzTemplate);
    }

    public string ExtractRawMrz(string passportImagePath)
    {
        var results = _recognizer.RecognizeFile(passportImagePath);

        // Returns raw MRZ text lines only — no field parsing
        var mrzLines = new StringBuilder();
        foreach (var result in results)
        {
            foreach (var lineResult in result.LineResults)
            {
                mrzLines.AppendLine(lineResult.Text);
            }
        }
        return mrzLines.ToString().Trim();
    }

    public void Dispose() => _recognizer?.Dispose();
}
using Dynamsoft.DLR;

public class DynamsoftMrzService : IDisposable
{
    private readonly LabelRecognizer _recognizer;

    public DynamsoftMrzService(string licenseKey)
    {
        // Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey);
        _recognizer = new LabelRecognizer();

        // MRZ requires specific template configuration loaded as JSON
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _recognizer.AppendSettingsFromString(mrzTemplate);
    }

    public string ExtractRawMrz(string passportImagePath)
    {
        var results = _recognizer.RecognizeFile(passportImagePath);

        // Returns raw MRZ text lines only — no field parsing
        var mrzLines = new StringBuilder();
        foreach (var result in results)
        {
            foreach (var lineResult in result.LineResults)
            {
                mrzLines.AppendLine(lineResult.Text);
            }
        }
        return mrzLines.ToString().Trim();
    }

    public void Dispose() => _recognizer?.Dispose();
}
Imports Dynamsoft.DLR
Imports System.Text

Public Class DynamsoftMrzService
    Implements IDisposable

    Private ReadOnly _recognizer As LabelRecognizer

    Public Sub New(licenseKey As String)
        ' Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey)
        _recognizer = New LabelRecognizer()

        ' MRZ requires specific template configuration loaded as JSON
        Dim mrzTemplate As String = "{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }"
        _recognizer.AppendSettingsFromString(mrzTemplate)
    End Sub

    Public Function ExtractRawMrz(passportImagePath As String) As String
        Dim results = _recognizer.RecognizeFile(passportImagePath)

        ' Returns raw MRZ text lines only — no field parsing
        Dim mrzLines As New StringBuilder()
        For Each result In results
            For Each lineResult In result.LineResults
                mrzLines.AppendLine(lineResult.Text)
            Next
        Next
        Return mrzLines.ToString().Trim()
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _recognizer?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Die Ausgabe von RecognizeFile ist roher MRZ-Text wie P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<. Um Surname = "SMITH", GivenNames = "JOHN", DocumentNumber, DateOfBirth und ExpiryDate als typisierte Eigenschaften zu erhalten, implementieren Sie einen TD1/TD2/TD3-Parser selbst. Die Dynamsoft-Dokumentation und Quelldateien in diesem Repository schätzen diesen Parser auf ungefähr 150 Zeilen Parsing-Code — zur Bearbeitung von Zeichenversätzen, << Namensseparatoren, zweistelliger Jahreszahlauflösung und Prüfziffernvalidierung — von denen nichts Dynamsoft bereitstellt.

IronOCR verstehen

IronOCR ist eine kommerzielle .NET OCR-Bibliothek, die auf einer optimierten Tesseract 5-Engine basiert und über eine verwaltete API-Schicht verfügt, die Vorverarbeitung, Eingabeformate, strukturierte Ausgabe und spezialisiertes Dokumentenparsing übernimmt. Die Installation ist ein einziger NuGet-Befehl: dotnet add package IronOcr. Keine native Binärverwaltung, keine Einrichtung des Tessdata-Ordners, keine Vorlagenkonfigurationsdateien.

Hauptmerkmale:

  • Universell und spezialisiert: Verarbeitet OCR für ganze Dokumentseiten, mehrseitige PDFs, Stapel gescannter Bilder und Spezialformate (Pässe, Barcodes, Kfz-Kennzeichen) aus demselben Paket
  • Automatische Vorverarbeitungspipeline: Entzerren, Rauschen entfernen, Kontrast anpassen, Binarisieren und Auflösen verbessern werden ohne manuelle Konfiguration bei Eingaben minderer Qualität ausgeführt.
  • Native PDF-Unterstützung: Gescannte und digitale PDFs, einschließlich passwortgeschützter Dateien, können direkt und ohne externe Konvertierungsschritte gelesen werden.
  • Strukturierte Ausgabehierarchie: Die Ergebnisse zeigen Seiten, Absätze, Zeilen, Wörter und Zeichenbegrenzungsrahmen mit Konfidenzwerten an.
  • Eingebaute Barcodescanner: Aktivieren Sie ocr.Configuration.ReadBarCodes = true und Barcodes werden gleichzeitig mit Text im gleichen Durchlauf extrahiert
  • Mehr als 125 Sprachpakete: Jede Sprache wird als separates NuGet Paket installiert; keine Verwaltung von Testdatenordnern erforderlich
  • Unbefristete Lizenzierung: $999 Lite, $1,499 Plus, $2,999 Professional — einmaliger Kauf, alle Plattformen, alle Funktionen enthalten
  • Plattformübergreifende Bereitstellung: Windows, Linux, macOS, Docker, AWS und Azure funktionieren alle mit demselben Paket ohne plattformspezifische Konfiguration.

Funktionsvergleich

Feature Dynamsoft Label Recognizer IronOCR
Allgemeines Dokument OCR Nicht unterstützt Volle Unterstützung
MRZ-Extraktion Spezialisiert (Rohtext) Eingebaut mit analysierten Feldern
Native PDF-Eingabe Nicht unterstützt Ja
Barcode-Lesung Separates Produkt (Dynamsoft Barcode-Lesegerät) Eingebaut (ReadBarCodes)
Durchsuchbare PDF-Ausgabe Nicht unterstützt Ja
Sprachunterstützung Beschränkt (lateinisch MRZ) 125+ Sprachen
Lizenzierungsmodell Nur Jahresabonnement Dauerlizenz + Abonnementoptionen
Für eine vollständige Abdeckung benötigte Produkte Ab 3 Jahren 1

Detaillierter Funktionsvergleich

Feature Dynamsoft Label Recognizer IronOCR
Erkennungsbereich
Allgemeines Dokument OCR Nicht unterstützt Ja
MRZ-Erkennung Spezialisiert Ja (ReadPassport)
VIN-Erkennung Spezialisiert Ja (mittels Standard-OCR)
Lesen von Industrieetiketten Spezialisiert Ja
Handschrifterkennung Nicht unterstützt Ja
Tabellenextraktion Nicht unterstützt Ja
Eingabeformate
Bilddateien (JPG, PNG, TIFF) Ja Ja
PDF (nativ) Nicht unterstützt Ja
Passwortgeschütztes PDF Nicht unterstützt Ja
Byte-Array / Datenstrom Ja Ja
Mehrseitige Dokumente Manuelle Aggregation Ja (Muttersprachler)
Ausgabeformate
Klartext Ja (Rohlinien) Ja
Strukturierte Felder (geparst) Nicht angegeben Ja (Seiten, Zeilen, Wörter)
Durchsuchbares PDF Nicht unterstützt Ja
hOCR Nicht unterstützt Ja
Konfidenzwerte Pro Zeile Pro Wort, Zeile und Seite
Vorverarbeitung
Automatische Vorverarbeitung Basic Ja (intelligente Pipeline)
Schrägstellungs-/Rotationskorrektur Beschränkt Ja
Rauschunterdrückung Beschränkt Ja
Kontrastverbesserung Beschränkt Ja
DPI-Normalisierung Nicht angegeben Ja
Integrationsfähigkeit
Barcode-Lesung Separates Produkt Eingebaut
Dokumentennormalisierung Separates Produkt Nicht erforderlich
Regionsbasierte OCR Ja (über Vorlagen) Ja (CropRectangle)
Threadsichere Parallelverarbeitung Ja Ja
Plattform und Bereitstellung
Windows Ja Ja
Linux Ja Ja
macOS Ja Ja
Docker Ja Ja
Azure / AWS Ja Ja
Air-Gap / Offline Ja Ja
Lizenzierung und Kosten
Jahresabonnement Ja (kontaktieren Sie Dynamsoft für Preise) Optional
Unbefristete Lizenz Nicht verfügbar Ja ($999 einmalig)
Alle Funktionen in einem Paket Nein (3+ Produkte) Ja
Kostenlose Testversion 30 Tage Ja

Spezialisierter vs. generalistischer Aufgabenbereich

Die wichtigste architektonische Entscheidung von Dynamsoft war die Entwicklung eines Spezialisten anstelle eines Generalisten. Diese Entscheidung hat direkte Auswirkungen auf jede Anwendung, die mit MRZ oder Label-Lesung beginnt, aber später mehr benötigt.

Dynamsoft-Ansatz

Dynamsoft Label Recognizer verarbeitet genau das, was seine JSON-Vorlagen beschreiben, und nichts darüber hinaus. Eine auf Dynamsoft basierende Passbearbeitungsanwendung benötigt drei Produkte, bevor sie einen realen Dokumentenworkflow bewältigen kann:

// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED

using Dynamsoft.DLR;  // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR;  // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)

public class DynamsoftPassportProcessor : IDisposable
{
    private readonly LabelRecognizer _mrzRecognizer;
    private readonly BarcodeReader _barcodeReader;
    // private readonly SomeOtherOcrLibrary _fullTextOcr;  // third product

    public DynamsoftPassportProcessor(
        string mrzLicenseKey,
        string barcodeLicenseKey)
    {
        // License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey);
        _mrzRecognizer = new LabelRecognizer();

        // Configure MRZ template — JSON required before any recognition
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate);

        // Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();
    }

    public PassportResult ProcessPassport(string imagePath)
    {
        // Step 1: MRZ-Extraktion — raw text only, no field parsing
        var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
        var mrzText = new StringBuilder();
        foreach (var r in mrzResults)
            foreach (var line in r.LineResults)
                mrzText.AppendLine(line.Text);

        // Step 2: Parse MRZ manually — your 150-line TD3 parser here
        var parsedMrz = ParseMrzManually(mrzText.ToString());

        // Step 3: Barcodes — second product, second API
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);

        // Step 4: Full page text — THIRD library, no Dynamsoft option
        // var fullText = _fullTextOcr.ReadImage(imagePath);

        return new PassportResult
        {
            ParsedMrz = parsedMrz,
            Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
            FullPageText = null  // requires a fourth product
        };
    }

    public void Dispose()
    {
        _mrzRecognizer?.Dispose();
        _barcodeReader?.Dispose();
    }
}
// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED

using Dynamsoft.DLR;  // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR;  // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)

public class DynamsoftPassportProcessor : IDisposable
{
    private readonly LabelRecognizer _mrzRecognizer;
    private readonly BarcodeReader _barcodeReader;
    // private readonly SomeOtherOcrLibrary _fullTextOcr;  // third product

    public DynamsoftPassportProcessor(
        string mrzLicenseKey,
        string barcodeLicenseKey)
    {
        // License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey);
        _mrzRecognizer = new LabelRecognizer();

        // Configure MRZ template — JSON required before any recognition
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate);

        // Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();
    }

    public PassportResult ProcessPassport(string imagePath)
    {
        // Step 1: MRZ-Extraktion — raw text only, no field parsing
        var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
        var mrzText = new StringBuilder();
        foreach (var r in mrzResults)
            foreach (var line in r.LineResults)
                mrzText.AppendLine(line.Text);

        // Step 2: Parse MRZ manually — your 150-line TD3 parser here
        var parsedMrz = ParseMrzManually(mrzText.ToString());

        // Step 3: Barcodes — second product, second API
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);

        // Step 4: Full page text — THIRD library, no Dynamsoft option
        // var fullText = _fullTextOcr.ReadImage(imagePath);

        return new PassportResult
        {
            ParsedMrz = parsedMrz,
            Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
            FullPageText = null  // requires a fourth product
        };
    }

    public void Dispose()
    {
        _mrzRecognizer?.Dispose();
        _barcodeReader?.Dispose();
    }
}
Imports Dynamsoft.DLR  ' Label Recognizer — for MRZ (annual subscription)
Imports Dynamsoft.DBR  ' Barcode Reader — for any barcodes (additional license)
' Plus: a separate OCR library — for full page text (more budget)

Public Class DynamsoftPassportProcessor
    Implements IDisposable

    Private ReadOnly _mrzRecognizer As LabelRecognizer
    Private ReadOnly _barcodeReader As BarcodeReader
    ' Private ReadOnly _fullTextOcr As SomeOtherOcrLibrary  ' third product

    Public Sub New(mrzLicenseKey As String, barcodeLicenseKey As String)
        ' License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey)
        _mrzRecognizer = New LabelRecognizer()

        ' Configure MRZ template — JSON required before any recognition
        Dim mrzTemplate As String = "{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }"
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate)

        ' Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey)
        _barcodeReader = New BarcodeReader()
    End Sub

    Public Function ProcessPassport(imagePath As String) As PassportResult
        ' Step 1: MRZ-Extraktion — raw text only, no field parsing
        Dim mrzResults = _mrzRecognizer.RecognizeFile(imagePath)
        Dim mrzText = New StringBuilder()
        For Each r In mrzResults
            For Each line In r.LineResults
                mrzText.AppendLine(line.Text)
            Next
        Next

        ' Step 2: Parse MRZ manually — your 150-line TD3 parser here
        Dim parsedMrz = ParseMrzManually(mrzText.ToString())

        ' Step 3: Barcodes — second product, second API
        Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)

        ' Step 4: Full page text — THIRD library, no Dynamsoft option
        ' Dim fullText = _fullTextOcr.ReadImage(imagePath)

        Return New PassportResult With {
            .ParsedMrz = parsedMrz,
            .Barcodes = barcodeResults.Select(Function(b) b.BarcodeText).ToList(),
            .FullPageText = Nothing  ' requires a fourth product
        }
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _mrzRecognizer?.Dispose()
        _barcodeReader?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Der obige Code verarbeitet noch immer keine PDF-Eingaben. Falls der Passscan als PDF anstatt als JPEG ankommt, fügen Sie eine PDF-Rendering-Bibliothek hinzu, bevor dieser Vorgang ausgeführt wird. Die vollständige Integration für einen realen Pass-Workflow: vier Produkte, vier Lizenzschlüssel, vier Wartungsoberflächen.

IronOCR-Ansatz

IronOCR verarbeitet den gesamten Workflow für Reisepässe – MRZ-Parsing, OCR für ganze Seiten, Barcodes und PDF-Eingabe – mit nur einem Paket:

using IronOcr;

public class IronOcrPassportProcessor
{
    private readonly IronTesseract _ocr;

    public IronOcrPassportProcessor()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes included
    }

    public CompletePassportResult ProcessPassport(string imagePath)
    {
        // Structured MRZ fields — no manual parsing required
        var mrzData = _ocr.ReadPassport(imagePath);

        // Full page OCR + barcodes in the same call
        var fullResult = _ocr.Read(imagePath);

        return new CompletePassportResult
        {
            // MRZ fields are already parsed properties
            DocumentType    = mrzData.DocumentType,
            IssuingCountry  = mrzData.IssuingCountry,
            Surname         = mrzData.Surname,
            GivenNames      = mrzData.GivenNames,
            PassportNumber  = mrzData.DocumentNumber,
            Nationality     = mrzData.Nationality,
            DateOfBirth     = mrzData.DateOfBirth,
            ExpiryDate      = mrzData.ExpiryDate,
            RawMrz          = mrzData.MRZ,

            // Full page text from same package
            FullPageText    = fullResult.Text,

            // Barcodes alongside text — no separate product
            Barcodes        = fullResult.Barcodes.Select(b => b.Value).ToList(),

            Confidence      = fullResult.Confidence
        };
    }
}
using IronOcr;

public class IronOcrPassportProcessor
{
    private readonly IronTesseract _ocr;

    public IronOcrPassportProcessor()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes included
    }

    public CompletePassportResult ProcessPassport(string imagePath)
    {
        // Structured MRZ fields — no manual parsing required
        var mrzData = _ocr.ReadPassport(imagePath);

        // Full page OCR + barcodes in the same call
        var fullResult = _ocr.Read(imagePath);

        return new CompletePassportResult
        {
            // MRZ fields are already parsed properties
            DocumentType    = mrzData.DocumentType,
            IssuingCountry  = mrzData.IssuingCountry,
            Surname         = mrzData.Surname,
            GivenNames      = mrzData.GivenNames,
            PassportNumber  = mrzData.DocumentNumber,
            Nationality     = mrzData.Nationality,
            DateOfBirth     = mrzData.DateOfBirth,
            ExpiryDate      = mrzData.ExpiryDate,
            RawMrz          = mrzData.MRZ,

            // Full page text from same package
            FullPageText    = fullResult.Text,

            // Barcodes alongside text — no separate product
            Barcodes        = fullResult.Barcodes.Select(b => b.Value).ToList(),

            Confidence      = fullResult.Confidence
        };
    }
}
Imports IronOcr

Public Class IronOcrPassportProcessor
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract()
        _ocr.Configuration.ReadBarCodes = True ' barcodes included
    End Sub

    Public Function ProcessPassport(imagePath As String) As CompletePassportResult
        ' Structured MRZ fields — no manual parsing required
        Dim mrzData = _ocr.ReadPassport(imagePath)

        ' Full page OCR + barcodes in the same call
        Dim fullResult = _ocr.Read(imagePath)

        Return New CompletePassportResult With {
            ' MRZ fields are already parsed properties
            .DocumentType = mrzData.DocumentType,
            .IssuingCountry = mrzData.IssuingCountry,
            .Surname = mrzData.Surname,
            .GivenNames = mrzData.GivenNames,
            .PassportNumber = mrzData.DocumentNumber,
            .Nationality = mrzData.Nationality,
            .DateOfBirth = mrzData.DateOfBirth,
            .ExpiryDate = mrzData.ExpiryDate,
            .RawMrz = mrzData.MRZ,

            ' Full page text from same package
            .FullPageText = fullResult.Text,

            ' Barcodes alongside text — no separate product
            .Barcodes = fullResult.Barcodes.Select(Function(b) b.Value).ToList(),

            .Confidence = fullResult.Confidence
        }
    End Function
End Class
$vbLabelText   $csharpLabel

Ein Paket, ein Lizenzschlüssel, eine API. Die IronOCR Dokumentation behandelt sowohl die Passleseanleitung als auch die Barcode-Lesefunktion im selben Produktkontext, da es sich um dasselbe Produkt handelt.

Kosten und Komplexität bei mehreren Produkten

Der Bau eines Lagerbestandsscanners verdeutlicht die Divergenz des Kostenmodells am deutlichsten. Das System muss Produktetiketten (Text) lesen, Barcodes (QR/EAN) scannen und beigefügte Versand-PDFs verarbeiten können. Bei Dynamsoft handelt es sich um drei separat lizenzierte Produkte mit jeweils eigenen Initialisierungsmustern.

Dynamsoft-Ansatz

// Dynamsoft warehouse scanner — THREE products, THREE license keys

using Dynamsoft.DLR;  // Label Recognizer — product labels
using Dynamsoft.DBR;  // Barcode Reader — product barcodes
using Dynamsoft.DDN;  // Document Normalizer — document edge detection

public class DynamsoftWarehouseScanner : IDisposable
{
    private readonly LabelRecognizer _labelRecognizer;
    private readonly BarcodeReader _barcodeReader;
    private readonly DocumentNormalizer _documentNormalizer;

    public DynamsoftWarehouseScanner(
        string labelLicenseKey,
        string barcodeLicenseKey,
        string documentLicenseKey)
    {
        LabelRecognizer.InitLicense(labelLicenseKey);
        _labelRecognizer = new LabelRecognizer();

        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();

        DocumentNormalizer.InitLicense(documentLicenseKey);
        _documentNormalizer = new DocumentNormalizer();
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // Three separate API calls, three result types to aggregate manually
        var labelResults   = _labelRecognizer.RecognizeFile(imagePath);
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);
        var docResults     = _documentNormalizer.Normalize(imagePath);

        // Merge three result sets into one model — your code
        return AggregateResults(labelResults, barcodeResults, docResults);
    }

    public void Dispose()
    {
        _labelRecognizer?.Dispose();
        _barcodeReader?.Dispose();
        _documentNormalizer?.Dispose();
    }
}
// Dynamsoft warehouse scanner — THREE products, THREE license keys

using Dynamsoft.DLR;  // Label Recognizer — product labels
using Dynamsoft.DBR;  // Barcode Reader — product barcodes
using Dynamsoft.DDN;  // Document Normalizer — document edge detection

public class DynamsoftWarehouseScanner : IDisposable
{
    private readonly LabelRecognizer _labelRecognizer;
    private readonly BarcodeReader _barcodeReader;
    private readonly DocumentNormalizer _documentNormalizer;

    public DynamsoftWarehouseScanner(
        string labelLicenseKey,
        string barcodeLicenseKey,
        string documentLicenseKey)
    {
        LabelRecognizer.InitLicense(labelLicenseKey);
        _labelRecognizer = new LabelRecognizer();

        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();

        DocumentNormalizer.InitLicense(documentLicenseKey);
        _documentNormalizer = new DocumentNormalizer();
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // Three separate API calls, three result types to aggregate manually
        var labelResults   = _labelRecognizer.RecognizeFile(imagePath);
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);
        var docResults     = _documentNormalizer.Normalize(imagePath);

        // Merge three result sets into one model — your code
        return AggregateResults(labelResults, barcodeResults, docResults);
    }

    public void Dispose()
    {
        _labelRecognizer?.Dispose();
        _barcodeReader?.Dispose();
        _documentNormalizer?.Dispose();
    }
}
Imports Dynamsoft.DLR  ' Label Recognizer — product labels
Imports Dynamsoft.DBR  ' Barcode Reader — product barcodes
Imports Dynamsoft.DDN  ' Document Normalizer — document edge detection

Public Class DynamsoftWarehouseScanner
    Implements IDisposable

    Private ReadOnly _labelRecognizer As LabelRecognizer
    Private ReadOnly _barcodeReader As BarcodeReader
    Private ReadOnly _documentNormalizer As DocumentNormalizer

    Public Sub New(labelLicenseKey As String, barcodeLicenseKey As String, documentLicenseKey As String)
        LabelRecognizer.InitLicense(labelLicenseKey)
        _labelRecognizer = New LabelRecognizer()

        BarcodeReader.InitLicense(barcodeLicenseKey)
        _barcodeReader = New BarcodeReader()

        DocumentNormalizer.InitLicense(documentLicenseKey)
        _documentNormalizer = New DocumentNormalizer()
    End Sub

    Public Function ScanItem(imagePath As String) As WarehouseItemResult
        ' Three separate API calls, three result types to aggregate manually
        Dim labelResults = _labelRecognizer.RecognizeFile(imagePath)
        Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)
        Dim docResults = _documentNormalizer.Normalize(imagePath)

        ' Merge three result sets into one model — your code
        Return AggregateResults(labelResults, barcodeResults, docResults)
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _labelRecognizer?.Dispose()
        _barcodeReader?.Dispose()
        _documentNormalizer?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Für Versand-PDFs wird weiterhin ein viertes Produkt benötigt – Dynamsoft verfügt über keine native PDF-OCR-Funktion. Jährliche Lizenzierung für drei Dynamsoft-Produkte auf Serverebene: 5.997 US-Dollar+/Jahr. Fügt man eine PDF-Bibliothek hinzu, liegen die Kosten bereits bei über 6.300 US-Dollar pro Jahr, noch bevor eine einzige Zeile Geschäftslogik geschrieben wurde.

IronOCR-Ansatz

using IronOcr;

public class IronOcrWarehouseScanner
{
    private readonly IronTesseract _ocr;

    public IronOcrWarehouseScanner()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes in same pass
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // One call: text + barcodes + structured word positions
        var result = _ocr.Read(imagePath);

        return new WarehouseItemResult
        {
            AllText    = result.Text,
            Barcodes   = result.Barcodes.Select(b => new BarcodeInfo
                         { Format = b.Format.ToString(), Value = b.Value }).ToList(),
            Confidence = result.Confidence
        };
    }

    public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
    {
        // Target a specific label area — no template JSON required
        var region = new CropRectangle(x, y, width, height);
        using var input = new OcrInput();
        input.LoadImage(imagePath, region);
        input.Deskew();
        input.Contrast();

        return _ocr.Read(input).Text;
    }

    public string ProcessShipmentPdf(string pdfPath)
    {
        // Native PDF — no external library, no page conversion loop
        return _ocr.Read(pdfPath).Text;
    }
}
using IronOcr;

public class IronOcrWarehouseScanner
{
    private readonly IronTesseract _ocr;

    public IronOcrWarehouseScanner()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes in same pass
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // One call: text + barcodes + structured word positions
        var result = _ocr.Read(imagePath);

        return new WarehouseItemResult
        {
            AllText    = result.Text,
            Barcodes   = result.Barcodes.Select(b => new BarcodeInfo
                         { Format = b.Format.ToString(), Value = b.Value }).ToList(),
            Confidence = result.Confidence
        };
    }

    public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
    {
        // Target a specific label area — no template JSON required
        var region = new CropRectangle(x, y, width, height);
        using var input = new OcrInput();
        input.LoadImage(imagePath, region);
        input.Deskew();
        input.Contrast();

        return _ocr.Read(input).Text;
    }

    public string ProcessShipmentPdf(string pdfPath)
    {
        // Native PDF — no external library, no page conversion loop
        return _ocr.Read(pdfPath).Text;
    }
}
Imports IronOcr

Public Class IronOcrWarehouseScanner
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract()
        _ocr.Configuration.ReadBarCodes = True ' barcodes in same pass
    End Sub

    Public Function ScanItem(imagePath As String) As WarehouseItemResult
        ' One call: text + barcodes + structured word positions
        Dim result = _ocr.Read(imagePath)

        Return New WarehouseItemResult With {
            .AllText = result.Text,
            .Barcodes = result.Barcodes.Select(Function(b) New BarcodeInfo With {
                .Format = b.Format.ToString(),
                .Value = b.Value
            }).ToList(),
            .Confidence = result.Confidence
        }
    End Function

    Public Function ScanLabelRegion(imagePath As String, x As Integer, y As Integer, width As Integer, height As Integer) As String
        ' Target a specific label area — no template JSON required
        Dim region = New CropRectangle(x, y, width, height)
        Using input As New OcrInput()
            input.LoadImage(imagePath, region)
            input.Deskew()
            input.Contrast()

            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ProcessShipmentPdf(pdfPath As String) As String
        ' Native PDF — no external library, no page conversion loop
        Return _ocr.Read(pdfPath).Text
    End Function
End Class
$vbLabelText   $csharpLabel

Die regionsbasierte OCR-Dokumentation und der PDF-Eingabeleitfaden werden von IronOCR ohne zusätzliche Produkte abgedeckt.

Bereitstellungsmodell

Beide Bibliotheken werden lokal betrieben, ohne Übertragung von Dokumentdaten in die Cloud. Die wichtigsten Unterschiede bei der Bereitstellung betreffen Initialisierungsmuster, die Verwaltung von Konfigurationsdateien und den Inhalt der jeweiligen Bereitstellungsartefakte der einzelnen Bibliotheken.

Dynamsoft-Ansatz

Dynamsoft verlangt statische Initialisierungsaufrufe an die SDK-Klasse, bevor eine Instanz erstellt werden kann. Jedes Produkt hat sein eigenes Initialisierungsmuster, und der Lizenzschlüssel aktiviert nur dieses spezifische Produkt. Vorlagen-Konfigurationsdateien — die JSON-Einstellungsdokumente für MRZ, VIN oder benutzerdefinierte Etikettenmuster — müssen zur Laufzeit vorhanden und korrekt referenziert sein. Eine Bereitstellung, die Label Recognizer und Barcode Reader umfasst, verwaltet zwei Aktivierungsabläufe, zwei Vorlagensätze und zwei Dispose-Ketten.

Bei Lager- oder Kiosk-Einsätzen fügt die Abhängigkeit von der Konfigurationsdatei ein zusätzliches Bereitstellungsartefakt hinzu, das über die Binärdateien hinausgeht. Die JSON-Vorlagen sind separate Dateien und nicht in das Paket kompiliert. Falsche Konfiguration des Vorlagenpfads auf einem neuen Server und die Erkennung gibt stillschweigend leere Ergebnisse zurück oder wirft zur Laufzeit während des AppendSettingsFromString-Aufrufs.

IronOCR-Ansatz

IronOCR wird als einzelnes NuGet Paket bereitgestellt. Die Lizenzaktivierung erfolgt durch Zuweisung einer einzeiligen Zeichenkette:

// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
$vbLabelText   $csharpLabel

Keine Vorlagendateien. Keine native Binärverwaltung. Kein tessdata-Ordner vorhanden. Der Docker-Bereitstellungsleitfaden erfordert nur libgdiplus auf Linux— eine apt-get install-Zeile in der Docker-Datei.

FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

Das gleiche Paket unterstützt Linux , AWS Lambda und Azure App Service ohne plattformspezifische Konfiguration. Für Teams, die CI/CD-Pipelines betreiben, gibt es keine Vorlagendateien, die separat versioniert oder für die Artefaktbereitstellung verwendet werden können.

API-Mapping-Referenz

Dynamsoft Label Recognizer IronOCR-Äquivalent
LabelRecognizer.InitLicense(key) IronOcr.License.LicenseKey = key
new LabelRecognizer() new IronTesseract()
_recognizer.AppendSettingsFromString(json) Nicht erforderlich – Motor wird automatisch konfiguriert
_recognizer.RecognizeFile(path) ocr.Read(path)
_recognizer.RecognizeByFile(path, "") ocr.Read(path)
result.LineResults[i].Text result.Lines[i].Text
Manueller TD3 MRZ-Parser (über 150 Zeilen) ocr.ReadPassport(path).Surname usw.
BarcodeReader.InitLicense(key) (separates Produkt) ocr.Configuration.ReadBarCodes = true
_barcodeReader.DecodeFile(path) result.Barcodes (gleicher Aufruf wie OCR)
barcode.BarcodeFormatString barcode.Format.ToString()
barcode.BarcodeText barcode.Value
DocumentNormalizer.InitLicense(key) (separates Produkt) Nicht erforderlich
Keine PDF-Unterstützung ocr.Read("document.pdf")
Keine durchsuchbare PDF-Ausgabe result.SaveAsSearchablePdf(path)
recognizer.Dispose() using var ocr = new IronTesseract()

Wenn Teams einen Wechsel von Dynamsoft zu IronOCR erwägen

Der Anwendungsbereich geht über MRZ oder Etiketten hinaus.

Die meisten Migrationen erfolgen, wenn ein Projekt klein beginnt – "nur Pass-MRZ lesen" – und dann Produktanforderungen hinzukommen. Der Kunde möchte die gescannten Pässe als durchsuchbare PDFs archivieren. Das Compliance-Team möchte die Visastempel per OCR erfassen. Im Support-System befinden sich Tickets zu PDFs, die Dynamsoft nicht verarbeiten kann. Derzeit pflegt das Team Dynamsoft für MRZ und Plus eine zweite OCR-Bibliothek für alle anderen Dateitypen. Zwei Lizenzvereinbarungen, zwei Wartungspfade, zwei API-Muster in derselben Codebasis.IronOCR behandelt das ursprüngliche MRZ-Erfordernis über ReadPassport() und die erweiterten Anforderungen über die gleiche IronTesseract Instanz. Teams, die von einem Zwei-Bibliotheken-System auf ein einziges Paket umsteigen, berichten typischerweise von einer Reduzierung des Integrationsschicht-Codes um 30-40%.

Die jährlichen Abonnementkosten sind nicht tragbar.

Mehrprodukt-Dynamsoft-Lizenzierungskosten kumulieren sich jährlich erheblich — kontaktieren Sie Dynamsoft für aktuelle Preisinformationen. Über mehrere Jahre können die kombinierten jährlichen Abonnementgebühren für mehrere Produkte die einmaligen Kosten von IronOCRs $999 erheblich übersteigen. Das unbefristete Lizenzmodell ist am wichtigsten für Produkte mit einer definierten kommerziellen Laufzeit — ein staatliches Dokumentenverarbeitungssystem, das sieben Jahre laufen wird, möchte keine jährliche Erneuerungsabhängigkeit von einem spezialisierten Anbieter für eine Kernkomponente.

PDF-Eingabe erforderlich

Dynamsoft Label Recognizer bietet keine native PDF-Unterstützung. Jedes im PDF-Format ausgelieferte Dokument erfordert einen Vorverarbeitungsschritt: Jede Seite muss in ein Bild umgewandelt, das Bild durch Dynamsoft geleitet und die Ergebnisse gesammelt und wieder zusammengesetzt werden. Diese Pipeline fügt eine Abhängigkeit vom PDF-Rendering, eine Seiteniterationsschleife und ein Koordinatenzuordnungsproblem hinzu, wenn Sie die Erkennungsergebnisse mit der ursprünglichen PDF-Geometrie korrelieren müssen.IronOCR liest PDFs nativ — ocr.Read("passport-scans.pdf") verarbeitet jede Seite und result.Pages gibt Ihnen seitenweise Zugriff auf Text, Wörter und Vertrauenswerte. Für Teams, bei denen 20 % oder mehr der Eingaben als PDFs eingehen, bedeutet der Dynamsoft-Workaround jedes Mal einen erheblichen Wartungsaufwand, wenn die PDF-Rendering-Bibliothek aktualisiert wird.

Die Steuer für die Integration mehrerer Produkte ist zu hoch

Jedes zusätzliche Dynamsoft-Produkt ist ein separater statischer Initialisierungsaufruf, eine separate Dispose-Kette und eine separate JSON-Konfigurationsdatei zur Verwaltung. Teams, die drei Dynamsoft-Produkte integriert haben, berichten, dass die Integrationsoberfläche den größten Wartungsaufwand verursacht – und nicht die Erkennungsqualität. Die Rotation der Lizenzschlüssel, die Aktualisierung der SDK-Version und die Bereitstellung der Vorlagendatei müssen für alle drei Produkte gleichzeitig koordiniert werden. Das Single-Package-Modell von IronOCR bedeutet, dass nur eine Version aktualisiert, ein Lizenzschlüssel gewechselt und eine API-Oberfläche gewartet werden muss, unabhängig davon, wie viele OCR-Funktionen die Anwendung nutzt.

Internationale Dokumententypen werden benötigt

Dynamsoft Label Recognizer basiert auf MRZ-Formaten mit lateinischen Zeichen gemäß ICAO Doc 9303. Anwendungen, die Ausweisdokumente in CJK-Sprachen, Reisepässe in arabischer Schrift oder mehrsprachige Versandetiketten verarbeiten, stoßen schnell an die Grenzen der Sprachabdeckung.IronOCR liefert über 125 Sprachpakete als einzelne NuGet Pakete aus – Arabisch, Chinesisch (vereinfacht), Chinesisch (traditionell), Japanisch, Koreanisch und mehr. Jede Installation erfolgt über dotnet add package IronOcr.Languages.Arabic, ohne den Erkennungscode zu verändern. Der Leitfaden für mehrere Sprachen beschreibt die gleichzeitige mehrsprachige Erkennung mit nur wenigen Konfigurationszeilen.

Gemeinsame Überlegungen zur Migration

Ersetzen des MRZ-Parsers

Der unmittelbarste Migrationsschritt besteht darin, die Kombination aus Dynamsoft RecognizeFile + manueller TD3-Parser mit ReadPassport zu ersetzen. Der Dynamsoft-Extraktionspfad gibt Rohtext wie P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<< zurück und erfordert mehr als 150 Zeilen Zeichenversatz-Parsen für das TD3-Format. Der IronOCR Nachfolger:

// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz);  // delete this file

// After:IronOCR parsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname  = passportData.Surname;
string docNum   = passportData.DocumentNumber;
DateTime? dob   = passportData.DateOfBirth;
// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz);  // delete this file

// After:IronOCR parsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname  = passportData.Surname;
string docNum   = passportData.DocumentNumber;
DateTime? dob   = passportData.DateOfBirth;
Imports System
Imports System.Linq

' Before: Dynamsoft raw extraction + manual 150-line parser
Dim results = _recognizer.RecognizeFile(imagePath)
Dim rawMrz = String.Join(vbCrLf, results.SelectMany(Function(r) r.LineResults).Select(Function(l) l.Text))
Dim parsed = MyTd3Parser.Parse(rawMrz)  ' delete this file

' After: IronOCR parsed output directly
Dim passportData = New IronTesseract().ReadPassport(imagePath)
Dim surname As String = passportData.Surname
Dim docNum As String = passportData.DocumentNumber
Dim dob As DateTime? = passportData.DateOfBirth
$vbLabelText   $csharpLabel

Der manuelle Parser wurde vollständig gelöscht. TD1 (Personalausweise), TD2 (Visa) und TD3 (Pässe) Format-Erkennung ist automatisch in ReadPassport. Die Anleitung zum Lesen des Reisepasses dokumentiert jedes zurückgegebene Feld.

Konsolidierung der Initialisierung mehrerer Produkte

Dynamsoft-Multiproduktanwendungen haben mehrere statische InitLicense-Aufrufe beim Start, die jeweils ihren eigenen Schlüssel erfordern. Diese sollten in einer einzigen IronOCR Lizenzzeile zusammengefasst und die produktspezifischen Initialisierungsblöcke entfernt werden:

// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);

// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;  // barcodes included automatically
// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);

// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;  // barcodes included automatically
Imports System

' Before: three static initializations
LabelRecognizer.InitLicense(mrzKey)
BarcodeReader.InitLicense(barcodeKey)
DocumentNormalizer.InitLicense(documentKey)

' After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")

Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True  ' barcodes included automatically
$vbLabelText   $csharpLabel

Bestehende Dynamsoft Dispose-Aufrufe in Dienstklassen sollten mit standardmäßigen using-Blöcken auf IronTesseract-Instanzen ersetzt werden oder eine einzelne wiederverwendete Instanz, die im DI-Container registriert ist. Die Einrichtungsanleitung für IronTesseract behandelt beide Muster.

PDF-Unterstützung hinzufügen

Die am häufigsten neu erworbene Fähigkeit, die Teams während der Migration erlangen, ist die native PDF-Eingabe – etwas, das Dynamsoft nie angeboten hat. Nach dem Entfernen der PDF-zu-Bild-Konvertierungsschleife sind für das native Lesen von PDFs keine weiteren Codeänderungen über den Eingabepfad hinaus erforderlich:

// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
    var bitmap = page.RenderAsBitmap(150);
    var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
    // aggregate...
}

// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
    var bitmap = page.RenderAsBitmap(150);
    var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
    // aggregate...
}

// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' Before: PDF rendering loop (50+ lines with external library)
Dim pdfDoc = PdfDocument.Load(pdfPath)
For Each page In pdfDoc.Pages
    Dim bitmap = page.RenderAsBitmap(150)
    Dim results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap))
    ' aggregate...
Next

' After: native PDF — no loop, no external library
Dim result = New IronTesseract().Read(pdfPath)
Dim fullText As String = result.Text
result.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

Für Teams, die auch durchsuchbare PDF-Archive aus gescannten Eingaben erzeugen müssen, ist SaveAsSearchablePdf ein Einzelmethodeaufruf. Die durchsuchbare PDF-Anleitung beschreibt detailliert die Ausgabeoptionen.

Vorverarbeitung für industrielle Etikettenqualität

Die Template-Engine von Dynamsoft ist für kontrollierte Labelbedingungen optimiert. Bei Bildstörungen – wie abgenutzten Etiketten, kontrastarmen Verpackungen oder verzerrten Industriescans – schließt die Vorverarbeitungspipeline von IronOCR die Lücke. Die Anleitung zur Bildqualitätskorrektur erläutert jeden Filter. Für etikettspezifische Workflows sind Deskew und Contrast am nützlichsten:

using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew();    // correct rotation from handheld scanner
input.Contrast();  // recover faded label text
input.DeNoise();   // remove packaging texture interference

var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew();    // correct rotation from handheld scanner
input.Contrast();  // recover faded label text
input.DeNoise();   // remove packaging texture interference

var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
Imports IronOcr

Using input As New OcrInput()
    input.LoadImage(labelImagePath)
    input.Deskew()    ' correct rotation from handheld scanner
    input.Contrast()  ' recover faded label text
    input.DeNoise()   ' remove packaging texture interference

    Dim labelText = New IronTesseract().Read(input).Text
    Console.WriteLine($"Confidence: {New IronTesseract().Read(input).Confidence}%")
End Using
$vbLabelText   $csharpLabel

Zusätzliche Funktionen von IronOCR

Funktionen, die in den obigen Abschnitten nicht behandelt wurden und von Teams häufig nach der Migration genutzt werden:

  • Handschrifterkennung : Verarbeitung handschriftlicher Notizen und Anmerkungen neben gedrucktem Text – eine Funktion, die Dynamsoft nicht bietet.
  • Verarbeitung gescannter Dokumente : Mehrseitige gescannte PDFs mit automatischer Vorverarbeitung pro Seite
  • Tabellenextraktion : Erkennen und Extrahieren von tabellarischen Daten aus Rechnungen, Manifesten und Datenblättern
  • hOCR-Export : Export der Erkennungsergebnisse als HTML mit Begrenzungsrahmenkoordinaten für die nachfolgende Layoutanalyse
  • Asynchrone OCR : Blockierungsfreie Erkennung für ASP.NET und Serveranwendungen mit hohem Durchsatz
  • Fortschrittsverfolgung : Überwachen Sie mehrseitige Batch-Jobs mit Fortschritts-Callbacks
  • Index mit über 125 Sprachen : Vollständige Liste der unterstützten NuGet Sprachpakete einschließlich nicht-lateinischer Schriftsysteme
  • MICR/Schecklesen : Magnetische Tintenzeichenerkennung für die Verarbeitung von Finanzdokumenten – ein weiterer Spezialanwendungsfall, der in einem Paket abgedeckt wird
  • Konfidenzwerte pro Wort : Feingranulare Qualitätssignale für automatisierte Dokumentenprüfungs-Pipelines

.NET-Kompatibilität und Zukunftsfähigkeit

IronOCR unterstützt .NET 8 und .NET 9 als erstklassige Laufzeitumgebungen und bietet volle Abwärtskompatibilität zu .NET Framework 4.6.2 und .NET Core 3.1. Die Bibliothek wird als einzelnes NuGet Paket bereitgestellt, das die korrekte Plattformbinärdatei für Windowsx64, Windowsx86, Linuxx64, macOSx64 und macOSARM automatisch über den Laufzeitidentifikatorgraphen von NuGet ermittelt – ohne bedingte Paketverweise und ohne plattformspezifische Projektdateien. Dynamsoft Label Recognizerunterstützt ebenfalls moderne .NET Laufzeitumgebungen, aber aufgrund des Mehrproduktmodells muss die .NET Kompatibilität jedes einzelnen Produkts separat überprüft und aktualisiert werden. Der aktive Entwicklungsrhythmus von IronOCR sorgt dafür, dass NuGet -Paketaktualisierungen mit jedem .NET Releasezyklus abgestimmt sind, und das Einzelpaketmodell bedeutet, dass die .NET 10-Kompatibilität, die für Ende 2026 erwartet wird, einheitlich für alle Funktionen gilt, ohne dass eine produktspezifische Nachverfolgung erforderlich ist.

Abschluss

Dynamsoft Label Recognizer ist ein technisch hochentwickelter Spezialist. Ob Kiosk, der nur Reisepass-MRZ verarbeitet, oder Montagelinie, die nur Fahrgestellnummern liest – seine vorlagenbasierte Erkennungs-Engine erledigt die jeweilige Aufgabe zuverlässig. Das Problem ist, dass reale Anwendungsfälle selten eng gefasst bleiben. Die vollständigen Datenseiten der Reisepässe müssen per OCR erfasst werden. Versandetiketten werden als PDF-Dateien geliefert. Inventursysteme benötigen Barcode und Text im selben Arbeitsgang. Jede Erweiterung des Anwendungsbereichs erfordert ein weiteres Dynamsoft-Produkt, eine weitere Jahreslizenz und eine weitere zu pflegende API-Oberfläche.

Das Kostenmodell macht dies konkret. Mehrjahressummen für MRZ plus Barcode-Lesen über ein Entwicklungsteam unter Verwendung des jährlichen Abonnementmodells von Dynamsoft kumulieren sich erheblich.IronOCR deckt beide Fähigkeiten ab — zusätzlich zu nativen PDF, durchsuchbaren PDF-Ausgaben, vollständigem Dokumenten-OCR, 125+ Sprachen und Vorverarbeitung — bei $999 einmalig. Die Migration selbst ist weitgehend mechanisch: Ersetzen Sie RecognizeFile durch ocr.Read, löschen Sie den manuellen TD3 MRZ-Parser, aktivieren Sie ReadBarCodes = true und entfernen Sie die externe PDF-Rendering-Schleife.

Der architektonische Unterschied liegt nicht nur in den Kosten. Dynamsofts Design zwingt Teams dazu, in Produkten statt in Funktionen zu denken – sich also vor dem Schreiben von Code zu fragen: "Welches Dynamsoft-Produkt kann das?" Das Design von IronOCR kehrt das um: eine Instanz, eine Konfiguration, ein Ergebnisobjekt, unabhängig davon, was das Dokument enthält. Dieser Unterschied verstärkt sich im Laufe der Projektlaufzeit mit steigenden Anforderungen.

Für Teams, die neue Anwendungen entwickeln, die eine beliebige Kombination aus MRZ-Erkennung, Barcode-Lesung, allgemeiner Dokumenten-OCR oder PDF-Verarbeitung benötigen, beseitigt das All-in-One-Modell von IronOCR von vornherein das Problem der Koordination mehrerer Produkte. Für Teams, die derzeit mehrere Dynamsoft-Produkte zusammen mit einer separaten OCR-Bibliothek verwenden, konsolidiert der Migrationspfad diese Oberfläche zu einer einzigen Abhängigkeit. Das IronOCR Dokumentationsportal umfasst alle hier besprochenen Funktionen mit funktionierenden Codebeispielen und Bereitstellungsanleitungen.

Hinweis:Dynamsoft und Tesseract sind eingetragene Marken ihrer jeweiligen Inhaber. Diese Website ist nicht mit Dynamsoft oder Google verbunden, nicht gesponsert oder unterstützt. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Häufig gestellte Fragen

Was ist Dynamsoft OCR SDK?

Dynamsoft OCR SDK ist eine OCR-Lösung, die von Entwicklern und Unternehmen verwendet wird, um Text aus Bildern und Dokumenten zu extrahieren. Es ist eine von mehreren OCR-Optionen, die neben IronOCR for .NET Application Development evaluiert wurden.

Wie ist IronOCR im Vergleich zu Dynamsoft OCR SDK for .NET-Entwicklern?

IronOCR ist eine NuGet-native OCR-Bibliothek für .NET, die IronTesseract als Kern-Engine verwendet. Im Vergleich zum Dynamsoft OCR SDK bietet es eine einfachere Bereitstellung (keine SDK-Installationsprogramme), Pauschalpreise und eine saubere C#-API ohne COM-Interop oder Cloud-Abhängigkeiten.

Ist IronOCR einfacher einzurichten als Dynamsoft OCR SDK?

IronOCR wird über ein einziges NuGet-Paket installiert. Es gibt keine SDK-Installationsprogramme, keine Lizenzdateien, die kopiert werden müssen, keine COM-Komponenten, die registriert werden müssen, und keine separaten Laufzeit-Binärdateien, die verwaltet werden müssen. Die gesamte OCR-Engine ist in diesem Paket enthalten.

Welche Genauigkeitsunterschiede gibt es zwischen Dynamsoft OCR SDK und IronOCR?

IronOCR erreicht eine hohe Erkennungsgenauigkeit für Standardgeschäftsdokumente, Rechnungen, Quittungen und gescannte Formulare. Bei stark degradierten Dokumenten oder ungewöhnlichen Skripten variiert die Genauigkeit je nach Qualität der Quelle. IronOCR enthält Bildvorverarbeitungsfilter zur Verbesserung der Erkennung bei Eingaben von geringer Qualität.

Unterstützt IronOCR die PDF-Textextraktion?

Ja, IronOCR extrahiert Text sowohl aus nativen PDF-Dateien als auch aus gescannten PDF-Bildern in einem einzigen Aufruf. Es unterstützt auch mehrseitige TIFF-Dateien, Bilder und Streams. Bei gescannten PDFs wird die OCR seitenweise mit seitenweisen Ergebnisobjekten angewendet.

Wie sieht die Lizenzierung von Dynamsoft OCR SDK im Vergleich zu IronOCR aus?

IronOCR verwendet eine unbefristete Pauschallizenz, bei der keine Gebühren pro Seite oder pro Scan anfallen. Unternehmen, die große Dokumentenmengen verarbeiten, zahlen unabhängig vom Volumen die gleichen Lizenzkosten. Einzelheiten und Volumenpreise finden Sie auf der IronOCR-Lizenzierungsseite.

Welche Sprachen unterstützt IronOCR?

IronOCR unterstützt 127 Sprachen über separate NuGet-Sprachpakete. Das Hinzufügen einer Sprache erfordert einen einzigen Befehl 'dotnet add package IronOcr.Languages.{Language}'. Es ist keine manuelle Dateiablage oder Pfadkonfiguration erforderlich.

Wie installiere ich IronOCR in einem .NET -Projekt?

Installation über NuGet: 'Install-Package IronOcr' in der Paketmanager-Konsole oder 'dotnet add package IronOcr' in der CLI. Zusätzliche Sprachpakete werden auf die gleiche Weise installiert. Es ist kein natives SDK-Installationsprogramm erforderlich.

Ist IronOCR im Gegensatz zu Dynamsoft OCR für Docker und containerisierte Implementierungen geeignet?

Ja, IronOCR funktioniert in Docker-Containern über sein NuGet-Paket. Der Lizenzschlüssel wird über eine Umgebungsvariable festgelegt. Für die OCR-Engine selbst sind keine Lizenzdateien, SDK-Pfade oder Volume-Mounts erforderlich.

Kann ich IronOCR im Vergleich zu Dynamsoft OCR vor dem Kauf ausprobieren?

Ja. Der IronOCR-Testmodus verarbeitet Dokumente und liefert OCR-Ergebnisse mit einem Wasserzeichen als Overlay auf der Ausgabe. Sie können die Genauigkeit an Ihren eigenen Dokumenten überprüfen, bevor Sie eine Lizenz erwerben.

Unterstützt IronOCR neben der Textextraktion auch das Lesen von Barcodes?

IronOCR konzentriert sich auf die Textextraktion und OCR. Für das Lesen von Barcodes bietet Iron Software IronBarcode als Begleitbibliothek an. Beide sind einzeln oder als Teil des Iron Suite-Pakets erhältlich.

Ist es einfach, von Dynamsoft OCR SDK zu IronOCR zu migrieren?

Die Migration von Dynamsoft OCR SDK zu IronOCR umfasst in der Regel das Ersetzen von Initialisierungssequenzen durch IronTesseract-Instanziierung, das Entfernen des COM-Lifecycle-Managements und die Aktualisierung von API-Aufrufen. Die meisten Migrationen reduzieren die Code-Komplexität erheblich.

Kannaopat Udonpant
Software Ingenieur
Bevor er Software-Ingenieur wurde, absolvierte Kannapat ein PhD in Umweltressourcen an der Hokkaido University in Japan. Während seines Studiums wurde Kannapat auch Mitglied des Vehicle Robotics Laboratory, das Teil der Fakultät für Bioproduktionstechnik ist. Im Jahr 2022 nutzte er seine C#-Kenntnisse, um dem Engineering-Team von Iron Software ...
Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an