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:
RecognizeFilegibtLineResult-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
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 = trueund 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
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
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
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
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")
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
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
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")
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
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.
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.

