Umstellung von XImage.OCR auf IronOCR
Dieser Leitfaden richtet sich an .NET-Entwickler, die eine bestehende XImage.OCR-Integration auf IronOCR umstellen. Sie behandelt den Prozess der Paketkonsolidierung, Änderungen an Namespaces und APIs sowie konkrete Beispiele für die Code-Migration in den Szenarien, in denen die fragmentierte Architektur von XImage.OCR die größten Reibungsverluste verursacht. Das vorherige Lesen des Vergleichsartikels ist nicht erforderlich.
Warum von XImage.OCR migrieren?
XImage.OCR ist ein kommerzieller Tesseract-Wrapper von RasterEdge, der seine Funktionalität über eine Kette koordinierter NuGet-Pakete verteilt. Die Architektur funktioniert im kleinen Maßstab, verursacht jedoch steigende Wartungskosten, wenn Anwendungen wachsen.
Die Anzahl der Pakete wächst mit jeder Sprache. Das Hinzufügen einer Sprache bedeutet das Hinzufügen eines NuGet-Pakets. Eine Anwendung in fünf Sprachen enthält sechs Pakete in ihrem .csproj. Eine Anwendung in zehn Sprachen trägt elf. Jedes Paket muss an dieselbe Version wie der Kern gebunden sein – eine Einschränkung, die zu stillen Laufzeitfehlern führt, wenn ein Entwickler nur einen Teil der Kette aktualisiert.IronOCR bietet ein einziges Paket für alle über 125 Sprachen.
Versionssynchronisation ist ein ständiges Risiko. dotnet outdated aktualisiert Pakete gierig. Wenn RasterEdge.XImage.OCR auf 12.5.0 fortschreitet, aber XImage.OCR.Language.French bei 12.4.0 bleibt, tritt der Fehler zur Laufzeit auf, nicht zur Build-Zeit, und die Meldung weist selten auf die Versionssynchronisation als Ursache hin. Teams, die CI/CD-Pipelines betreiben, lernen, für jedes XImage.OCR-Paket eine explizite Versionsbindung hinzuzufügen – ein Mehraufwand, der keinen anderen Zweck erfüllt, als das fragmentierte Modell zu kompensieren.
Keine integrierte Vorverarbeitung beeinträchtigt die Genauigkeit bei echten Dokumenten. XImage.OCR leitet Bilder direkt an die zugrunde liegende Tesseract-Engine weiter. Ein Scan mit 150 DPI und zwei Grad Schräglage wird unverändert an Tesseract übergeben. Die maximale Genauigkeit solcher Eingaben liegt bei 60–75 %, unabhängig davon, welcher Tesseract-Wrapper verwendet wird.IronOCR liefert eine Vorverarbeitungspipeline — Deskew(), DeNoise(), Contrast(), Binarize(), Sharpen() — die diese Probleme korrigiert, bevor die Erkennung ausgeführt wird.
Strukturierte Ausgabe erfordert manuelles Parsen. XImage.OCR gibt eine einfache Zeichenkette zurück. Das Extrahieren von Wortpositionen, Zeilengrenzen oder der Konfidenz pro Wort erfordert, dass Sie diese Zeichenfolge selbst parsen.IronOCR gibt ein OcrResult-Objekt mit Pages, Paragraphs, Lines, Words und pro Zeichen Daten mit Pixelkoordinaten und eingebauten Zuverlässigkeitswerten zurück.
Die Ausgabeformate beschränken sich auf reinen Text. Das Erstellen eines durchsuchbaren PDFs aus einem XImage.OCR-Ergebnis erfordert das RasterEdge PDF SDK – einen zweiten kommerziellen Kauf.IronOCR erzeugt durch result.SaveAsSearchablePdf() durchsuchbare PDFs ohne zusätzliche Abhängigkeiten.
Eine plattformübergreifende Bereitstellung wird nicht unterstützt. XImage.OCR ist für Windows vorgesehen. Linux-Container, macOS-Entwicklungsumgebungen und Cloud-native Bereitstellungen auf Azure oder AWS erfordern eine andere Bibliothek.IronOCR läuft unter Windows, Linux, macOS, Docker, Azure App Service und AWS Lambda aus demselben Paket.
Das grundsätzliche Problem
XImage.OCR benötigt ein NuGet-Paket pro Sprache. Zehn Sprachen bedeuten elf Pakete, die alle versiehenschloss zueinander sind:
<!-- XImage.OCR: 11 packages to support 10 languages — every version must match -->
<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Portuguese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.ChineseSimplified" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Japanese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Korean" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Arabic" Version="12.4.0" />
IronOCR ersetzt den gesamten Block durch eine einzige Zeile:
<!-- IronOCR: One package. 125+ languages.Neinversion coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
##IronOCR vs. XImage.OCR: Funktionsvergleich
Die folgende Tabelle enthält die Funktionen, die für die Migrationsentscheidung am relevantesten sind.
| Feature | XImage.OCR | IronOCR |
|---|---|---|
| NuGet-Pakete nur für Englisch | 2 (Kern + Sprachpaket) | 1 |
| NuGet-Pakete für 10 Sprachen | 11 | 1 |
| Versionssynchronisation erforderlich | Ja – alle Pakete müssen übereinstimmen | Nein |
| Verfügbare Sprachen | ~15 als separate Pakete | Über 125 im Paket enthalten |
| Eingebaute Vorverarbeitung | None | Entzerren, Rauschen entfernen, Kontrast erhöhen, Binärisierung, Schärfen, Skalieren, Dilatieren, Erodieren, Invertieren |
| Tiefgehende Rauschunterdrückung | None | Ja (DeepCleanBackgroundNoise()) |
| Native PDF-Eingabe | Erfordert RasterEdge PDF SDK | Ja (input.LoadPdf()) |
| Durchsuchbare PDF-Ausgabe | Erfordert RasterEdge PDF SDK | Ja (result.SaveAsSearchablePdf()) |
| Mehrseitige TIFF-Eingabe | Beschränkt | Ja (input.LoadImageFrames()) |
| Byte-Array-Eingabe | Handbuch über MemoryStream | Ja (input.LoadImage(bytes)) |
| Stream-Eingabe | Handbuch | Ja (input.LoadImage(stream)) |
| Strukturierte Ausgabe | Einfacher String | Seiten, Absätze, Zeilen, Wörter, Zeichen mit Koordinaten |
| Vertrauenswerte pro Wort | Nicht verfügbar | Ja |
| Barcode-Lesung | Nicht verfügbar | Ja (ocr.Configuration.ReadBarCodes = true) |
| hOCR-Export | Nicht verfügbar | Ja |
| Thread-Sicherheit | Nicht gewindesicher | Vollständige Thread-Sicherheit |
| Speichermodell (parallel) | Eine Handler-Instanz pro Thread | Einzige gemeinsame Instanz |
| Plattformübergreifend | Windows primär | Windows, Linux, macOS, Docker, Azure, AWS |
| .NET -Kompatibilität | .NET Standard 2.0, .NET Framework 4.5+ | .NET Framework 4.6.2+, .NET Core, .NET 5/6/7/8/9 |
| Lizenztyp | Kommerziell (RasterEdge) | Perpetual (Lite $999, Pro $1,499, Enterprise $2,999) |
| Kommerzielle Unterstützung | RasterEdge-Support | Ja, gestaffelt nach Lizenz |
Schnellstart: Migration von XImage.OCR zu IronOCR
Schritt 1: Ersetzen von NuGet-Paketen
Entfernen Sie alle XImage.OCR-Pakete. Die Anzahl der Befehle entspricht der Anzahl der von Ihnen installierten Sprachpakete:
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# Repeat for every language pack in your project
Installieren Sie IronOCR über NuGet :
Schritt 2: Namespaces aktualisieren
Ersetzen Sie die RasterEdge-Namespace-Importe durch den einzigen IronOCR-Namespace:
// Before (XImage.OCR)
using RasterEdge.XImage.OCR;
using RasterEdge.Imaging.Basic;
// After (IronOCR)
using IronOcr;
Schritt 3: Lizenz initialisieren
Fügen Sie die Lizenzinitialisierung einmalig beim Anwendungsstart ein, vor allen OCR-Aufrufen:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Speichern Sie den Schlüssel in einer Umgebung-Variablen oder einem Secrets-Manager, anstatt ihn fest zu codieren:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");Imports System
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")Beispiele für die Code-Migration
Konsolidierung der Initialisierung mehrerer Pakete
Die erste Migrationsaufgabe besteht darin, den Initialisierungsblock von XImage.OCR – Lizenzaktivierung, Erstellung des Handlers und stringbasierte Sprachzuweisung – in das IronOCR-Äquivalent zu integrieren.
XImage.OCR-Ansatz:
// Requires: RasterEdge.XImage.OCR + one XImage.OCR.Language.* package per language
// Language strings must exactly match installed package names or OCR fails at runtime
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-ximage-license-key");
var ocrHandler = new OCRHandler();
// String codes — typo "enh" instead of "eng" silently fails or throws at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };
// Process returns a plain string — no structure, no confidence
string extractedText = ocrHandler.Process("document.png");
Console.WriteLine(extractedText);
IronOCR Ansatz:
// Requires: IronOcr (single package — all languages included)
IronOcr.License.LicenseKey = "YOUR-IRONOCR-LICENSE-KEY";
var ocr = new IronTesseract();
// Type-safe enum — compiler catches typos, no runtime surprises
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Die string-basierten Sprachcodes in XImage.OCR ("eng", "deu") schlagen zur Laufzeit fehl, wenn das entsprechende NuGet-Paket fehlt oder in der falschen Version vorliegt. Das OcrLanguage-Enum in IronOCR macht ungültige Sprachkombinationen nicht kompilierbar. Der IronTesseract-Setup-Guide behandelt die vollständigen Konfigurationsoptionen des Engines, und das Anleitung für mehrere Sprachen dokumentiert, wie primäre und sekundäre Sprachkombinationen für Dokumente mit gemischten Sprachen funktionieren.
Vereinheitlichung der Bildformate
XImage.OCR behandelt jede Bildquelle je nach Format unterschiedlich. Byte-Arrays, Streams und Dateipfade erfordern jeweils leicht unterschiedliche Codepfade.IronOCR akzeptiert alle über die gleichen OcrInput-Methoden.
XImage.OCR-Ansatz:
// XImage.OCR: different handling per image source type
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// File path — works directly
string resultFromFile = ocrHandler.Process("invoice.jpg");
// Byte array — must write to temp file first, then process
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
string tempPath = Path.GetTempFileName() + ".jpg";
File.WriteAllBytes(tempPath, imageBytes);
try
{
string resultFromBytes = ocrHandler.Process(tempPath);
Console.WriteLine(resultFromBytes);
}
finally
{
File.Delete(tempPath); // Handbuch cleanup — easy to forget
}
// Multi-page TIFF — must split frames manually
//Neinbuilt-in TIFF frame iteration in base XImage.OCR
IronOCR Ansatz:
// IronOCR: unified OcrInput accepts all source types identically
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// File path
using (var input = new OcrInput())
{
input.LoadImage("invoice.jpg");
var result = ocr.Read(input);
Console.WriteLine($"From file: {result.Text}");
}
// Byte array — no temp file needed
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
using (var input = new OcrInput())
{
input.LoadImage(imageBytes);
var result = ocr.Read(input);
Console.WriteLine($"From bytes: {result.Text}");
}
// Multi-page TIFF — all frames processed in one call
using (var input = new OcrInput())
{
input.LoadImageFrames("scanned-archive.tiff");
var result = ocr.Read(input);
Console.WriteLine($"TIFF pages: {result.Pages.Count}");
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
Das Temp-Datei-Muster für Byte-Arrays in XImage.OCR ist eine häufige Ursache für überfüllte Festplatten und verlorene Dateien in Fehlerpfaden. IronOCR's LoadImage(byte[]) eliminiert die Zwischenablage vollständig. Die Anleitung zur Bildeingabe und die Anleitung zur TIFF/GIF-Eingabe decken alle unterstützten Quelltypen ab, einschließlich Streams und Multi-Frame-Verarbeitung.
Optimierung des Ausgabeformats
XImage.OCR gibt eine einfache Zeichenfolge zurück. Zum Erstellen einer durchsuchbaren PDF-Datei ist ein zweites RasterEdge-Produkt erforderlich.IronOCR erzeugt aus demselben Ergebnisobjekt Klartext, durchsuchbare PDFs und strukturierte Daten, ohne dass zusätzliche Pakete erforderlich sind.
XImage.OCR-Ansatz:
// XImage.OCR: plain text output only
// Searchable PDF requires purchasing the RasterEdge PDF SDK separately
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string plainText = ocrHandler.Process("scanned-contract.jpg");
// To produce a searchable PDF from this text, you would need:
// 1. Purchase RasterEdge PDF SDK (separate commercial license)
// 2. Create a PDF document programmatically
// 3. Embed the extracted text as invisible text layer over the image
// 4. Manage the PDF document lifecycle manually
//Neinbuilt-in path from OCR result to searchable PDF in XImage.OCR alone
Console.WriteLine(plainText);
IronOCR Ansatz:
// IronOCR: plain text, searchable PDF, and structured data from one result
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-contract.jpg");
var result = ocr.Read(input);
// Plain text
Console.WriteLine(result.Text);
// Searchable PDF — no extra package required
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Structured data: paragraphs with bounding box coordinates
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Per-word confidence for quality gating
var lowConfidenceWords = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence < 70)
.ToList();
Console.WriteLine($"Words below 70% confidence: {lowConfidenceWords.Count}");
Der SaveAsSearchablePdf()-Aufruf bettet den erkannten Text als versteckte Ebene unter dem Originalbild ein, wodurch das Dokument vollständig textdurchsuchbar wird, ohne sein visuelles Erscheinungsbild zu verändern. Die durchsuchbare PDF-Anleitung behandelt Optionen für den Seitenbereich und DPI-Einstellungen. Für strukturierte Datenextraktionsmuster dokumentiert der Ergebnisse-Guide die vollständige OcrResult-Hierarchie einschließlich Wortkoordinaten- und Zugriff auf Zuverlässigkeitswerte. Das Beispiel für ein durchsuchbares PDF enthält eine vollständige, funktionsfähige Implementierung.
Stapelverarbeitung von Dokumenten
XImage.OCR ist nicht threadsicher. Jeder gleichzeitig aktive Arbeitsthread muss seine eigene OCRHandler-Instanz erstellen, was den Speicherverbrauch mit der Anzahl der Threads multipliziert.IronOCR verwendet eine einzige gemeinsame Instanz für alle Threads.
XImage.OCR-Ansatz:
// XImage.OCR: one handler per thread — memory multiplies with concurrency
// 4 threads processing English documents: 4 x ~100MB = ~400MB for OCR alone
// 4 threads processing 5 languages: 4 x ~250MB = ~1GB just for OCR handlers
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
documentPath =>
{
// Each thread must create and dispose its own handler
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
try
{
string text = ocrHandler.Process(documentPath);
results[documentPath] = text;
}
finally
{
// Handbuch disposal required — no using statement support shown
ocrHandler.Dispose();
}
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
IronOCR Ansatz:
// IronOCR: single IronTesseract instance shared across all threads
// Memory stays flat regardless of thread count
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract(); // Create once outside the parallel loop
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths, documentPath =>
{
// OcrInput is created per thread — IronTesseract instance is shared
using var input = new OcrInput();
input.LoadImage(documentPath);
input.Deskew(); // Preprocessing runs per-document, not per-thread engine
input.DeNoise();
var result = ocr.Read(input);
results[documentPath] = result.Text;
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
Das Handler-Muster pro Thread von XImage.OCR bedeutet, dass ein Batch-Job mit vier Threads, der fünf Sprachen lädt, etwa 1 GB OCR-Handler-Speicher benötigt, bevor ein einziges Dokument verarbeitet wird. Die gemeinsam genutzte Instanz von IronOCR begrenzt den Speicherbedarf auf den Speicherbedarf einer einzelnen Instanz, unabhängig von der Parallelität. Das Multithreading-Beispiel veranschaulicht das Muster in vollem Umfang, und der Leitfaden zur Geschwindigkeitsoptimierung behandelt die Konfigurationsoptimierung für durchsatzorientierte Batch-Workloads.
Kombinierte Extraktion von BarCodes und Text
XImage.OCR verfügt über keine BarCode-Lesefunktion. Dokumente, die sowohl Text als auch BarCodes enthalten, erfordern zwei separate Bibliotheken und zwei separate Durchläufe.IronOCR extrahiert beides in einem einzigen Lesevorgang.
XImage.OCR-Ansatz:
// XImage.OCR: text only — barcodes require a separate library and second pass
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// Pass 1: text extraction with XImage.OCR
string documentText = ocrHandler.Process("warehouse-label.png");
Console.WriteLine($"Text: {documentText}");
// Pass 2: barcode reading requires a completely separate library
// e.g., ZXing.Net, Dynamsoft Barcode Reader, or another commercial SDK
// - Additional NuGet package required
// - Additional license required
// - Additional code for result merging
//Neincombined text + barcode result object exists in XImage.OCR
IronOCR Ansatz:
// IronOCR: text and barcodes from a single Read() call
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // Enable barcode extraction
using var input = new OcrInput();
input.LoadImage("warehouse-label.png");
var result = ocr.Read(input);
// Text and barcodes in one result object
Console.WriteLine($"Document text:\n{result.Text}");
if (result.Barcodes.Any())
{
Console.WriteLine($"\nBarcodes found: {result.Barcodes.Count}");
foreach (var barcode in result.Barcodes)
Console.WriteLine($" [{barcode.BarcodeType}] {barcode.Value}");
}
Das Festlegen von ReadBarCodes = true fügt die Barcode-Erkennung zur Erkennungspass hinzu, ohne eine zweite Bibliothek oder einen zweiten Lesevorgang zu benötigen. Die Anleitung zum Lesen von BarCodes und das BarCode-OCR-Beispiel behandeln die unterstützten BarCode-Formate und Konfigurationsoptionen für Dokumente mit gemischten Inhalten.
XImage.OCR-API-zu-IronOCR-Zuordnungsreferenz
| XImage.OCR | IronOCR-Äquivalent |
|---|---|
new OCRHandler() | new IronTesseract() |
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key") | IronOcr.License.LicenseKey = "key" |
ocrHandler.Language = "eng" | ocr.Language = OcrLanguage.English |
ocrHandler.Languages = new[] { "eng", "deu" } | ocr.Language = OcrLanguage.English + OcrLanguage.German |
ocrHandler.Process(imagePath) | ocr.Read(input).Text (nach input.LoadImage(path)) |
ocrHandler.Process(image) (aus Objekt) | input.LoadImage(bytes) oder input.LoadImage(stream) |
ocrHandler.ProcessRegion(path, rect) | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
ocrHandler.SetVariable("tessedit_char_whitelist", "0-9") | ocr.Configuration.WhiteListCharacters = "0123456789" |
result (einfache Zeichenkette) | result.Text |
result.MeanConfidence | result.Confidence |
| Kein Äquivalent | result.Pages / result.Paragraphs / result.Lines |
| Kein Äquivalent | result.Words (mit .X, .Y, .Confidence) |
| Kein Äquivalent | result.SaveAsSearchablePdf("output.pdf") |
| Kein Äquivalent | input.Deskew() |
| Kein Äquivalent | input.DeNoise() |
| Kein Äquivalent | input.Contrast() |
| Kein Äquivalent | input.Binarize() |
| Kein Äquivalent | input.Sharpen() |
| Kein Äquivalent | input.LoadImageFrames("file.tiff") (mehrfaches Frame) |
| Erfordert RasterEdge PDF SDK | input.LoadPdf(pdfPath) |
| Erfordert RasterEdge PDF SDK | result.SaveAsSearchablePdf("output.pdf") |
| Nicht verfügbar | ocr.Configuration.ReadBarCodes = true |
Pro-Thread-OCRHandler-Instanzen | Einzelne gemeinsame IronTesseract-Instanz |
Gängige Migrationsprobleme und Lösungen
Problem 1: Laufzeitfehler nach teilweiser Paketaktualisierung
XImage.OCR: Das Ausführen von dotnet outdated oder dotnet restore mit einem veralteten Paket-Cache kann RasterEdge.XImage.OCR auf eine neue Version vorbringen, während Sprachpakete bei der vorherigen Version bleiben. Der Fehler tritt zur Laufzeit beim ersten OCR-Aufruf auf, wobei die Fehlermeldung die Versionsinkongruenz nicht eindeutig als Ursache identifiziert. Das Auffinden der Diskrepanz erfordert die manuelle Überprüfung aller PackageReference-Einträge.
Lösung: Nach dem Entfernen der XImage.OCR-Pakete und der Installation von IronOCR muss keine Versionssynchronisation mehr aufrechterhalten werden. Das einzelne IronOcr-Paket enthält alles. Wenn Sie Sprachpakete über die gebündelten Standardwerte hinaus benötigen, installieren Sie IronOcr.Languages.*-Pakete unabhängig — sie müssen nicht zur Core-Version passen:
Problem 2: Sprachcodes in Zeichenfolgen verursachen stille OCR-Fehler
XImage.OCR: Sprachcodes sind Zeichenketten ("eng", "deu", "fra"). Ein Tippfehler in einem Sprachcode — "engg", "ger" anstelle von "deu" — fällt je nach XImage.OCR-Version entweder stillschweigend auf eine Standardsprache zurück oder löst eine Laufzeitausnahme aus. Keines der beiden Ergebnisse wird zur Kompilierzeit erkannt.
**Lösung:**IronOCR verwendet das OcrLanguage-Enum. Ungültige Werte sind Kompilierfehler, keine Überraschungen zur Laufzeit. Migrieren Sie Zeichenketten-Arrays zu Enum-Ausdrücken:
// Before (XImage.OCR) — typos compile fine, fail at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra" };
// After (IronOCR) — typos are compile errors
ocr.Language = OcrLanguage.English + OcrLanguage.German + OcrLanguage.French;
Im Leitfaden für Mehrsprachigkeit finden Sie Informationen zur Kombination von Primär- und Sekundärsprachen in Dokumenten mit mehrsprachigem Inhalt.
Problem 3: Temporäre Dateien, die nach der Byte-Array-Verarbeitung auf der Festplatte verblieben sind
XImage.OCR: Bilder aus Byte-Arrays zu verarbeiten erfordert das Schreiben einer temporären Datei, da OCRHandler.Process() einen Dateipfad akzeptiert, keinen Puffer. Ausnahmepfade, die den finally-Block überspringen, hinterlassen diese temporären Dateien auf der Festplatte. Bei Anwendungen mit hohem Durchsatz summiert sich dies schnell.
Lösung: OcrInput.LoadImage() akzeptiert byte[] direkt. Es wird keine temporäre Datei erstellt:
// Before (XImage.OCR) — temp file required
string tempPath = Path.GetTempFileName() + ".png";
File.WriteAllBytes(tempPath, imageBytes);
try { text = ocrHandler.Process(tempPath); }
finally { File.Delete(tempPath); }
// After (IronOCR) — direct byte array loading, no disk I/O
using var input = new OcrInput();
input.LoadImage(imageBytes);
var result = ocr.Read(input);
string text = result.Text;
Problem 4: Speichererschöpfung bei paralleler Last
XImage.OCR: Parallelverarbeitung erfordert ein OCRHandler pro Thread. Acht Threads, die Dokumente in fünf Sprachen verarbeiten, laden acht separate Engine-Instanzen, von denen jede alle fünf Sprachpakete enthält. Bei etwa 50 MB pro Sprache und Instanz verbrauchen acht Threads allein schon rund 2 GB OCR-Engine-Speicher, bevor überhaupt Dokumentdaten ins Spiel kommen.
Lösung: Eine einzelne IronTesseract-Instanz verarbeitet alle Threads. Erstellen Sie OcrInput pro Dokument (es ist entfernbar und leichtgewichtig), verwenden Sie IronTesseract während der gesamten Anwendung:
// Single instance — shared safely across all threads
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
Parallel.ForEach(documentPaths, path =>
{
using var input = new OcrInput(); // Per-document, lightweight
input.LoadImage(path);
var result = ocr.Read(input); // Thread-safe call on shared instance
ProcessResult(result.Text);
});
Problem 5: CI/CD-Pipeline funktioniert nach teilweiser Wiederherstellung nicht mehr
XImage.OCR: Ein CI/CD-Agent mit einem vorgewärmten Paketcache hat oft einige XImage.OCR-Sprachpakete in einer alten Version zwischengespeichert. Wenn nur das Kernpaket in der Projektdatei aktualisiert wurde, ist die Wiederherstellung zwar erfolgreich, aber die Laufzeitumgebung lädt nicht übereinstimmende Assemblies. Der Bau wird genehmigt; Die Bereitstellung schlägt fehl.
Lösung: Nach der Migration zu IronOCR stellt die CI/CD-Pipeline ein Paket wieder her. Fügen Sie einen Validierungsschritt hinzu, um zu bestätigen, dass die erwartete Version vorhanden ist:
# In your CI pipeline — verify single package restore
dotnet restore
dotnet list package | grep IronOcr
#Neinversion coordination logic needed — only one package to check
Problem 6: Fehlende strukturierte Daten für die nachgelagerte Analyse
XImage.OCR: Gibt eine einfache Zeichenkette zurück. Anwendungen, die Wortpositionen, Zeilengruppierungen oder die Konfidenz einzelner Wörter benötigen, müssen die Zeichenkette mithilfe von Leerzeichenheuristiken oder benutzerdefinierter Logik analysieren. Die Genauigkeit dieser Analyse nimmt bei Dokumenten mit mehrspaltigem Layout, Tabellen oder gedrehtem Text ab.
Lösung: IronOCR's OcrResult zeigt die vollständige Dokumentenhierarchie direkt an. Keine Zeichenkettenanalyse erforderlich:
var result = ocr.Read(input);
// Direct access to structured data — no string manipulation
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
// Line text, bounding box, and per-word data all available
Console.WriteLine($"Line [{line.X},{line.Y}]: {line.Text}");
foreach (var word in line.Words)
Console.WriteLine($" Word '{word.Text}' confidence: {word.Confidence}%");
}
}
Die vollständige API für strukturierte Daten finden Sie auf der Seite "Anleitung zum Lesen von Ergebnissen" und auf der Seite "OCR-Ergebnisfunktionen" .
Checkliste für die Migration von XImage.OCR
Vor der Migration
Prüfen Sie den Quellcode, um alle Schnittstellen zu XImage.OCR zu finden, bevor Sie Änderungen vornehmen:
# Find all XImage.OCR namespace imports
grep -r "RasterEdge.XImage.OCR\|Yiigo.Image.Ocr\|XImage.OCR" --include="*.cs" .
# Find all OCRHandler usages
grep -r "OCRHandler\|ocrHandler" --include="*.cs" .
# Find all string-based language assignments
grep -r "\.Language\s*=\s*\"" --include="*.cs" .
grep -r "\.Languages\s*=\s*new\[\]" --include="*.cs" .
# Find all XImage.OCR package references in project files
grep -r "RasterEdge.XImage.OCR\|XImage.OCR.Language" --include="*.csproj" .
# Count distinct language packs installed
grep "XImage.OCR.Language" --include="*.csproj" -r . | wc -l
Notieren Sie, welche Bildquellentypen verwendet werden (Dateipfade, Byte-Arrays, Streams, TIFF), und identifizieren Sie alle Stellen, an denen temporäre Dateien für die Byte-Array-Verarbeitung verwendet werden. Dies sind Sanierungsziele mit hoher Priorität.
Code-Migration
- Entfernen Sie alle
RasterEdge.XImage.OCRundXImage.OCR.Language.*-Paketverweise aus jeder.csproj-Datei - Fügen Sie den
IronOcr-Paketverweis hinzu (dotnet add package IronOcr) - Ersetzen Sie
using RasterEdge.XImage.OCRdurchusing IronOcrin allen Dateien - Fügen Sie
IronOcr.License.LicenseKey = ...beim Anwendungsstart hinzu (einmal pro Prozess) - Ersetzen Sie
new OCRHandler()durchnew IronTesseract() - Ersetzen Sie die Zuordnung von Zeichenfolgensprachen (
"eng","deu") durchOcrLanguage-Enumwerte - Ersetzen Sie
ocrHandler.Process(path)durchinput.LoadImage(path)+ocr.Read(input).Text - Ersetzen Sie das Byte-Array-zu-temp-Datei-Muster durch
input.LoadImage(byte[]) - Ersetzen Sie das manuelle Frame-Trennen mehrseitiger TIFFs durch
input.LoadImageFrames("file.tiff") - Entfernen Sie die pro-Thread-
OCRHandler-Instanziierung ausParallel.ForEach-Schleifen — verwenden Sie eine einzige gemeinsameIronTesseract-Instanz - Fügen Sie Vorverarbeitungsaufrufe (
input.Deskew(),input.DeNoise()) nach jedemLoadImage()für Dokumente aus variabler Qualitätsquellen hinzu - Ersetzen Sie die Handhabung von reinen Zeichenfolge-Ergebnissen durch
result.Textfür Text oderresult.SaveAsSearchablePdf()für PDF-Ausgabe - Ersetzen Sie
ocrHandler.SetVariable("tessedit_char_whitelist", ...)durchocr.Configuration.WhiteListCharacters = ... - Aktualisieren Sie die CI/CD-Pipeline: Entfernen Sie Schritte zur Wiederherstellung mehrerer Pakete, entfernen Sie die Logik zur Versionssynchronisation, überprüfen Sie die einfache Wiederherstellung des
IronOcr-Pakets
Nach der Migration
- Bestätigen Sie, dass die grundlegende Textextraktion aus einem als fehlerfrei bekannten Testbild korrekte Ergebnisse liefert.
- Überprüfen, ob mehrsprachige Dokumente Text für alle konfigurierten Sprachen zurückgeben.
- Die Test-Byte-Array-Eingabepfade liefern korrekte Ausgaben, ohne dass temporäre Dateien auf der Festplatte erstellt werden.
- Bestätigen Sie, dass mehrseitige TIFF-Dokumente die korrekte Seitenanzahl in
result.Pageszurückgeben - Führen Sie die parallele Stapelverarbeitung unter Last durch und messen Sie den maximalen Speicherverbrauch – dieser sollte deutlich unter dem XImage.OCR-Baseline-Wert liegen.
- Überprüfen Sie, ob die durchsuchbare PDF-Datei in Adobe Acrobat oder einem PDF-Viewer korrekt geöffnet wird und ob der Text auswählbar ist.
- Testen Sie die Vorverarbeitung an einem Scan geringer Qualität oder mit verzerrtem Bildmaterial und vergleichen Sie die Genauigkeit des extrahierten Textes mit der XImage.OCR-Baseline.
- Sicherstellen, dass die Initialisierung des Lizenzschlüssels vor dem ersten OCR-Aufruf ausgeführt wird und keine Ausnahme auslöst.
- Sicherstellen, dass die CI/CD-Wiederherstellung in einer sauberen Umgebung ohne zwischengespeicherte Pakete erfolgreich ist
- Prüfen Sie, ob die Ausgabe strukturierter Daten (
result.Words,result.Paragraphs) dem erwarteten Dokumentenlayout entspricht
Wichtigste Vorteile der Migration zu IronOCR
Ein einziges Paket ersetzt ein ganzes Abhängigkeitsdiagramm. Jedes XImage.OCR.Language.*-Paket, das Core-RasterEdge.XImage.OCR-Paket und der Versionssynchronisationsaufwand zwischen ihnen kollabieren in einem dotnet add package IronOcr-Befehl. Die .csproj-Eintragsanzahl fällt von elf auf einen. Der CI/CD-Wiederherstellungsschritt wandelt sich von einer Operation mit mehreren Paketen und elf unabhängigen Fehlerpunkten zu einer Wiederherstellung eines einzelnen Pakets. Diese Vereinfachung hat weitere Vorteile: Es müssen weniger Pakete auf Sicherheitslücken überprüft werden, es müssen weniger Einträge aktualisiert werden, wenn sich die .NET Kompatibilität ändert, und es muss keine Versionskoordinierungslogik in automatisierten Update-Pipelines gepflegt werden. Die IronOCR -Produktseite und das zugehörige Dokumentationsportal bieten eine vollständige Funktions- und Bereitstellungsreferenz.
Die Genauigkeitsverbesserungen bei der Vorverarbeitung sind sofort sichtbar. Die Migration ist kein direkter Ersatz, sondern eine Genauigkeitssteigerung. Jedes Dokument, das von XImage.OCR aufgrund von Schräglage, Rauschen oder geringer Auflösung in reduzierter Genauigkeit verarbeitet wurde, hat jetzt einen direkten Weg zur Verbesserung über input.Deskew(), input.DeNoise() und input.Contrast(). Keine externe Bildverarbeitungsbibliothek, keine Bildverarbeitungsexpertise im Entwicklungsteam, keine separate Abhängigkeit, die lizenziert und gewartet werden muss. Das Hinzufügen von drei Zeilen nach LoadImage() steigert die Genauigkeit gescannter Dokumente, die zuvor als "gut genug" akzeptiert wurden, um 20–35 Prozentpunkte. Der Bildqualitätskorrekturanleitung und die Seite zu Vorverarbeitungsmerkmalen behandelt die Wirkung jedes Filters auf verschiedene Dokumentenqualitätsszenarien.
Durchsuchbare PDFs und strukturierte Daten eliminieren die Kosten für ein zweites SDK. Die beiden häufigsten Anforderungen von XImage.OCR-Nutzern – durchsuchbare PDF-Ausgabe und Daten auf Wortebene mit Koordinaten – erfordern jeweils zusätzliche RasterEdge-Produkte, für die separate kommerzielle Lizenzen notwendig sind. Nach der Migration erzeugt result.SaveAsSearchablePdf() archivqualitativ durchsuchbare Dokumente ohne zusätzliche Pakete, und result.Words liefern strukturierte Daten mit Begrenzungsrahmen und Zuverlässigkeitswerten. Die Funktionalität, für die bisher zwei Lizenzen nötig waren, wird nun durch eine einzige Lizenz ersetzt. Die vollständige Dokumentation zum Ausgabeformat finden Sie auf der Seite mit den OCR-Ergebnisfunktionen .
Parallelverarbeitung skaliert ohne Speichereinbußen. Das Thread-basierte Handler-Modell von XImage.OCR macht die Skalierung aufwändig. Eine Verdopplung der Thread-Anzahl verdoppelt den von den OCR-Engine-Instanzen belegten Speicher. Das Shared-Instance-Modell von IronOCR bedeutet, dass der Speicherbedarf unabhängig von der Parallelität auf den einer Einzelinstanz beschränkt bleibt. Ein Server, der Dokumentenstapel mit acht parallelen Threads verarbeitet, benötigt denselben OCR-Engine-Speicher wie ein Server, der jeweils nur ein Dokument verarbeitet. Dies führt direkt zu geringeren Hostingkosten und höherer Durchsatzkapazität bei bestehender Infrastruktur.
Die plattformübergreifende Bereitstellung ist ohne Codeänderungen möglich. Dasselbe IronOcr-Paket und derselbe Anwendungscode laufen unter Windows, Linux, macOS, Docker, Azure App Service und AWS Lambda. Kein plattformabhängiger Code, keine plattformspezifischen Paketvarianten, keine Bereitstellungstests der OCR-Schicht in verschiedenen Umgebungen. Teams, die Workloads containerisieren, macOS-Entwicklungsumgebungen nutzen oder auf Linux-basierter Cloud-Infrastruktur bereitstellen, erhalten sofortige Kompatibilität. Die Docker-Bereitstellungsanleitung , die Azure-Bereitstellungsanleitung und die Linux-Bereitstellungsanleitung dokumentieren die Einrichtung für jede Zielumgebung.
Über 125 Sprachen – keine Einschränkungen mehr bei der Sprachabdeckung. XImage.OCR bietet in kommerziellen Paketen maximal etwa fünfzehn Sprachen an. Standardmäßige tessdata-Distributionen enthalten über 100 Sprachen kostenlos.IronOCR bündelt über 125 Sprachen und stellt sie über optionale IronOcr.Languages.*-Pakete zur Verfügung, die einem sauberen Installationsmuster ohne versionsabhängigen Zwang folgen. Die 24 Amtssprachen der EU, alle wichtigen CJK-Sprachen, Arabisch, Hebräisch und spezielle Schriftsysteme sind verfügbar. Der Sprachenindex listet alle unterstützten Sprachen mit dem jeweiligen Paketnamen auf.
