Umstellung von Dynamsoft OCR auf IronOCR
Dieser Leitfaden bietet einen vollständigen Migrationspfad for .NET Entwickler, die von Dynamsoft Label Recognizerzu IronOCR wechseln. Es behandelt den Austausch von NuGet -Paketen, Namespace-Aktualisierungen, die Initialisierung von Lizenzen und praktische Beispiele für die Codemigration in Szenarien, die sich von allgemeinen Fähigkeitsvergleichen unterscheiden – einschließlich der Eliminierung von Vorlagenkonfigurationen, der Entfernung von Laufzeit-JSON-Einstellungen, der Migration von Regionsdefinitionen und der Vereinfachung der Ergebnisanalyse.
Warum von Dynamsoft OCR migrieren?
Dynamsoft Label Recognizer ist ein speziell entwickelter Spezialist. Diese Präzision eignet sich gut für eng begrenzte Implementierungen, führt aber zu Problemen, sobald der Anwendungsbereich über den ursprünglichen MRZ- oder VIN-Anwendungsfall hinausgeht.
Laufzeiteinstellungen: JSON ist eine Wartungsoberfläche. Jeder Dynamsoft-Erkennungsworkflow beginnt mit AppendSettingsFromString, wobei ein JSON-Dokument geladen wird, das Parameterarrays, Zeichnungsmodelle und Regionsreferenzen deklariert. Bei diesen JSON-Vorlagen handelt es sich um separate Bereitstellungsartefakte – sie werden nicht in Ihre Binärdatei kompiliert. Sie erfordern Versionskontrolle, die Verwaltung der Bereitstellungspipeline und manuelle Aktualisierungen, wenn Dynamsoft die Vorlagenschemata über verschiedene SDK-Versionen hinweg ändert.IronOCR erfordert keine Konfigurationsdateien: Instanziieren Sie IronTesseract, rufen Sie .Read() auf, und die Engine wählt automatisch geeignete Einstellungen aus.
Die Preise für Jahresabonnements steigen. Dynamsoft Label Recognizer-Lizenzen kosten 599 US-Dollar und mehr pro Gerät und Jahr. Es gibt keine Option für die Ewigkeit. Ein Verarbeitungscluster mit fünf Geräten kostet jährlich über 2.995 US-Dollar – und dieses Budget deckt nur MRZ und die Erkennung strukturierter Etiketten ab. Fügen Sie Dynamsoft Barcode Reader für Barcodes oder Dynamsoft Document Normalizer für die Kantenkorrektur hinzu, und die Jahresrechnung multipliziert sich mit der Produktanzahl. Die Lite-Lizenz von IronOCR ist $999 einmalig und deckt allgemeine OCR, strukturierte Etiketten, Barcodes, native PDF, durchsuchbare PDF-Ausgaben und über 125 Sprachen in einem einzigen Paket ab.
Regionsdefinition erfordert JSON-Vorlagen. Die Definition einer Erkennungsregion in Dynamsoft bedeutet, einen ReferenceRegionArray JSON-Block zu erstellen, ihn in einem LabelRecognizerParameterArray zu referenzieren und das gesamte Dokument zu laden, bevor die Bildverarbeitung beginnt.IronOCR verwendet einen einzelnen CropRectangle(x, y, width, height)-Konstruktor, der direkt an OcrInput.LoadImage übergeben wird. Das Ändern einer Region erfordert die Bearbeitung einer Zahl, nicht das erneute Parsen eines JSON-Dokuments.
Ergebnis-Parsen liegt vollständig in Ihrer Verantwortung. RecognizeFile und RecognizeByFile geben LineResult Arrays zurück, die rohe Textzeichenfolgen enthalten. Jede benötigte Struktur – Feld-Offsets, Datumskonvertierungen, Prüfziffernvalidierung, Namenstrennzeichenbehandlung – erfordert zusätzlich zum Rohdatensatz einen benutzerdefinierten Parsing-Code.IronOCR gibt ein OcrResult mit .Pages, .Lines, .Words und .Characters als typisierte Sammlungen mit Koordinaten der Begrenzungsrahmen, Vertrauenswerten und Schriftmetadaten zurück, die bereits gefüllt sind.
Fehlende native PDF-Unterstützung führt zu einer versteckten Abhängigkeit. Dynamsoft Label Recognizerbietet keine Möglichkeit zur PDF-Eingabe. Jede PDF-Datei, die in Ihrer Verarbeitungspipeline ankommt, erfordert eine externe Bibliothek, um jede Seite in eine Bitmap umzuwandeln, eine Seiteniterationsschleife und einen Ergebnisaggregationsschritt vor dem ersten Dynamsoft-Aufruf.IronOCR liest PDFs nativ: new IronTesseract().Read("document.pdf") verarbeitet jede Seite ohne sekundäre Abhängigkeit, Schleifenrendering oder temporären Bildordner.
Multi-Produkt-Initialisierungsblöcke wachsen mit dem Umfang. Eine Dynamsoft-Anwendung, die strukturierte Etiketten, Barcodes und Dokumentnormalisierung verarbeitet, führt drei statische InitLicense-Aufrufe beim Start aus, drei Entsorgungsketten und drei unabhängige SDK-Versionsabhängigkeiten. Die Aktualisierung des SDK erfordert eine Koordination über alle Produkte hinweg.IronOCR hat eine Initialisierungszeile und eine Paketversion, unabhängig davon, welche Funktionen die Anwendung nutzt.
Das grundsätzliche Problem
Dynamsoft benötigt eine zur Laufzeit geladene JSON-Konfigurationsdatei, bevor die Erkennung beginnen kann:
// Dynamsoft: JSON template required before any image processing
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
string settings = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Label"",
""ReferenceRegionNameArray"": [""VinRegion""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VinRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [5, 40],
""SecondPoint"": [95, 40],
""ThirdPoint"": [95, 60],
""FourthPoint"": [5, 60]
}
}]
}";
recognizer.AppendSettingsFromString(settings); // fails silently if JSON is malformed
var results = recognizer.RecognizeFile(imagePath);
// Dynamsoft: JSON template required before any image processing
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
string settings = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Label"",
""ReferenceRegionNameArray"": [""VinRegion""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VinRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [5, 40],
""SecondPoint"": [95, 40],
""ThirdPoint"": [95, 60],
""FourthPoint"": [5, 60]
}
}]
}";
recognizer.AppendSettingsFromString(settings); // fails silently if JSON is malformed
var results = recognizer.RecognizeFile(imagePath);
' Dynamsoft: JSON template required before any image processing
LabelRecognizer.InitLicense(licenseKey)
Dim recognizer As New LabelRecognizer()
Dim settings As String = "{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Label"",
""ReferenceRegionNameArray"": [""VinRegion""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VinRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [5, 40],
""SecondPoint"": [95, 40],
""ThirdPoint"": [95, 60],
""FourthPoint"": [5, 60]
}
}]
}"
recognizer.AppendSettingsFromString(settings) ' fails silently if JSON is malformed
Dim results = recognizer.RecognizeFile(imagePath)
// IronOCR: no JSON, no template files — region is a constructor argument
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var region = new CropRectangle(x: 50, y: 400, width: 900, height: 200);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// IronOCR: no JSON, no template files — region is a constructor argument
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var region = new CropRectangle(x: 50, y: 400, width: 900, height: 200);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' IronOCR: no JSON, no template files — region is a constructor argument
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim region As New CropRectangle(x:=50, y:=400, width:=900, height:=200)
Using input As New OcrInput()
input.LoadImage(imagePath, region)
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
IronOCR vs. Dynamsoft OCR: Funktionsvergleich
Die folgende Tabelle verdeutlicht die gesamte Funktionslücke zwischen den beiden Bibliotheken.
| Feature | Dynamsoft Label Recognizer | IronOCR |
|---|---|---|
| Allgemeines Dokument OCR | Nicht unterstützt | Volle Unterstützung |
| MRZ-Erkennung | Spezialisiert (Rohtextausgabe) | Eingebaut mit strukturierten Feldern |
| VIN-Erkennung | Spezialisiert (Vorlage erforderlich) | Standard-OCR mit Regionsausrichtung |
| Lesen von Industrieetiketten | Spezialisiert (Vorlage erforderlich) | Ja, über CropRectangle |
| Laufzeiteinstellungen-Konfiguration | Erforderlich (JSON über AppendSettingsFromString) |
Nicht erforderlich |
| Vorlagenbereitstellungsartefakte | Erforderlich (JSON-Dateien) | None |
| Native PDF-Eingabe | Nicht unterstützt | Ja |
| Passwortgeschütztes PDF | Nicht unterstützt | Ja |
| Mehrseitige TIFF-Eingabe | Manuelle Seitenüberarbeitung | Nativ (LoadImageFrames) |
| Durchsuchbare PDF-Ausgabe | Nicht unterstützt | Ja (SaveAsSearchablePdf) |
| Barcode-Lesung | Separates Produkt (Dynamsoft Barcode-Lesegerät) | Eingebaut (ReadBarCodes = true) |
| Automatische Vorverarbeitung | Beschränkt | Ja (Entzerren, Rauschen entfernen, Kontrast, Binarisieren, Schärfen, Dilatieren, Erodieren) |
| Strukturierte Ausgabe (Wörter, Zeilen, Absätze) | Rohe LineResult Textzeichenfolgen |
Vollständig eingegeben mit Koordinaten und voller Zuversicht |
| Sprachunterstützung | Beschränkt (lateinisch MRZ) | Mehr als 125 Sprachen, gebündelt als NuGet -Pakete |
| Mehrsprachige Simultanübertragung | Nicht unterstützt | Ja (OcrLanguage.French + OcrLanguage.German) |
| Konfidenzwerte | Nur pro Zeile | Pro Wort, Zeile, Seite |
| hOCR-Export | Nicht unterstützt | Ja |
| Lizenzierungsmodell | Jahresabonnement (ab 599 $/Gerät/Jahr) | Unbefristet ($999 einmalig, Lite-Stufe) |
| Mehrere Produkte erforderlich | Ja (3+ für vollständige Abdeckung) | Nein (eine Packung) |
| .NET Framework -Unterstützung | .NET Framework 4.x+ | .NET Framework 4.6.2+, .NET 5/6/7/8/9 |
| Plattformübergreifende Bereitstellung | Ja | Ja (Windows, Linux, macOS, Docker, Azure, AWS) |
| NuGet-Paket | Dynamsoft.LabelRecognizer |
IronOcr |
Schnellstart: Migration von Dynamsoft OCR zu IronOCR
Schritt 1: Ersetzen des NuGet-Pakets
Entfernen Sie das Dynamsoft-Paket:
dotnet remove package Dynamsoft.LabelRecognizer
dotnet remove package Dynamsoft.LabelRecognizer
Installieren Sie IronOCR aus der NuGet Galerie :
dotnet add package IronOcr
Schritt 2: Namespaces aktualisieren
// Before (Dynamsoft)
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;
// After (IronOCR)
using IronOcr;
// Before (Dynamsoft)
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;
// After (IronOCR)
using IronOcr;
Imports IronOcr
Schritt 3: Lizenz initialisieren
Ersetzen Sie jeden statischen InitLicense-Aufruf von Dynamsoft durch eine einzelne IronOCR-Lizenzzuweisung beim Anwendungsstart:
// Before (Dynamsoft — one call per product)
LabelRecognizer.InitLicense("DYNAMSOFT-LICENSE-KEY");
// After (IronOCR — one line, all features)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before (Dynamsoft — one call per product)
LabelRecognizer.InitLicense("DYNAMSOFT-LICENSE-KEY");
// After (IronOCR — one line, all features)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
' Before (Dynamsoft — one call per product)
LabelRecognizer.InitLicense("DYNAMSOFT-LICENSE-KEY")
' After (IronOCR — one line, all features)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Beispiele für die Code-Migration
Vorlagenbasierte Erkennung für eine Zero-Config-Engine
Das JSON-Vorlagensystem von Dynamsoft liefert dem SDK detaillierte Anweisungen zu Zeichenmodellen, Regionsspezifikationen und Erkennungsparametern, bevor ein Bild verarbeitet wird. Bei den meisten realen OCR-Anwendungen führt diese Konfiguration zu einer erhöhten Einrichtungskomplexität ohne Vorteile bei der Erkennung, da die zugrunde liegende Tesseract-Engine die Layouterkennung automatisch übernimmt.
Dynamsoft-Ansatz:
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;
// JSON template required before recognition
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
string invoiceTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""Invoice_Header"",
""ReferenceRegionNameArray"": [""HeaderRegion""],
""CharacterModelName"": ""NumberLetter""
}],
""ReferenceRegionArray"": [{
""Name"": ""HeaderRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [0, 0],
""SecondPoint"": [100, 0],
""ThirdPoint"": [100, 20],
""FourthPoint"": [0, 20]
}
}]
}";
recognizer.AppendSettingsFromString(invoiceTemplate);
var results = recognizer.RecognizeFile("invoice.jpg");
var headerText = new StringBuilder();
foreach (var result in results)
foreach (var line in result.LineResults)
headerText.AppendLine(line.Text);
Console.WriteLine(headerText.ToString());
recognizer.Dispose();
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;
// JSON template required before recognition
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
string invoiceTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""Invoice_Header"",
""ReferenceRegionNameArray"": [""HeaderRegion""],
""CharacterModelName"": ""NumberLetter""
}],
""ReferenceRegionArray"": [{
""Name"": ""HeaderRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [0, 0],
""SecondPoint"": [100, 0],
""ThirdPoint"": [100, 20],
""FourthPoint"": [0, 20]
}
}]
}";
recognizer.AppendSettingsFromString(invoiceTemplate);
var results = recognizer.RecognizeFile("invoice.jpg");
var headerText = new StringBuilder();
foreach (var result in results)
foreach (var line in result.LineResults)
headerText.AppendLine(line.Text);
Console.WriteLine(headerText.ToString());
recognizer.Dispose();
Imports Dynamsoft.LabelRecognizer
Imports Dynamsoft.Core
Imports System.Text
' JSON template required before recognition
LabelRecognizer.InitLicense(licenseKey)
Dim recognizer As New LabelRecognizer()
Dim invoiceTemplate As String = "{
""LabelRecognizerParameterArray"": [{
""Name"": ""Invoice_Header"",
""ReferenceRegionNameArray"": [""HeaderRegion""],
""CharacterModelName"": ""NumberLetter""
}],
""ReferenceRegionArray"": [{
""Name"": ""HeaderRegion"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [0, 0],
""SecondPoint"": [100, 0],
""ThirdPoint"": [100, 20],
""FourthPoint"": [0, 20]
}
}]
}"
recognizer.AppendSettingsFromString(invoiceTemplate)
Dim results = recognizer.RecognizeFile("invoice.jpg")
Dim headerText As New StringBuilder()
For Each result In results
For Each line In result.LineResults
headerText.AppendLine(line.Text)
Next
Next
Console.WriteLine(headerText.ToString())
recognizer.Dispose()
IronOCR Ansatz:
using IronOcr;
// No template file — region specified inline, engine auto-configures
var region = new CropRectangle(x: 0, y: 0, width: 1200, height: 200);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
input.Deskew();
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
using IronOcr;
// No template file — region specified inline, engine auto-configures
var region = new CropRectangle(x: 0, y: 0, width: 1200, height: 200);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
input.Deskew();
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' No template file — region specified inline, engine auto-configures
Dim region As New CropRectangle(x:=0, y:=0, width:=1200, height:=200)
Using input As New OcrInput()
input.LoadImage("invoice.jpg", region)
input.Deskew()
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
Der Ansatz von Dynamsoft erfordert das Erstellen, Validieren und Bereitstellen einer JSON-Vorlage, bevor ein Bild verarbeitet wird. Ein Tippfehler in AppendSettingsFromString gibt leere Ergebnisse zur Laufzeit zurück — es gibt keine Validierung zur Kompilierungszeit. IronOCR's CropRectangle ist ein einfacher Konstruktor: Typprüfung zur Kompilierungszeit, keine externen Dateien, kein Bereitstellungsartifakt. Eine Übersicht aller Targeting-Muster finden Sie im regionsbasierten OCR-Leitfaden .
VIN-Code-Scanning mit Regionsmigration
Die Extraktion von Fahrzeugidentifikationsnummern ist eine Spezialität von Dynamsoft Label Recognizer. Das VIN-Vorlagenmodell ist auf das spezifische 17-stellige alphanumerische Format optimiert. Die Migration zu IronOCR ersetzt das Template-Modell durch eine Vorverarbeitungspipeline und Regionsausrichtung, die die gleichen VIN-Schildbedingungen verarbeitet, ohne dass eine Zeichenmodellkonfiguration erforderlich ist.
Dynamsoft-Ansatz:
using Dynamsoft.LabelRecognizer;
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
// VIN requires a specific character model and region configuration
string vinTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Scan"",
""ReferenceRegionNameArray"": [""VIN_Zone""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VIN_Zone"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [10, 35],
""SecondPoint"": [90, 35],
""ThirdPoint"": [90, 65],
""FourthPoint"": [10, 65]
}
}]
}";
recognizer.AppendSettingsFromString(vinTemplate);
var results = recognizer.RecognizeFile("vehicle-vin.jpg");
string rawVin = results
.SelectMany(r => r.LineResults)
.Select(l => l.Text)
.FirstOrDefault() ?? string.Empty;
Console.WriteLine($"Raw VIN text: {rawVin}"); // still requires validation
recognizer.Dispose();
using Dynamsoft.LabelRecognizer;
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
// VIN requires a specific character model and region configuration
string vinTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Scan"",
""ReferenceRegionNameArray"": [""VIN_Zone""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VIN_Zone"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [10, 35],
""SecondPoint"": [90, 35],
""ThirdPoint"": [90, 65],
""FourthPoint"": [10, 65]
}
}]
}";
recognizer.AppendSettingsFromString(vinTemplate);
var results = recognizer.RecognizeFile("vehicle-vin.jpg");
string rawVin = results
.SelectMany(r => r.LineResults)
.Select(l => l.Text)
.FirstOrDefault() ?? string.Empty;
Console.WriteLine($"Raw VIN text: {rawVin}"); // still requires validation
recognizer.Dispose();
Imports Dynamsoft.LabelRecognizer
LabelRecognizer.InitLicense(licenseKey)
Dim recognizer As New LabelRecognizer()
' VIN requires a specific character model and region configuration
Dim vinTemplate As String = "{
""LabelRecognizerParameterArray"": [{
""Name"": ""VIN_Scan"",
""ReferenceRegionNameArray"": [""VIN_Zone""],
""CharacterModelName"": ""VIN""
}],
""ReferenceRegionArray"": [{
""Name"": ""VIN_Zone"",
""Localization"": {
""SourceType"": ""LST_MANUAL_SPECIFICATION"",
""FirstPoint"": [10, 35],
""SecondPoint"": [90, 35],
""ThirdPoint"": [90, 65],
""FourthPoint"": [10, 65]
}
}]
}"
recognizer.AppendSettingsFromString(vinTemplate)
Dim results = recognizer.RecognizeFile("vehicle-vin.jpg")
Dim rawVin As String = results _
.SelectMany(Function(r) r.LineResults) _
.Select(Function(l) l.Text) _
.FirstOrDefault() OrElse String.Empty
Console.WriteLine($"Raw VIN text: {rawVin}") ' still requires validation
recognizer.Dispose()
IronOCR Ansatz:
using IronOcr;
using System.Text.RegularExpressions;
// Target the VIN plate region directly — no template file
var vinRegion = new CropRectangle(x: 100, y: 350, width: 800, height: 300);
using var input = new OcrInput();
input.LoadImage("vehicle-vin.jpg", vinRegion);
input.Contrast(); // recover faded stamped digits
input.Sharpen(); // clarify character boundaries on embossed plates
var result = new IronTesseract().Read(input);
// VIN: 17 chars, no I/O/Q
var vinMatch = Regex.Match(result.Text, @"\b[A-HJ-NPR-Z0-9]{17}\b");
string vin = vinMatch.Success ? vinMatch.Value : result.Text.Trim();
Console.WriteLine($"VIN: {vin}");
Console.WriteLine($"Confidence: {result.Confidence}%");
using IronOcr;
using System.Text.RegularExpressions;
// Target the VIN plate region directly — no template file
var vinRegion = new CropRectangle(x: 100, y: 350, width: 800, height: 300);
using var input = new OcrInput();
input.LoadImage("vehicle-vin.jpg", vinRegion);
input.Contrast(); // recover faded stamped digits
input.Sharpen(); // clarify character boundaries on embossed plates
var result = new IronTesseract().Read(input);
// VIN: 17 chars, no I/O/Q
var vinMatch = Regex.Match(result.Text, @"\b[A-HJ-NPR-Z0-9]{17}\b");
string vin = vinMatch.Success ? vinMatch.Value : result.Text.Trim();
Console.WriteLine($"VIN: {vin}");
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
Imports System.Text.RegularExpressions
' Target the VIN plate region directly — no template file
Dim vinRegion As New CropRectangle(x:=100, y:=350, width:=800, height:=300)
Using input As New OcrInput()
input.LoadImage("vehicle-vin.jpg", vinRegion)
input.Contrast() ' recover faded stamped digits
input.Sharpen() ' clarify character boundaries on embossed plates
Dim result = New IronTesseract().Read(input)
' VIN: 17 chars, no I/O/Q
Dim vinMatch = Regex.Match(result.Text, "\b[A-HJ-NPR-Z0-9]{17}\b")
Dim vin As String = If(vinMatch.Success, vinMatch.Value, result.Text.Trim())
Console.WriteLine($"VIN: {vin}")
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
CropRectangle-Koordinaten verwenden denselben Pixelreferenzrahmen wie Dynamsofts prozentbasierte SecondPoint-Spezifikation — konvertieren Sie, indem Sie Dynamsofts Prozentwerte mit Ihren Bilddimensionen multiplizieren. Die Vorverarbeitungspipeline (Contrast, Sharpen) ersetzt die Zeichnungsmodelloptimierung, die Dynamsoft in seine VIN-Vorlage einbaut. Der Leitfaden zur Bildqualitätskorrektur behandelt die Filterauswahl für geprägte und kontrastarme Oberflächen.
Stapelverarbeitung von mehrseitigen TIFF-Dateien
Dynamsoft Label Recognizer verarbeitet Einzelbilder. Mehrseitige TIFF-Dokumente – die in Dokumentenmanagementsystemen, medizinischen Bildarchiven und Fax-Pipelines üblich sind – erfordern eine externe Iteration: Laden Sie jedes Einzelbild, leiten Sie es einzeln durch den Erkennungsalgorithmus und aggregieren Sie die Ergebnisse.IronOCR verarbeitet mehrseitige TIFF-Dateien nativ über LoadImageFrames.
Dynamsoft-Ansatz:
using Dynamsoft.LabelRecognizer;
// Requires an external TIFF library to extract frames
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(genericTemplate);
// External library needed to iterate TIFF frames
var tiffImage = System.Drawing.Image.FromFile("scanned-batch.tiff");
int frameCount = tiffImage.GetFrameCount(
System.Drawing.Imaging.FrameDimension.Page);
var allText = new StringBuilder();
for (int i = 0; i < frameCount; i++)
{
tiffImage.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
string tempPath = $"frame_{i}.jpg";
tiffImage.Save(tempPath, System.Drawing.Imaging.ImageFormat.Jpeg);
var results = recognizer.RecognizeFile(tempPath);
foreach (var r in results)
foreach (var line in r.LineResults)
allText.AppendLine(line.Text);
System.IO.File.Delete(tempPath); // clean up temp files
}
Console.WriteLine(allText.ToString());
recognizer.Dispose();
using Dynamsoft.LabelRecognizer;
// Requires an external TIFF library to extract frames
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(genericTemplate);
// External library needed to iterate TIFF frames
var tiffImage = System.Drawing.Image.FromFile("scanned-batch.tiff");
int frameCount = tiffImage.GetFrameCount(
System.Drawing.Imaging.FrameDimension.Page);
var allText = new StringBuilder();
for (int i = 0; i < frameCount; i++)
{
tiffImage.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
string tempPath = $"frame_{i}.jpg";
tiffImage.Save(tempPath, System.Drawing.Imaging.ImageFormat.Jpeg);
var results = recognizer.RecognizeFile(tempPath);
foreach (var r in results)
foreach (var line in r.LineResults)
allText.AppendLine(line.Text);
System.IO.File.Delete(tempPath); // clean up temp files
}
Console.WriteLine(allText.ToString());
recognizer.Dispose();
Imports Dynamsoft.LabelRecognizer
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports System.Text
' Requires an external TIFF library to extract frames
LabelRecognizer.InitLicense(licenseKey)
Dim recognizer As New LabelRecognizer()
recognizer.AppendSettingsFromString(genericTemplate)
' External library needed to iterate TIFF frames
Dim tiffImage As Image = Image.FromFile("scanned-batch.tiff")
Dim frameCount As Integer = tiffImage.GetFrameCount(FrameDimension.Page)
Dim allText As New StringBuilder()
For i As Integer = 0 To frameCount - 1
tiffImage.SelectActiveFrame(FrameDimension.Page, i)
Dim tempPath As String = $"frame_{i}.jpg"
tiffImage.Save(tempPath, Imaging.ImageFormat.Jpeg)
Dim results = recognizer.RecognizeFile(tempPath)
For Each r In results
For Each line In r.LineResults
allText.AppendLine(line.Text)
Next
Next
File.Delete(tempPath) ' clean up temp files
Next
Console.WriteLine(allText.ToString())
recognizer.Dispose()
IronOCR Ansatz:
using IronOcr;
// No frame iteration, no temp files, no external TIFF library
using var input = new OcrInput();
input.LoadImageFrames("scanned-batch.tiff"); // loads all frames natively
input.Deskew();
input.DeNoise();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Results organized per page
foreach (var page in result.Pages)
{
Console.WriteLine($"Frame {page.PageNumber}: {page.Lines.Count} lines");
Console.WriteLine(page.Text);
}
// Save entire batch as a single searchable PDF
result.SaveAsSearchablePdf("batch-searchable.pdf");
using IronOcr;
// No frame iteration, no temp files, no external TIFF library
using var input = new OcrInput();
input.LoadImageFrames("scanned-batch.tiff"); // loads all frames natively
input.Deskew();
input.DeNoise();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Results organized per page
foreach (var page in result.Pages)
{
Console.WriteLine($"Frame {page.PageNumber}: {page.Lines.Count} lines");
Console.WriteLine(page.Text);
}
// Save entire batch as a single searchable PDF
result.SaveAsSearchablePdf("batch-searchable.pdf");
Imports IronOcr
' No frame iteration, no temp files, no external TIFF library
Using input As New OcrInput()
input.LoadImageFrames("scanned-batch.tiff") ' loads all frames natively
input.Deskew()
input.DeNoise()
Dim ocr As New IronTesseract()
Dim result = ocr.Read(input)
' Results organized per page
For Each page In result.Pages
Console.WriteLine($"Frame {page.PageNumber}: {page.Lines.Count} lines")
Console.WriteLine(page.Text)
Next
' Save entire batch as a single searchable PDF
result.SaveAsSearchablePdf("batch-searchable.pdf")
End Using
Der Ansatz von Dynamsoft erfordert System.Drawing zur Rahmenerkennung, eine temporäre Datei pro Rahmen auf der Festplatte und manuelle Bereinigung nach jedem Durchlauf. IronOCR's LoadImageFrames liest alle Rahmen in einem einzigen Aufruf — keine temporären Dateien, kein Rahmendex-Tracking. Nach der OCR archiviert SaveAsSearchablePdf das gesamte Paket als durchsuchbares Dokument in einem Methodenaufruf. Der Leitfaden für die Mehrbild-TIFF-Konvertierung und der Leitfaden für die durchsuchbare PDF-Ausgabe beschreiben beide Funktionen im Detail.
Strukturierte Ergebnisanalyse auf Wortebene
Dynamsoft RecognizeFile gibt ein DLRResult Array zurück. Jeder DLRResult enthält eine LineResults Sammlung von DLRLineResult Objekten mit einer Text Eigenschaft und einer Location Eigenschaft, die das Begrenzungsviereck hält. Um die Positionen auf Wortebene zu extrahieren, muss der Zeilentext an den Leerzeichen geteilt und der Zeilenbegrenzungsrahmen proportional geteilt werden – eine Näherung, die bei proportionalen Schriftarten nicht funktioniert.IronOCR stellt wortbasierte Umrahmungen als typisierte Eigenschaften an jedem OcrResult.Word-Objekt zur Verfügung.
Dynamsoft-Ansatz:
using Dynamsoft.LabelRecognizer;
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(settingsJson);
var results = recognizer.RecognizeFile("form-scan.jpg");
foreach (var dlrResult in results)
{
foreach (var lineResult in dlrResult.LineResults)
{
// Line-level data only — word boundaries are not provided
Console.WriteLine($"Text: {lineResult.Text}");
Console.WriteLine($"Confidence: {lineResult.Confidence}");
// Location is a quadrilateral — four corner points
var loc = lineResult.Location;
Console.WriteLine($"Top-left: ({loc.Points[0].X}, {loc.Points[0].Y})");
// To get word positions: split text and divide bounding box manually
var words = lineResult.Text.Split(' ');
int approxWidth = (loc.Points[1].X - loc.Points[0].X) / words.Length;
for (int i = 0; i < words.Length; i++)
{
int wordX = loc.Points[0].X + (i * approxWidth);
Console.WriteLine($" Word '{words[i]}' approx at x={wordX}");
}
}
}
recognizer.Dispose();
using Dynamsoft.LabelRecognizer;
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(settingsJson);
var results = recognizer.RecognizeFile("form-scan.jpg");
foreach (var dlrResult in results)
{
foreach (var lineResult in dlrResult.LineResults)
{
// Line-level data only — word boundaries are not provided
Console.WriteLine($"Text: {lineResult.Text}");
Console.WriteLine($"Confidence: {lineResult.Confidence}");
// Location is a quadrilateral — four corner points
var loc = lineResult.Location;
Console.WriteLine($"Top-left: ({loc.Points[0].X}, {loc.Points[0].Y})");
// To get word positions: split text and divide bounding box manually
var words = lineResult.Text.Split(' ');
int approxWidth = (loc.Points[1].X - loc.Points[0].X) / words.Length;
for (int i = 0; i < words.Length; i++)
{
int wordX = loc.Points[0].X + (i * approxWidth);
Console.WriteLine($" Word '{words[i]}' approx at x={wordX}");
}
}
}
recognizer.Dispose();
Imports Dynamsoft.LabelRecognizer
LabelRecognizer.InitLicense(licenseKey)
Dim recognizer As New LabelRecognizer()
recognizer.AppendSettingsFromString(settingsJson)
Dim results = recognizer.RecognizeFile("form-scan.jpg")
For Each dlrResult In results
For Each lineResult In dlrResult.LineResults
' Line-level data only — word boundaries are not provided
Console.WriteLine($"Text: {lineResult.Text}")
Console.WriteLine($"Confidence: {lineResult.Confidence}")
' Location is a quadrilateral — four corner points
Dim loc = lineResult.Location
Console.WriteLine($"Top-left: ({loc.Points(0).X}, {loc.Points(0).Y})")
' To get word positions: split text and divide bounding box manually
Dim words = lineResult.Text.Split(" "c)
Dim approxWidth As Integer = (loc.Points(1).X - loc.Points(0).X) \ words.Length
For i As Integer = 0 To words.Length - 1
Dim wordX As Integer = loc.Points(0).X + (i * approxWidth)
Console.WriteLine($" Word '{words(i)}' approx at x={wordX}")
Next
Next
Next
recognizer.Dispose()
IronOCR Ansatz:
using IronOcr;
var result = new IronTesseract().Read("form-scan.jpg");
// Word-level positions are first-class properties — no manual division
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
foreach (var line in paragraph.Lines)
{
foreach (var word in line.Words)
{
Console.WriteLine(
$" Word: '{word.Text}' " +
$"at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence}%");
}
}
}
}
using IronOcr;
var result = new IronTesseract().Read("form-scan.jpg");
// Word-level positions are first-class properties — no manual division
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
foreach (var line in paragraph.Lines)
{
foreach (var word in line.Words)
{
Console.WriteLine(
$" Word: '{word.Text}' " +
$"at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence}%");
}
}
}
}
Imports IronOcr
Dim result = New IronTesseract().Read("form-scan.jpg")
' Word-level positions are first-class properties — no manual division
For Each page In result.Pages
For Each paragraph In page.Paragraphs
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}")
For Each line In paragraph.Lines
For Each word In line.Words
Console.WriteLine(
$" Word: '{word.Text}' " &
$"at ({word.X},{word.Y}) " &
$"size {word.Width}x{word.Height} " &
$"confidence {word.Confidence}%")
Next
Next
Next
Next
IronOCR bietet eine echte Hierarchie: Seiten enthalten Absätze, Absätze enthalten Zeilen, Zeilen enthalten Wörter, Wörter enthalten Zeichen. Jede Ebene offenbart .X, .Y, .Width, .Height und .Confidence als typisierte Ganzzahl- und Double-Eigenschaften — keine Berechnungen mit Umrahmungskoordinaten erforderlich. Der Leitfaden für strukturierte Ergebnisse dokumentiert jede zugängliche Eigenschaft, und der Leitfaden zur Konfidenzbewertung erläutert die Konfidenzschwellenwerte für automatisierte Dokumentenprüfungs-Pipelines.
Asynchrone Parallelverarbeitung für das Scannen großer Mengen von Etiketten
Dynamsoft Label Recognizer ist Thread-safe, aber sein RecognizeFile-Aufruf ist synchron. Das Einwickeln in Task.Run führt zu paralleler Verarbeitung, aber jeder Aufruf teilt den Konfigurationsstatus über AppendSettingsFromString — das Laden von Vorlagen auf mehreren Threads erfordert eine sorgfältige Initialisierungssequenzierung. IronOCR's IronTesseract-Instanzen sind unabhängig: Erstellen Sie eine pro Aufgabe, rufen Sie Read auf, und das Thread-Modell ist einfach.
Dynamsoft-Ansatz:
using Dynamsoft.LabelRecognizer;
using System.Threading.Tasks;
// InitLicense must be called once before parallel work begins
LabelRecognizer.InitLicense(licenseKey);
// Each thread needs its own recognizer instance with its own template load
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
await Task.WhenAll(imagePaths.Select(async path =>
{
// Cannot share recognizer instances safely across tasks
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(templateJson); // reload JSON per instance
await Task.Run(() =>
{
var dlrResults = recognizer.RecognizeFile(path);
var text = string.Join("\n",
dlrResults.SelectMany(r => r.LineResults).Select(l => l.Text));
results.Add(text);
});
recognizer.Dispose();
}));
Console.WriteLine($"Processed {results.Count} images");
using Dynamsoft.LabelRecognizer;
using System.Threading.Tasks;
// InitLicense must be called once before parallel work begins
LabelRecognizer.InitLicense(licenseKey);
// Each thread needs its own recognizer instance with its own template load
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
await Task.WhenAll(imagePaths.Select(async path =>
{
// Cannot share recognizer instances safely across tasks
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(templateJson); // reload JSON per instance
await Task.Run(() =>
{
var dlrResults = recognizer.RecognizeFile(path);
var text = string.Join("\n",
dlrResults.SelectMany(r => r.LineResults).Select(l => l.Text));
results.Add(text);
});
recognizer.Dispose();
}));
Console.WriteLine($"Processed {results.Count} images");
Imports Dynamsoft.LabelRecognizer
Imports System.Threading.Tasks
Imports System.Collections.Concurrent
' InitLicense must be called once before parallel work begins
LabelRecognizer.InitLicense(licenseKey)
' Each thread needs its own recognizer instance with its own template load
Dim results As New ConcurrentBag(Of String)()
Await Task.WhenAll(imagePaths.Select(Async Function(path)
' Cannot share recognizer instances safely across tasks
Dim recognizer As New LabelRecognizer()
recognizer.AppendSettingsFromString(templateJson) ' reload JSON per instance
Await Task.Run(Sub()
Dim dlrResults = recognizer.RecognizeFile(path)
Dim text = String.Join(vbLf, dlrResults.SelectMany(Function(r) r.LineResults).Select(Function(l) l.Text))
results.Add(text)
End Sub)
recognizer.Dispose()
End Function))
Console.WriteLine($"Processed {results.Count} images")
IronOCR Ansatz:
using IronOcr;
using System.Collections.Concurrent;
using System.Threading.Tasks;
var extractedTexts = new ConcurrentDictionary<string, string>();
// Each IronTesseract instance is independent — no shared state
Parallel.ForEach(imagePaths, imagePath =>
{
var ocr = new IronTesseract();
var result = ocr.Read(imagePath);
extractedTexts[imagePath] = result.Text;
});
foreach (var (path, text) in extractedTexts)
Console.WriteLine($"{System.IO.Path.GetFileName(path)}: {text.Length} characters");
using IronOcr;
using System.Collections.Concurrent;
using System.Threading.Tasks;
var extractedTexts = new ConcurrentDictionary<string, string>();
// Each IronTesseract instance is independent — no shared state
Parallel.ForEach(imagePaths, imagePath =>
{
var ocr = new IronTesseract();
var result = ocr.Read(imagePath);
extractedTexts[imagePath] = result.Text;
});
foreach (var (path, text) in extractedTexts)
Console.WriteLine($"{System.IO.Path.GetFileName(path)}: {text.Length} characters");
Imports IronOcr
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Dim extractedTexts As New ConcurrentDictionary(Of String, String)()
' Each IronTesseract instance is independent — no shared state
Parallel.ForEach(imagePaths, Sub(imagePath)
Dim ocr As New IronTesseract()
Dim result = ocr.Read(imagePath)
extractedTexts(imagePath) = result.Text
End Sub)
For Each kvp In extractedTexts
Dim path = kvp.Key
Dim text = kvp.Value
Console.WriteLine($"{System.IO.Path.GetFileName(path)}: {text.Length} characters")
Next
IronOCR benötigt keine Initialisierungssequenz, bevor die parallele Verarbeitung beginnt. Eine IronOcr.License.LicenseKey-Zuweisung beim Anwendungsstart aktiviert alle Instanzen. Kein Neuladen der Vorlage pro Thread, keine JSON-Validierung pro Instanz. Für nicht blockierende serverseitige Szenarien deckt der asynchrone OCR-Leitfaden await-basierte Muster für ASP.NET Core und Azure Functions ab.
Durchsuchbare PDF-Ausgabe aus gescannten Etikettenarchiven
Dynamsoft verfügt über keinerlei PDF-Ausgabefunktion. Über Dynamsoft verarbeitete gescannte Etikettenarchive bleiben reine Bilddateien – sie sind nicht durchsuchbar, können von Dokumentenmanagementsystemen nicht indexiert werden und entsprechen nicht den PDF/A-Archivierungsstandards.IronOCR fügt durchsuchbare PDF-Ausgaben als einzigen Methodenaufruf am OcrResult-Objekt hinzu.
Dynamsoft-Ansatz:
using Dynamsoft.LabelRecognizer;
// Process scanned label — extract text into a string
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(labelTemplate);
var results = recognizer.RecognizeFile("scanned-labels.jpg");
var extractedText = new StringBuilder();
foreach (var r in results)
foreach (var line in r.LineResults)
extractedText.AppendLine(line.Text);
// Cannot create a searchable PDF — save text to a sidecar .txt file instead
System.IO.File.WriteAllText("scanned-labels.txt", extractedText.ToString());
// The original image remains unsearchable
Console.WriteLine("No PDF output available in Dynamsoft Label Recognizer.");
recognizer.Dispose();
using Dynamsoft.LabelRecognizer;
// Process scanned label — extract text into a string
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(labelTemplate);
var results = recognizer.RecognizeFile("scanned-labels.jpg");
var extractedText = new StringBuilder();
foreach (var r in results)
foreach (var line in r.LineResults)
extractedText.AppendLine(line.Text);
// Cannot create a searchable PDF — save text to a sidecar .txt file instead
System.IO.File.WriteAllText("scanned-labels.txt", extractedText.ToString());
// The original image remains unsearchable
Console.WriteLine("No PDF output available in Dynamsoft Label Recognizer.");
recognizer.Dispose();
Imports Dynamsoft.LabelRecognizer
Imports System.IO
Imports System.Text
' Process scanned label — extract text into a string
LabelRecognizer.InitLicense(licenseKey)
Dim recognizer = New LabelRecognizer()
recognizer.AppendSettingsFromString(labelTemplate)
Dim results = recognizer.RecognizeFile("scanned-labels.jpg")
Dim extractedText = New StringBuilder()
For Each r In results
For Each line In r.LineResults
extractedText.AppendLine(line.Text)
Next
Next
' Cannot create a searchable PDF — save text to a sidecar .txt file instead
File.WriteAllText("scanned-labels.txt", extractedText.ToString())
' The original image remains unsearchable
Console.WriteLine("No PDF output available in Dynamsoft Label Recognizer.")
recognizer.Dispose()
IronOCR Ansatz:
using IronOcr;
// Read, preprocess, and produce a searchable PDF archive in one pipeline
using var input = new OcrInput();
input.LoadImage("scanned-labels.jpg");
input.Deskew();
input.Contrast();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Searchable PDF: original image layer preserved, invisible text layer added
result.SaveAsSearchablePdf("scanned-labels-searchable.pdf");
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
Console.WriteLine($"Extracted text preview: {result.Text.Substring(0, 100)}");
using IronOcr;
// Read, preprocess, and produce a searchable PDF archive in one pipeline
using var input = new OcrInput();
input.LoadImage("scanned-labels.jpg");
input.Deskew();
input.Contrast();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Searchable PDF: original image layer preserved, invisible text layer added
result.SaveAsSearchablePdf("scanned-labels-searchable.pdf");
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
Console.WriteLine($"Extracted text preview: {result.Text.Substring(0, 100)}");
Imports IronOcr
' Read, preprocess, and produce a searchable PDF archive in one pipeline
Using input As New OcrInput()
input.LoadImage("scanned-labels.jpg")
input.Deskew()
input.Contrast()
Dim ocr As New IronTesseract()
Dim result = ocr.Read(input)
' Searchable PDF: original image layer preserved, invisible text layer added
result.SaveAsSearchablePdf("scanned-labels-searchable.pdf")
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%")
Console.WriteLine($"Extracted text preview: {result.Text.Substring(0, 100)}")
End Using
Die durchsuchbare PDF-Ausgabe bewahrt das ursprüngliche Scanbild in voller Auflösung und fügt eine unsichtbare OCR-Textebene darüber hinzu. Dokumentenmanagementsysteme, Suchindizes und PDF-Viewer können nun den Etiketteninhalt durchsuchen. Die durchsuchbare PDF-Anleitung und der Leitfaden zur Verarbeitung gescannter Dokumente behandeln mehrseitige Archive und Arbeitsabläufe zur Stapelkonvertierung.
Dynamsoft OCR API zu IronOCR Mapping-Referenz
| Dynamsoft Label Recognizer | IronOCR-Äquivalent |
|---|---|
LabelRecognizer.InitLicense(key) |
IronOcr.License.LicenseKey = key |
new LabelRecognizer() |
new IronTesseract() |
recognizer.AppendSettingsFromString(json) |
Nicht erforderlich – automatisch konfiguriert |
recognizer.RecognizeFile(path) |
ocr.Read(path) |
recognizer.RecognizeByFile(path, templateName) |
ocr.Read(path) |
recognizer.RecognizeBuffer(buffer, width, height, ...) |
input.LoadImage(imageBytes) dann ocr.Read(input) |
DLRResult[] (Array von Ergebnissen) |
OcrResult (einzelnes Ergebnisobjekt) |
DLRResult.LineResults |
OcrResult.Lines |
DLRLineResult.Text |
OcrResult.Line.Text |
DLRLineResult.Confidence |
OcrResult.Line.Words[i].Confidence |
DLRLineResult.Location.Points[i] |
OcrResult.Line.X, .Y, .Width, .Height |
ReferenceRegionArray (JSON) |
new CropRectangle(x, y, w, h) |
LabelRecognizerParameterArray (JSON) |
Nicht erforderlich |
CharacterModelName in Vorlage |
Nicht erforderlich |
recognizer.Dispose() |
using var ocr = new IronTesseract() |
| Keine PDF-Eingabeunterstützung | input.LoadPdf(path) |
| Keine durchsuchbare PDF-Ausgabe | result.SaveAsSearchablePdf(path) |
| Keine mehrseitige TIFF-Eingabe | input.LoadImageFrames(path) |
| Barcode-Lesung (separates Produkt) | ocr.Configuration.ReadBarCodes = true |
Mehrere InitLicense-Aufrufe (pro Produkt) |
Einzelne IronOcr.License.LicenseKey Zuweisung |
Gängige Migrationsprobleme und Lösungen
Problem 1: AppendSettingsFromString liefert nach der Migration leere Ergebnisse.
Dynamsoft: Die Erkennung gibt geräuschlos leere DLRResult Arrays zurück, wenn AppendSettingsFromString eine fehlerhafte JSON-Zeichenkette erhält. Es wird keine Ausnahme ausgelöst. Teams, die von Dynamsoft migrieren, fügen manchmal defensive Nullprüfungen in ihren Ergebnis-Parsing-Code ein, um sich vor diesem stillen Fehler zu schützen.
Lösung: Entfernen Sie AppendSettingsFromString vollständig.IronOCR benötigt keine Template-Konfiguration. Wenn ein spezielles Regionentargeting erforderlich ist, ersetzen Sie das ReferenceRegionArray JSON durch ein CropRectangle:
// Remove all AppendSettingsFromString calls
// Replace region JSON with a CropRectangle constructor
var region = new CropRectangle(x: 0, y: 400, width: 1200, height: 300);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
// Remove all AppendSettingsFromString calls
// Replace region JSON with a CropRectangle constructor
var region = new CropRectangle(x: 0, y: 400, width: 1200, height: 300);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
Imports System
' Remove all AppendSettingsFromString calls
' Replace region JSON with a CropRectangle constructor
Dim region As New CropRectangle(x:=0, y:=400, width:=1200, height:=300)
Using input As New OcrInput()
input.LoadImage(imagePath, region)
Dim result = New IronTesseract().Read(input)
End Using
Die IronTesseract-Einrichtungsanleitung dokumentiert alle Engine-Konfigurationsoptionen, die als Eigenschaften anstatt als JSON-Zeichenketten festgelegt werden können.
Problem 2: Mehrere InitLicense-Aufrufe beim Anwendungsstart
Dynamsoft: Eine Anwendung, die Label Recognizer, Barcode Reader und Document Normalizer verwendet, ruft beim Start drei separate InitLicense Methoden auf, die jeweils ihren eigenen Lizenzschlüssel erfordern. Teams speichern drei Umgebungsvariablen, rotieren drei Schlüssel unabhängig voneinander und beheben drei separate Initialisierungsfehler.
Lösung: Entfernen Sie alle Dynamsoft InitLicense Aufrufe. Ersetzen Sie dies durch eine IronOCR Zeile:
// Remove:
// LabelRecognizer.InitLicense(mrzKey);
// BarcodeReader.InitLicense(barcodeKey);
// DocumentNormalizer.InitLicense(docKey);
// Add once, at application startup:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Remove:
// LabelRecognizer.InitLicense(mrzKey);
// BarcodeReader.InitLicense(barcodeKey);
// DocumentNormalizer.InitLicense(docKey);
// Add once, at application startup:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Remove:
' LabelRecognizer.InitLicense(mrzKey)
' BarcodeReader.InitLicense(barcodeKey)
' DocumentNormalizer.InitLicense(docKey)
' Add once, at application startup:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
Eine einzige Umgebungsvariable aktiviert alle IronOCR Funktionen – OCR, Barcodes, PDF-Verarbeitung und alle über 125 Sprachen – ohne dass eine Initialisierung für jede einzelne Funktion erforderlich ist.
Problem 3: Die Textaggregation von LineResult erzeugt fehlerhafte Ausgabe
Dynamsoft: RecognizeFile gibt pro erkannter Etikettenregion ein DLRResult zurück. Anwendungen, die lineResult.Text über alle Ergebnisse hinweg mit \n-Trennzeichen zusammenfügen, erzeugen eine Ausgabe, die Zeilen aus verschiedenen Etikettenzonen auf der Seite vermischt — da die Reihenfolge von DLRResult Objekten die Regionenerkennungsfolge ist, nicht die Lesereihenfolge.
Lösung: Die Ergebnishierarchie von IronOCR organisiert die Ausgabe in Lesereihenfolge. Verwenden Sie die Pages → Paragraphs → Lines Struktur, um Text in natürlicher Dokumentreihenfolge zuzugreifen:
var result = new IronTesseract().Read(imagePath);
// Reading-order text — no manual aggregation
Console.WriteLine(result.Text);
// Or access paragraph-level groupings
foreach (var paragraph in result.Pages[0].Paragraphs)
Console.WriteLine(paragraph.Text);
var result = new IronTesseract().Read(imagePath);
// Reading-order text — no manual aggregation
Console.WriteLine(result.Text);
// Or access paragraph-level groupings
foreach (var paragraph in result.Pages[0].Paragraphs)
Console.WriteLine(paragraph.Text);
Imports IronOcr
Dim result = New IronTesseract().Read(imagePath)
' Reading-order text — no manual aggregation
Console.WriteLine(result.Text)
' Or access paragraph-level groupings
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine(paragraph.Text)
Next
Problem 4: Fehlende JSON-Vorlagendateien auf dem Bereitstellungsserver
Dynamsoft: Template-JSON-Dateien sind separate Bereitstellungsartefakte. Wenn eine Vorlagendatei fehlt oder auf einem neuen Server einen falschen Pfad hat, schlägt AppendSettingsFromString fehl — manchmal geräuschlos, manchmal mit einer Laufzeitausnahme — und die Bereitstellung bricht die Erkennung ohne Änderung am Anwendungscode.
Lösung:IronOCR verfügt über keine Vorlagendateien. Nach dem Ersetzen des NuGet Pakets und dem Aktualisieren der Namespaces reduziert sich die Liste der Bereitstellungsartefakte auf die Anwendungsbinärdateien und eine Umgebungsvariable. Fügen Sie bei Bedarf eine Startvalidierungsprüfung hinzu:
// Validate license at startup — no template files to check
if (!IronOcr.License.IsValidLicense)
throw new InvalidOperationException("IronOCR license key is invalid or missing.");
var ocr = new IronTesseract();
// Ready to process — no file dependencies
// Validate license at startup — no template files to check
if (!IronOcr.License.IsValidLicense)
throw new InvalidOperationException("IronOCR license key is invalid or missing.");
var ocr = new IronTesseract();
// Ready to process — no file dependencies
Imports IronOcr
' Validate license at startup — no template files to check
If Not IronOcr.License.IsValidLicense Then
Throw New InvalidOperationException("IronOCR license key is invalid or missing.")
End If
Dim ocr As New IronTesseract()
' Ready to process — no file dependencies
Ausgabe 5: Entsorgungskettenmanagement für mehrere Produkte
Dynamsoft: Each Dynamsoft product instance (LabelRecognizer, BarcodeReader, DocumentNormalizer) implements IDisposable. Dienstklassen, die mehrere Produkte aggregieren, tragen mehrstufige Dispose Implementierungen, und das Fehlen eines Dispose-Aufrufs bei einer Produktinstanz verursacht native Ressourcenlecks, die sich als Speicherwachstum unter Last manifestieren.
Lösung: IronOCR's IronTesseract und OcrInput implementieren beide IDisposable, aber das Entsorgungsmodell ist einfacher — eine Klasse, ein Muster. Registrieren Sie eine einzelne IronTesseract Instanz im DI-Container als Singleton oder verwenden Sie using Blöcke für kurzlebige Instanzen:
// Short-lived pattern
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = new IronTesseract().Read(input);
// Long-lived singleton (register in Program.cs)
builder.Services.AddSingleton<IronTesseract>();
// Short-lived pattern
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = new IronTesseract().Read(input);
// Long-lived singleton (register in Program.cs)
builder.Services.AddSingleton<IronTesseract>();
Imports IronOcr
' Short-lived pattern
Using input As New OcrInput()
input.LoadImage(imagePath)
Dim result = (New IronTesseract()).Read(input)
End Using
' Long-lived singleton (register in Program.vb)
builder.Services.AddSingleton(Of IronTesseract)()
Der Leitfaden zur Fortschrittsverfolgung behandelt das Lebenszyklusmanagement für langlaufende Batch-Jobs, und der Leitfaden zur asynchronen OCR zeigt Singleton-Muster in ASP.NET Core.
Problem 6: Zeichenmodell für benutzerdefiniertes Etikettenformat nicht verfügbar
Dynamsoft: Das CharacterModelName Feld in einer Vorlage referenziert eine Modelldatei, die im Dynamsoft-SDK-Installationsverzeichnis existieren muss. Für die Erstellung benutzerdefinierter Charaktermodelle müssen zusätzliche Modelldateien vom Dynamsoft-Portal heruntergeladen und im korrekten SDK-Pfad platziert werden. Ein fehlendes Modell führt dazu, dass die Erkennung mit einem kryptischen Laufzeitfehler fehlschlägt.
Lösung:IronOCR verwendet keine Zeichenmodelldateien. Für benutzerdefinierte oder spezielle Schriftarten verwenden Sie benutzerdefiniertes Sprachtraining:
// No character model files needed
// For specialized fonts, use a custom language pack
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English; // or load a custom trained pack
using var input = new OcrInput();
input.LoadImage(specializedFontImage);
input.Binarize(); // helps with specialized font clarity
var result = ocr.Read(input);
// No character model files needed
// For specialized fonts, use a custom language pack
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English; // or load a custom trained pack
using var input = new OcrInput();
input.LoadImage(specializedFontImage);
input.Binarize(); // helps with specialized font clarity
var result = ocr.Read(input);
Imports IronTesseract
' No character model files needed
' For specialized fonts, use a custom language pack
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English ' or load a custom trained pack
Using input As New OcrInput()
input.LoadImage(specializedFontImage)
input.Binarize() ' helps with specialized font clarity
Dim result = ocr.Read(input)
End Using
Der Leitfaden zum Training benutzerdefinierter Schriftarten beschreibt das Training eines benutzerdefinierten Sprachpakets für proprietäre Beschriftungsschriftarten ohne Konfiguration des Dateipfads.
Dynamsoft OCR-Migrations-Checkliste
Vor der Migration
Überprüfen Sie den Quellcode auf alle Dynamsoft-Referenzen:
# Find all Dynamsoft using statements
grep -r "using Dynamsoft" --include="*.cs" .
# Find InitLicense calls (one per product)
grep -r "InitLicense" --include="*.cs" .
# Find AppendSettingsFromString calls (template loads)
grep -r "AppendSettingsFromString" --include="*.cs" .
# Find template JSON strings (inline or file references)
grep -r "LabelRecognizerParameterArray\|ReferenceRegionArray\|CharacterModelName" --include="*.cs" .
# Find RecognizeFile and RecognizeByFile calls
grep -r "RecognizeFile\|RecognizeByFile\|RecognizeBuffer" --include="*.cs" .
# Find LineResult result parsing patterns
grep -r "LineResults\|DLRResult\|DLRLineResult" --include="*.cs" .
# Identify any JSON template files in the project
find . -name "*.json" | xargs grep -l "LabelRecognizerParameterArray" 2>/dev/null
# Find all Dynamsoft using statements
grep -r "using Dynamsoft" --include="*.cs" .
# Find InitLicense calls (one per product)
grep -r "InitLicense" --include="*.cs" .
# Find AppendSettingsFromString calls (template loads)
grep -r "AppendSettingsFromString" --include="*.cs" .
# Find template JSON strings (inline or file references)
grep -r "LabelRecognizerParameterArray\|ReferenceRegionArray\|CharacterModelName" --include="*.cs" .
# Find RecognizeFile and RecognizeByFile calls
grep -r "RecognizeFile\|RecognizeByFile\|RecognizeBuffer" --include="*.cs" .
# Find LineResult result parsing patterns
grep -r "LineResults\|DLRResult\|DLRLineResult" --include="*.cs" .
# Identify any JSON template files in the project
find . -name "*.json" | xargs grep -l "LabelRecognizerParameterArray" 2>/dev/null
Ergebnisse der Inventur:
- Zählen Sie
InitLicense-Aufrufstellen (eine pro verwendetem Dynamsoft-Produkt) - Zählen Sie
AppendSettingsFromString-Aufrufstellen (eine pro Erkennungsvorlage) - Liste aller JSON-Vorlagendateien auf, die nach der Migration gelöscht werden.
- Identifizieren Sie alle
ReferenceRegionArrayDefinitionen (konvertieren inCropRectangle) - Beachten Sie, welche Funktionen durch separate Produkte abgedeckt werden (Barcodes, Dokumentennormalisierung).
Code-Migration
- Entfernen Sie das
Dynamsoft.LabelRecognizerNuGet-Paket (und alle anderen Dynamsoft-Pakete) - Installieren Sie das
IronOcrNuGet-Paket (dotnet add package IronOcr) - Ersetzen Sie alle
using Dynamsoft.LabelRecognizer;undusing Dynamsoft.Core;durchusing IronOcr; - Ersetzen Sie alle
LabelRecognizer.InitLicense(key)-Aufrufe durch ein einzelnesIronOcr.License.LicenseKey = keybeim Anwendungsstart - Entfernen Sie alle
AppendSettingsFromString(json)-Aufrufe — keine Entsprechung erforderlich - Ersetzen Sie
ReferenceRegionArrayJSON-Koordinaten durchnew CropRectangle(x, y, width, height)-Konstruktoren - Ersetzen Sie
new LabelRecognizer()Instanziierung mitnew IronTesseract() - Ersetzen Sie
recognizer.RecognizeFile(path)mitocr.Read(path) - Ersetzen Sie
DLRLineResultErgebnisiteration mit.WordsHierarchie - Ersetzen Sie manuelle
lineResult.TextZeichenfolgenaggregation durchresult.Textoder strukturierte Seitennummerierung - Ersetzen Sie
BarcodeReader.InitLicense+BarcodeReader.DecodeFiledurchocr.Configuration.ReadBarCodes = true - Entfernen Sie Mehrprodukt-
Dispose-Ketten und ersetzen durchusing var ocr = new IronTesseract() - JSON-Vorlagendateien aus dem Projekt und den Bereitstellungsartefakten löschen
- Ersetzen Sie Rahmenschleifen über TIFF-Dateien durch
input.LoadImageFrames(path) - Fügen Sie
result.SaveAsSearchablePdf(outputPath)überall hinzu, wo gescannte Ausgaben archiviert werden müssen
Nach der Migration
- Überprüfen Sie, ob
IronOcr.License.IsValidLicensetruebeim Anwendungsstart zurückgibt - Bestätigen Sie, dass alle Erkennungsergebnisse nicht leere
result.Textfür zuvor funktionierende Eingaben zurückgeben - Überprüfen Sie
result.Confidencean repräsentativen Proben — Werte über 80% zeigen gute Erkennungsqualität an - Testen Sie die Regionserkennungsgenauigkeit, indem Sie
CropRectangle-Ausgaben mit früheren Dynamsoft-Regionsergebnissen vergleichen - Validieren Sie die Barcode-Erkennung, indem Sie
ocr.Configuration.ReadBarCodes = trueauf Eingaben ausführen, die zuvor den Dynamsoft Barcode Reader erforderten - Verifizieren Sie, dass die Verarbeitung von mehrseitigen TIFF-Dateien ein
OcrResult.Pagepro Rahmen erzeugt - Sicherstellen, dass die durchsuchbare PDF-Ausgabe in einem PDF-Viewer textdurchsuchbar ist
- Führen Sie Parallelverarbeitungstests mit
Parallel.ForEachdurch und bestätigen Sie, dass keine Thread-Überschneidungen auftreten - Testen Sie alle Bereitstellungsziele (Linux, Docker, Azure), um zu bestätigen, dass die Bereitstellung einzelner Pakete ohne JSON-Vorlagendateien funktioniert.
- Sicherstellen, dass keine Dynamsoft-Lizenzschlüssel-Umgebungsvariablen in der Bereitstellungskonfiguration verbleiben.
Wichtigste Vorteile der Migration zu IronOCR
Ein Paket eliminiert die Koordinationssteuer für mehrere Produkte. Jede Fähigkeit — allgemeine OCR, MRZ-Extraktion, Barcode-Lesen, native PDF-Eingabe, durchsuchbare PDF-Ausgabe, Vorverarbeitung und über 125 Sprachen — wird als einzelnes IronOcr NuGet-Paket geliefert. Versionsaktualisierungen betreffen einen Paket-Eintrag in einer einzigen .csproj Datei. Der Lizenzschlüssel-Rotation erfolgt über eine Umgebung Variable. Das Inventar der Bereitstellungsartefakte reduziert sich auf Anwendungsbinärdateien, es fehlen JSON-Vorlagendateien und Charaktermodellverzeichnisse.
Keine Abhängigkeiten von Konfigurationsdateien. Das Dynamsoft-Vorlagensystem benötigt zur Laufzeit vorhandene und korrekt gepfadte JSON-Dateien.IronOCR hat außer dem NuGet Paket selbst keine weiteren Laufzeit-Dateiabhängigkeiten. Docker-Images werden deterministisch: Was die CI-Prüfung besteht, läuft genau so in der Produktion. Der Docker-Bereitstellungsleitfaden zeigt eine vollständige Dockerfile, die nur eine apt-get install-Zeile für Linux erfordert.
Strukturiertes Output reduziert Integrationscode. Dynamsoft gibt rohe LineResult Textzeichenfolgen zurück. Die Extraktion strukturierter Daten – Feldpositionen, Wortgrenzen, Konfidenzintervalle pro Token – erfordert eine Nachbearbeitung, die Ihr eigener Code ist und die Sie testen. Die Ergebnishierarchie von IronOCR stellt Seiten, Absätze, Zeilen, Wörter und Zeichen als getippte Sammlungen mit Koordinaten und Konfidenzwerten auf jeder Ebene dar. Teams, die von Dynamsoft migrieren, entfernen typischerweise 30-50% ihres Ergebnisverarbeitungscodes, da IronOCR die Struktur liefert, die sie zuvor manuell erstellt hatten. Die Ergebnisseite der OCR-Texturierung dokumentiert das vollständige Ausgabemodell.
Dauerlizenzen beseitigen die jährliche Budgetunsicherheit. Dynamsoft Label Recognizerbietet keine Dauerlizenzoption. Ein Verarbeitungscluster, der fünf Jahre lang läuft, kostet allein für die Etikettenerkennung 2.995 US-Dollar pro Jahr und mehr, bevor Barcode- oder Dokumentennormalisierungsprodukte hinzukommen. IronOCR's $999 Lite-Lizenz ist ein einmaliger Kauf, der alle Funktionen unbegrenzt abdeckt. Für Regierungsstellen, Enterprise und langfristige Produktionsumgebungen verringert die Beseitigung jährlicher Verlängerungsabhängigkeiten bei einer zentralen Komponente zur Dokumentenverarbeitung die Komplexität der Beschaffung und eliminiert das Risiko eines Abonnementausfalls mitten im Projekt. Auf der IronOCR -Lizenzseite sind alle Stufen und deren jeweilige Leistungen aufgelistet.
Plattformübergreifend ohne plattformspezifische Konfiguration.IronOCR ermittelt die korrekte Laufzeitumgebung für Windows x64, Linux x64, macOS x64 und macOS ARM mithilfe des Laufzeitidentifikatorgraphen von NuGet. Keine bedingten <PackageReference> Blöcke, kein Plattform-Erkennungscode, keine Einrichtung nativer Binärpfade. Derselbe using IronOcr; Code wird auf Windows, Linux, AWS Lambda und Azure App Service ohne Änderung kompiliert und ausgeführt.
Die Sprachabdeckung skaliert mit den Anwendungsanforderungen. Dynamsoft Label Recognizerist für MRZ-Formate mit lateinischen Zeichen konzipiert. Nicht-lateinische Schriften – Arabisch, Chinesisch, Japanisch, Koreanisch, Hebräisch – fallen nicht in seinen Designbereich.IronOCR unterstützt über 125 Sprachen, die als einzelne NuGet-Pakete installiert werden: dotnet add package IronOcr.Languages.Arabic fügt Unterstützung für Arabisch hinzu, ohne dass eine Änderung der Erkennungspipeline erforderlich ist. Der Sprachenindex listet jedes verfügbare Sprachpaket auf. Für Anwendungen, die internationale Ausweisdokumente, mehrsprachige Versandetiketten oder grenzüberschreitende Rechnungen verarbeiten, bedeutet diese Breite, dass eine einzige Bibliothek jeden Dokumententyp abdeckt, dem eine wachsende Anwendung begegnet.
Häufig gestellte Fragen
Warum sollte ich von Dynamsoft OCR SDK zu IronOCR migrieren?
Zu den häufigsten Gründen gehören die Beseitigung der Komplexität der COM-Interoperabilität, die Ablösung der dateibasierten Lizenzverwaltung, die Vermeidung der seitenweisen Abrechnung, die Ermöglichung der Docker-/Container-Bereitstellung und die Einführung eines NuGet-nativen Workflows, der sich in die Standard-.NET-Werkzeuge integriert.
Was sind die wichtigsten Codeänderungen bei der Migration von Dynamsoft OCR SDK zu IronOCR?
Ersetzen Sie die Dynamsoft OCR-Initialisierungssequenzen durch IronTesseract-Instanziierung, entfernen Sie das COM-Lebenszyklusmanagement (explizite Create/Load/Close-Muster) und aktualisieren Sie die Namen der Ergebniseigenschaften. Das Ergebnis ist eine erhebliche Verringerung der Anzahl von Boilerplate-Zeilen.
Wie installiere ich IronOCR, um die Migration zu beginnen?
Führen Sie 'Install-Package IronOcr' in der Paketmanager-Konsole oder 'dotnet add package IronOcr' in der CLI aus. Sprachpakete sind separate Pakete: 'dotnet add package IronOcr.Languages.French' für Französisch, zum Beispiel.
Kann IronOCR die OCR-Genauigkeit von Dynamsoft OCR SDK für Standardgeschäftsdokumente erreichen?
IronOCR erzielt eine hohe Genauigkeit bei Standardgeschäftsinhalten wie Rechnungen, Verträgen, Quittungen und getippten Formularen. Bildvorverarbeitungsfilter (Schräglagenkorrektur, Rauschunterdrückung, Kontrastverbesserung) verbessern die Erkennungsgenauigkeit bei verschlechterten Eingaben weiter.
Wie geht IronOCR mit den Sprachdaten um, die von Dynamsoft OCR SDK separat installiert werden?
Die Sprachdaten in IronOCR werden als NuGet-Pakete verteilt. mit 'dotnet add package IronOcr.Languages.German' wird die deutsche Unterstützung installiert. Es sind keine manuellen Dateiplatzierungen oder Verzeichnispfade erforderlich.
Erfordert die Migration von Dynamsoft OCR SDK zu IronOCR Änderungen an der Bereitstellungsinfrastruktur?
IronOCR erfordert weniger Änderungen an der Infrastruktur als Dynamsoft OCR SDK. Es gibt keine SDK-Binärpfade, keine Platzierung von Lizenzdateien oder Lizenzserverkonfigurationen. Das NuGet-Paket enthält die komplette OCR-Engine, und der Lizenzschlüssel ist eine im Anwendungscode festgelegte Zeichenfolge.
Wie konfiguriere ich die IronOCR-Lizenzierung nach der Migration?
Weisen Sie IronOcr.License.LicenseKey = "YOUR-KEY" im Startup-Code der Anwendung zu. In Docker oder Kubernetes speichern Sie den Schlüssel als Umgebungsvariable und lesen ihn beim Starten aus. Verwenden Sie License.IsValidLicense zur Validierung, bevor Sie den Datenverkehr akzeptieren.
Kann IronOCR PDFs auf die gleiche Weise verarbeiten wie Dynamsoft OCR?
Ja, IronOCR liest sowohl native als auch gescannte PDFs. Instanziieren Sie IronTesseract, rufen Sie ocr.Read(input) auf, wobei input ein PDF-Pfad oder OcrPdfInput ist, und iterieren Sie die OcrResult-Seiten. Es ist keine separate PDF-Rendering-Pipeline erforderlich.
Wie handhabt IronOCR das Threading bei der Verarbeitung großer Datenmengen?
IronTesseract kann sicher pro Thread instanziiert werden. Sie können eine Instanz pro Thread in einem Parallel.ForEach- oder Task-Pool aufsetzen, OCR gleichzeitig ausführen und jede Instanz nach Abschluss entsorgen. Es ist kein globaler Zustand oder Sperren erforderlich.
Welche Ausgabeformate unterstützt IronOCR nach der Textextraktion?
IronOCR liefert strukturierte Ergebnisse mit Text, Wortkoordinaten, Konfidenzwerten und Seitenstruktur. Zu den Exportoptionen gehören reiner Text, durchsuchbare PDF-Dateien und strukturierte Ergebnisobjekte für die nachgeschaltete Verarbeitung.
Ist die Preisgestaltung von IronOCR vorhersehbarer als die von Dynamsoft OCR SDK für die Skalierung von Arbeitslasten?
IronOCR verwendet eine pauschale, unbefristete Lizenzierung ohne Seiten- oder Volumengebühren. Egal, ob Sie 10.000 oder 10 Millionen Seiten verarbeiten, die Lizenzkosten bleiben konstant. Optionen für Volumen- und Teamlizenzen finden Sie auf der IronOCR-Preisseite.
Was geschieht mit meinen bestehenden Tests nach der Migration von Dynamsoft OCR SDK zu IronOCR?
Tests, die extrahierte Textinhalte überprüfen, sollten auch nach der Migration bestehen. Tests, die API-Aufrufmuster oder den Lebenszyklus von COM-Objekten validieren, müssen aktualisiert werden, um das einfachere Initialisierungs- und Ergebnismodell von IronOCR widerzuspiegeln.

