IRONSOFTWAREHOME
VIDEOS

Umstellung von XImage.OCR auf IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1. August 2026

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" />
XML

IronOCR ersetzt den gesamten Block durch eine einzige Zeile:

<!-- IronOCR: One package. 125+ languages.Neinversion coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
XML

##IronOCR vs. XImage.OCR: Funktionsvergleich

Die folgende Tabelle enthält die Funktionen, die für die Migrationsentscheidung am relevantesten sind.

FeatureXImage.OCRIronOCR
NuGet-Pakete nur für Englisch2 (Kern + Sprachpaket)1
NuGet-Pakete für 10 Sprachen111
Versionssynchronisation erforderlichJa – alle Pakete müssen übereinstimmenNein
Verfügbare Sprachen~15 als separate PaketeÜber 125 im Paket enthalten
Eingebaute VorverarbeitungNoneEntzerren, Rauschen entfernen, Kontrast erhöhen, Binärisierung, Schärfen, Skalieren, Dilatieren, Erodieren, Invertieren
Tiefgehende RauschunterdrückungNoneJa (DeepCleanBackgroundNoise())
Native PDF-EingabeErfordert RasterEdge PDF SDKJa (input.LoadPdf())
Durchsuchbare PDF-AusgabeErfordert RasterEdge PDF SDKJa (result.SaveAsSearchablePdf())
Mehrseitige TIFF-EingabeBeschränktJa (input.LoadImageFrames())
Byte-Array-EingabeHandbuch über MemoryStreamJa (input.LoadImage(bytes))
Stream-EingabeHandbuchJa (input.LoadImage(stream))
Strukturierte AusgabeEinfacher StringSeiten, Absätze, Zeilen, Wörter, Zeichen mit Koordinaten
Vertrauenswerte pro WortNicht verfügbarJa
Barcode-LesungNicht verfügbarJa (ocr.Configuration.ReadBarCodes = true)
hOCR-ExportNicht verfügbarJa
Thread-SicherheitNicht gewindesicherVollständige Thread-Sicherheit
Speichermodell (parallel)Eine Handler-Instanz pro ThreadEinzige gemeinsame Instanz
PlattformübergreifendWindows primärWindows, 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
LizenztypKommerziell (RasterEdge)Perpetual (Lite $999, Pro $1,499, Enterprise $2,999)
Kommerzielle UnterstützungRasterEdge-SupportJa, 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
SHELL

Installieren Sie IronOCR über NuGet :

dotnet add package IronOcr

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;
C#

Schritt 3: Lizenz initialisieren

Fügen Sie die Lizenzinitialisierung einmalig beim Anwendungsstart ein, vor allen OCR-Aufrufen:

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");

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);
C#

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}%");
C#

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
C#

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}");
}
C#

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);
C#

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}");
C#

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");
C#

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");
C#

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
C#

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}");
}
C#

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.OCRIronOCR-Ä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.MeanConfidenceresult.Confidence
Kein Äquivalentresult.Pages / result.Paragraphs / result.Lines
Kein Äquivalentresult.Words (mit .X, .Y, .Confidence)
Kein Äquivalentresult.SaveAsSearchablePdf("output.pdf")
Kein Äquivalentinput.Deskew()
Kein Äquivalentinput.DeNoise()
Kein Äquivalentinput.Contrast()
Kein Äquivalentinput.Binarize()
Kein Äquivalentinput.Sharpen()
Kein Äquivalentinput.LoadImageFrames("file.tiff") (mehrfaches Frame)
Erfordert RasterEdge PDF SDKinput.LoadPdf(pdfPath)
Erfordert RasterEdge PDF SDKresult.SaveAsSearchablePdf("output.pdf")
Nicht verfügbarocr.Configuration.ReadBarCodes = true
Pro-Thread-OCRHandler-InstanzenEinzelne 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:

dotnet add package IronOcr, IronOcr.Languages.Arabic, IronOcr.Languages.Japanese, ...

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;
C#

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;
C#

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);
});
C#

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
SHELL

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}%");
    }
}
C#

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
SHELL

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

  1. Entfernen Sie alle RasterEdge.XImage.OCR und XImage.OCR.Language.*-Paketverweise aus jeder .csproj-Datei
  2. Fügen Sie den IronOcr-Paketverweis hinzu (dotnet add package IronOcr)
  3. Ersetzen Sie using RasterEdge.XImage.OCR durch using IronOcr in allen Dateien
  4. Fügen Sie IronOcr.License.LicenseKey = ... beim Anwendungsstart hinzu (einmal pro Prozess)
  5. Ersetzen Sie new OCRHandler() durch new IronTesseract()
  6. Ersetzen Sie die Zuordnung von Zeichenfolgensprachen ("eng", "deu") durch OcrLanguage-Enumwerte
  7. Ersetzen Sie ocrHandler.Process(path) durch input.LoadImage(path) + ocr.Read(input).Text
  8. Ersetzen Sie das Byte-Array-zu-temp-Datei-Muster durch input.LoadImage(byte[])
  9. Ersetzen Sie das manuelle Frame-Trennen mehrseitiger TIFFs durch input.LoadImageFrames("file.tiff")
  10. Entfernen Sie die pro-Thread-OCRHandler-Instanziierung aus Parallel.ForEach-Schleifen — verwenden Sie eine einzige gemeinsame IronTesseract-Instanz
  11. Fügen Sie Vorverarbeitungsaufrufe (input.Deskew(), input.DeNoise()) nach jedem LoadImage() für Dokumente aus variabler Qualitätsquellen hinzu
  12. Ersetzen Sie die Handhabung von reinen Zeichenfolge-Ergebnissen durch result.Text für Text oder result.SaveAsSearchablePdf() für PDF-Ausgabe
  13. Ersetzen Sie ocrHandler.SetVariable("tessedit_char_whitelist", ...) durch ocr.Configuration.WhiteListCharacters = ...
  14. 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.Pages zurü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.

Hinweis:: Adobe Acrobat, Dynamsoft, Tesseract, ZXing.NET und xImage.OCR sind eingetragene Marken ihrer jeweiligen Eigentümer. Diese Seite ist nicht verbunden mit, unterstützt von, oder gesponsert von Adobe Inc., Dynamsoft, Google, RasterEdge oder ZXing.NET. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Kundenlogos von Iron Software
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.