IRONSOFTWAREHOME
VIDEOS

Umstellung von Tesseract auf IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1. August 2026

Dieses Handbuch bietet einen direkten Migrationspfad vom charlesw Tesseract NuGet-Paket zu IronOCR. Es deckt die spezifischen Schritte ab, die erforderlich sind, um die Verwaltung des tessdata-Ordners zu eliminieren, die TesseractEngine- und Pix-Initialisierungsmuster zu ersetzen, eine integrierte Vorverarbeitungspipeline hinzuzufügen und native PDF-Unterstützung freizuschalten - ohne das Material zu duplizieren, das bereits im Vergleichsartikel für diese Bibliothek behandelt wurde.

Warum von Tesseract umsteigen?

Das charlesw Tesseract-Paket verfügt über echte OCR-Fähigkeiten, und seine 8 Millionen NuGet-Downloads beweisen es. Die Reibungspunkte liegen nicht in der Engine – sie liegen in der Infrastruktur, die Sie um die Engine herum aufbauen müssen, bevor Sie Ergebnisse in Produktionsqualität liefern können. Vier spezifische Probleme sind ausschlaggebend für die meisten Migrationsentscheidungen.

Die Verwaltung von tessdata-Ordnern wird mit jeder Umgebung komplizierter. Bevor ein einzelnes Wort erkannt werden kann, muss der tessdata-Pfad existieren, mit den richtigen .traineddata-Dateien für jede Sprache Ihrer Anwendung gefüllt sein und genau über den an TesseractEngine übergebenen Pfad zugänglich sein. Das bedeutet eine separate Ordnerstruktur für Entwicklungsrechner, CI-Builds, Staging-Server, Produktionshosts und Docker-Container. Eine fehlende Datei wirft zur Laufzeit TesseractException: Failed to initialise tesseract engine — nach der Bereitstellung — eine Nachricht aus, die nicht immer identifiziert, welche Datei fehlt. Jede neue Umgebung ist eine weitere Gelegenheit für diesen Fehler.

Tesseract 4.1.1 ist das Ende der Fahnenstange. Der charlesw-Wrapper ist an Tesseract 4.1.1 gebunden, das 2019 veröffentlicht wurde. Tesseract 5.x führte Verbesserungen am LSTM-Modell ein, die bei bestimmten Dokumenttypen eine messbar höhere Genauigkeit erzielen. Diese Version ist über dieses Paket nicht verfügbar, und die Wartungsfrequenz des Wrappers hat sich seit 2021 erheblich verlangsamt. Teams, denen die gleiche Genauigkeit wie bei aktuellen Tesseract-Versionen wichtig ist, haben über den charlesw-Wrapper keinen Upgrade-Pfad.

Keine Vorverarbeitung bedeutet keine Zuverlässigkeit bei realen Dokumenten. Tesseract erwartet saubere, hochauflösende und korrekt ausgerichtete Eingabedaten. Es werden keine integrierten Korrekturen für Schräglagen, Rauschen, niedrige DPI-Werte oder farbige Hintergründe angewendet. Das manuelle Erstellen der Vorverarbeitungspipeline — Graustufen-Konvertierung, Kontrastverbesserung, Binarisierung, Medianrauschfilterung, Entschrägung — umfasst etwa 180 Codezeilen unter Verwendung von System.Drawing.Common (nur Windows) oder erfordert das Hinzuziehen von OpenCvSharp4 für eine ordnungsgemäße Hough-Transform-Entschrägung. Diese Pipeline muss dann gepflegt werden, da neue Dokumentquellen Randfälle einführen.

PDF ist ein nachträglicher Einfall, der eine zweite Abhängigkeitskette erfordert. Verträge, Rechnungen, Kontoauszüge und Compliance-Dokumente werden als PDFs übermittelt. Tesseract kann keine PDF-Datei öffnen. Um diese Lücke zu schließen, ist eine separate PDF-Rendering-Bibliothek erforderlich – PdfiumViewer, PDFtoImage oder Docnet.Core –, wobei jede über eigene native Binärdateien, plattformspezifische Bereitstellungsschritte und Lizenzbedingungen verfügt. GhostScript bringt Auswirkungen der AGPL-Lizenzierung mit sich. Passwortgeschützte PDF-Dateien fügen eine weitere Bibliothek hinzu. Teams, die drei separate native Abhängigkeitsketten über mehrere Umgebungen hinweg verwalten, erreichen eine Wartungsschwelle, die eine direkte Bewertung von Alternativen mit einem einzigen Paket erforderlich macht.

Die nicht threadsichere Engine-Architektur beschränkt den parallelen Durchsatz. Eine TesseractEngine-Instanz kann nicht über Threads hinweg geteilt werden. Das Standardmuster für die parallele Verarbeitung erstellt eine Engine pro Thread und lädt 40–100 MB Sprachmodelldaten pro Instanz. Acht parallele Threads bedeuten 320-800 MB Engine-Initialisierungsoverhead, bevor Dokumente verarbeitet werden. Dies ist kein Fehler – es handelt sich um die beabsichtigte Verwendung einer thread-unsafe API –, aber der Speicherbedarf ist real und steigt mit zunehmender Batchgröße.

Das grundsätzliche Problem

Jede Tesseract-Anwendung beginnt auf die gleiche Weise: mit der Angabe eines tessdata-Pfads, der auf jedem Rechner, auf dem die Anwendung läuft, korrekt sein muss.

Ansatz von Tesseract:

// TessDataPath must exist and be populated — breaks on first clean deployment
private const string TessDataPath = @"./tessdata";

public static string ExtractText(string imagePath)
{
    // Runtime failure if eng.traineddata is missing from TessDataPath
    if (!Directory.Exists(TessDataPath))
        throw new DirectoryNotFoundException(
            $"Tessdata not found at {TessDataPath}. " +
            "Download from https://github.com/tesseract-ocr/tessdata");

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img   = Pix.LoadFromFile(imagePath);  // Leptonica Pix object
    using var page  = engine.Process(img);
    return page.GetText();
}
C#

IronOCR Ansatz:

// No tessdata folder. No path. No file check. Just OCR.
var text = new IronTesseract().Read("document.jpg").Text;
C#

Die gesamte TessDataPath-Konstante, der Directory.Exists-Schutz, das Pix-Objekt und die dreistufige using-Verschachtelung verschwinden. Die Sprachdaten sind im NuGet-Paket eingebettet.

##IronOCR vs. Tesseract: Funktionsvergleich

Die folgende Tabelle enthält die Funktionen, die bei Migrationsentscheidungen am wichtigsten sind.

FeatureTesserakt (charlesw)IronOCR
NuGet -PaketTesseractIronOcr
Tesseract-Engine-Version4.1.1 (2019, angeheftet)Optimiertes Tesseract 5.x
Tessdata-ManagementHandbuch-Ordner + Datei-DownloadIm Lieferumfang enthalten – keine Konfiguration erforderlich
SprachpaketeManueller .traineddata-DownloadNuGet Paket pro Sprache
Verfügbare Sprachen100+ (manuell)125+ (NuGet)
Mehrsprachige Simultanübertragung"eng+fra+deu"-StringOcrLanguage.French + OcrLanguage.German
BildvorverarbeitungHandbuch (~180 Zeilen)Integrierte Einzeiler-Methoden
EntschiefenHandbuch (Hough-Transformation erforderlich)input.Deskew()
RauschunterdrückungManuell (Medianfilter)input.DeNoise()
Kontrastieren / BinärisierenManuelle Pixeliterationinput.Contrast(), input.Binarize()
Tiefgehende RauschunterdrückungNicht verfügbarinput.DeepCleanBackgroundNoise()
PDF-EingabeKeine – erfordert externe BibliothekMuttersprachlich (gescannt, digital, gemischt)
Passwortgeschütztes PDFErfordert eine Entschlüsselungsbibliothek.input.LoadPdf(path, Password: "...")
Mehrseitiges TIFFManuelle Frame-Iterationinput.LoadImageFrames()
Durchsuchbare PDF-AusgabeNicht unterstütztresult.SaveAsSearchablePdf()
Strukturierter Zugriff auf ErgebnisseResultIterator-Schleiferesult.Pages, .Paragraphs, .Words
Thread-SicherheitNicht gewindesicherThreadsichere Einzelinstanz
Barcode-LesungNicht unterstütztocr.Configuration.ReadBarCodes = true
PlattformübergreifendPlattformspezifische native DLLs erforderlichEinzelnes NuGet, alle Plattformen
Docker-Bereitstellungapt-get + tessdata COPY-SchritteKeine weiteren Schritte
LizenzierungApache 2.0 (kostenlos)Perpetual ($999 Lite / $1,499 Pro / $2,999 Enterprise)
Kommerzielle UnterstützungNur für die GemeinschaftJa (E-Mail + Prioritätsstufen)

Schnellstart: Migration von Tesseract zu IronOCR

Schritt 1: Ersetzen des NuGet-Pakets

Entfernen Sie den Charlesw-Tesseract-Wrapper:

dotnet remove package Tesseract
SHELL

Installieren Sie IronOCR über NuGet :

dotnet add package IronOcr

Sprachpakete werden bei Bedarf als separate Pakete installiert:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German

Schritt 2: Namespaces aktualisieren

Ersetzen Sie den Tesseract-Namespace durch den IronOCR-Namespace.

// Before
using Tesseract;

// After
using IronOcr;
C#

Schritt 3: Lizenz initialisieren

Fügen Sie einmal beim Start der Anwendung die Lizenzinitialisierung hinzu, bevor irgendwelche IronTesseract-Aufrufe verwendet werden:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

Eine kostenlose Testversion läuft während der Entwicklung ohne Schlüssel. Für Produktionsbereitstellungen ist ein gültiger Schlüssel von der Lizenzierungsseite erforderlich.

Beispiele für die Code-Migration

Tessdata-Pfadeliminierung und Engine-Initialisierung

Die unmittelbarste Änderung besteht darin, die TesseractEngine-Initialisierung und den gesamten umgebenden tessdata-Validierungscode zu entfernen.

Ansatz von Tesseract:

// Every class that uses OCR must handle this initialization block
private const string TessDataPath = @"./tessdata";

public string RecognizeInvoiceNumber(string imagePath)
{
    // Check tessdata presence — missing file = silent runtime failure
    foreach (var lang in new[] { "eng" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
    }

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);

    // Pix is a Leptonica wrapper type — not a standard .NET image
    using var img  = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    string text = page.GetText();
    float  conf = page.GetMeanConfidence();

    return conf > 0.7f ? text : string.Empty;
}
C#

IronOCR Ansatz:

using IronOcr;

public string RecognizeInvoiceNumber(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    // Confidence property returns 0-100 double
    return result.Confidence > 70 ? result.Text : string.Empty;
}
C#

Der FileNotFoundException-Schutz, die tessdata-Konstante, das Pix-Objekt und die dreistufige Verschachtelung sind verschwunden. IronTesseract wird ohne Argumente konstruiert, da Sprachdaten eingebettet sind. Informationen zu Konfigurationsoptionen für Abweichungen vom Standardverhalten finden Sie im IronTesseract-Einrichtungsleitfaden, Informationen zur vollständigen Confidence-API im Leitfaden zu Confidence-Scores.

Verarbeitung mehrseitiger TIFF-Dateien mit Vorverarbeitungs-Pipeline

TIFF-Dateien mit mehreren Frames – wie sie häufig in gescannten Dokumentenarchiven und Faxsystemen vorkommen – erfordern bei Tesseract eine explizite Frame-Iteration.IronOCR lädt alle Frames in einem Aufruf und wendet die Vorverarbeitungs-Pipeline einheitlich an.

Ansatz von Tesseract:

using Tesseract;
using System.Drawing;
using System.Drawing.Imaging;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    var allText = new System.Text.StringBuilder();

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var tiffImage = Image.FromFile(tiffPath);

    int frameCount = tiffImage.GetFrameCount(FrameDimension.Page);

    for (int i = 0; i < frameCount; i++)
    {
        tiffImage.SelectActiveFrame(FrameDimension.Page, i);

        // Must save each frame to disk — Pix.LoadFromFile requires a path
        string tempPath = Path.GetTempFileName() + ".png";
        try
        {
            tiffImage.Save(tempPath, ImageFormat.Png);

            using var img  = Pix.LoadFromFile(tempPath);
            using var page = engine.Process(img);
            allText.AppendLine(page.GetText());
        }
        finally
        {
            File.Delete(tempPath); // Uncleaned temp files fill disk on failure
        }
    }

    return allText.ToString();
}
C#

IronOCR Ansatz:

using IronOcr;

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);  // Loads all frames at once
    input.Deskew();                   // Applied to every frame uniformly
    input.DeNoise();

    var result = new IronTesseract().Read(input);
    return result.Text;
}
C#

Keine Frame-Iteration. Keine Erstellung von temporären Dateien. Keine Bereinigungslogik. Die Vorverarbeitungs-Pipeline wird ohne zusätzliche Schleife auf jeden Frame angewendet. Das TIFF- und GIF-Eingabehandbuch behandelt die Verarbeitung mehrerer Frames im Detail, einschließlich selektiver Frame-Bereiche für große Archivdateien.

durchsuchbare PDF-Generierung

Um ein gescanntes PDF in ein durchsuchbares PDF zu konvertieren, muss Tesseract jede Seite in ein Bild umwandeln (über eine externe PDF-Bibliothek), OCR ausführen und anschließend ein PDF mit einer Textebene rekonstruieren – ein mehrstufiger Prozess, der mehrere Bibliotheken erfordert.IronOCR verarbeitet Eingabe, OCR und Ausgabe in einer einzigen Pipeline.

Ansatz von Tesseract:

// Requires: PdfiumViewer + Tesseract + a PDF writer library (iText, PdfSharp)
// Each library adds its own native dependencies and license considerations

using Tesseract;
// using PdfiumViewer;  // Comment: must add NuGet + deploy native pdfium.dll
// using iText.Kernel.Pdf;  // Comment: AGPL or commercial license required

private const string TessDataPath = @"./tessdata";

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    // Step 1: Render PDF pages to images (requires PdfiumViewer)
    // Step 2: Run OCR on each image (Tesseract)
    // Step 3: Write text positions back into PDF (requires iText or PDFsharp)
    //
    // Total: ~150 lines across three libraries
    // Native binaries required: tesseract*.dll, leptonica*.dll, pdfium.dll
    // License risk: iText is AGPL unless you purchase a commercial license

    throw new NotImplementedException(
        "Requires PdfiumViewer + Tesseract + a PDF writer. " +
        "No single-package solution exists with this stack.");
}
C#

IronOCR Ansatz:

using IronOcr;

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(inputPdfPath);
    input.Deskew();    // Correct scanned page skew before OCR
    input.DeNoise();   // Remove scanner artifacts

    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
C#

Ein einziger Methodenaufruf erzeugt das durchsuchbare PDF mit einer eingebetteten Textebene. Keine externe PDF-Bibliothek, keine native PDFium-Binärdatei, keine Lizenzverflechtungen mit AGPL-Abhängigkeiten. Das durchsuchbare PDF-Handbuch dokumentiert das Ausgabeformat, und das PDF-OCR-Beispiel führt durch eine vollständige Pipeline für gescannte Dokumente. Für einen umfassenderen Überblick darüber, was IronOCR mit PDF-Eingaben leisten kann, behandelt die Seite zu PDF-OCR-Anwendungsfällen Produktionsarchitekturmuster.

Extraktion strukturierter Daten aus gescannten Dokumenten

Tesseract bietet Wortebenen-Daten über ResultIterator, was eine do/while-Schleife mit manueller Begrenzungsrahmen-Extraktion erfordert.IronOCR stellt eine Dokumenthierarchie – Seiten, Absätze, Zeilen, Wörter – als stark typisierte Sammlungen mit bereits ausgefüllten Koordinaten bereit.

Ansatz von Tesseract:

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static void ExtractStructuredData(string imagePath)
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    using var iter   = page.GetIterator();

    iter.Begin();
    do
    {
        if (iter.IsAtBeginningOf(PageIteratorLevel.Para))
            Console.WriteLine("-- New Paragraph --");

        if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
        {
            string word       = iter.GetText(PageIteratorLevel.Word);
            float  confidence = iter.GetConfidence(PageIteratorLevel.Word);
            Console.WriteLine(
                $"Word: '{word?.Trim()}' " +
                $"at ({bounds.X1},{bounds.Y1})-({bounds.X2},{bounds.Y2}) " +
                $"conf={confidence:P0}");
        }
    }
    while (iter.Next(PageIteratorLevel.Word));
}
C#

IronOCR Ansatz:

using IronOcr;

public static void ExtractStructuredData(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    foreach (var page in result.Pages)
    {
        Console.WriteLine($"Page {page.PageNumber} — confidence: {result.Confidence}%");

        foreach (var paragraph in page.Paragraphs)
        {
            Console.WriteLine($"  Paragraph at ({paragraph.X},{paragraph.Y}):");
            Console.WriteLine($"  {paragraph.Text}");

            foreach (var word in paragraph.Words)
            {
                Console.WriteLine(
                    $"    Word: '{word.Text}' " +
                    $"at ({word.X},{word.Y}) " +
                    $"size {word.Width}x{word.Height} " +
                    $"conf={word.Confidence:P0}");
            }
        }
    }
}
C#

Die ResultIterator-Schleife verschwindet vollständig. Die Dokumenthierarchie besteht aus einer Reihe von durchzählbaren Sammlungen – kein Iterator-Status, keine manuelle Ebenenverfolgung, keine Extraktion von Begrenzungsrahmen durch Ausgabeparameter. Jedes Wortobjekt verfügt über eigene Koordinaten und eine eigene Konfidenz. Das Handbuch zu den Leseergebnissen dokumentiert jede Ebene der Hierarchie, und die OcrResult-API Referenz listet alle verfügbaren Eigenschaften auf.

Mehrsprachige OCR ohne Tessdata-Dateiverwaltung

Das Hinzufügen einer Sprache zu einer Tesseract-Anwendung bedeutet, dass eine .traineddata-Datei heruntergeladen, im tessdata-Ordner platziert, jedes Bereitstellungsmanifest aktualisiert, das diesen Ordner enthält, und die Engine-Initialisierungszeichenfolge modifiziert wird. Bei IronOCR handelt es sich um eine einzelne NuGet-Paketreferenz.

Ansatz von Tesseract:

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromEuropeanDocument(string imagePath)
{
    // Before this call works, these files must exist:
    // ./tessdata/eng.traineddata  (~15 MB, from GitHub)
    // ./tessdata/fra.traineddata  (~15 MB, from GitHub)
    // ./tessdata/deu.traineddata  (~15 MB, from GitHub)
    // ./tessdata/spa.traineddata  (~15 MB, from GitHub)
    // Total: ~60 MB to download, version-match, and deploy to every environment

    foreach (var lang in new[] { "eng", "fra", "deu", "spa" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Download {lang}.traineddata from " +
                "https://github.com/tesseract-ocr/tessdata " +
                $"and place in {TessDataPath}");
    }

    // Language string is a concatenation — order affects recognition priority
    using var engine = new TesseractEngine(TessDataPath, "eng+fra+deu+spa", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    return page.GetText();
}
C#

IronOCR Ansatz:

// Install language packs once per project:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.Spanish
using IronOcr;

public static string ExtractFromEuropeanDocument(string imagePath)
{
    var ocr = new IronTesseract();
    ocr.Language = OcrLanguage.English;
    ocr.AddSecondaryLanguage(OcrLanguage.French);
    ocr.AddSecondaryLanguage(OcrLanguage.German);
    ocr.AddSecondaryLanguage(OcrLanguage.Spanish);

    return ocr.Read(imagePath).Text;
}
C#

Der tessdata-Ordner, die Datei-Existenz-Schleife, die Pfadkonkatenationszeichenfolge und die Aktualisierungen der Bereitstellungsmanifeste werden durch PackageReference-Zeilen in .csproj ersetzt. Das Hinzufügen einer Sprache zu Docker bedeutet ein zusätzliches dotnet add package — kein Dockerfile-COPY-Schritt. Der Leitfaden für mehrere Sprachen deckt das gesamte Katalog von über 125 Sprachen und CJK-Zeichen ab, und der Sprachindex listet jedes verfügbare Sprachpaket auf.

Tesseract-API-zu-IronOCR-Zuordnungsreferenz

Tesserakt (charlesw)IronOCR
new TesseractEngine(tessDataPath, "eng", EngineMode.Default)new IronTesseract()
Pix.LoadFromFile(path)input.LoadImage(path) oder ocr.Read(path)
Pix.LoadFromMemory(bytes)input.LoadImage(bytes)
engine.Process(img)ocr.Read(input)
page.GetText()result.Text
page.GetMeanConfidence()result.Confidence
page.GetHOCRText(0)result.SaveAsHocrFile(path)
engine.Process(img, tessRect)input.LoadImage(path, new CropRectangle(x, y, w, h))
page.GetIterator()result.Pages / result.Paragraphs / result.Words
iter.GetText(PageIteratorLevel.Word)result.Words[i].Text
iter.GetConfidence(PageIteratorLevel.Word)result.Words[i].Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds)word.X, word.Y, word.Width, word.Height
"eng+fra+deu" Sprachzeichenfolgeocr.AddSecondaryLanguage(OcrLanguage.French)
Tessdata-Ordner + .traineddata-DateienNuGet-Sprachpaket (IronOcr.Languages.French)
Nicht zutreffend – erfordert PdfiumViewer oder ähnliches Programm.input.LoadPdf(path)
N/A – erfordert eine Entschlüsselungsbibliothekinput.LoadPdf(path, Password: "secret")
N/A — erfordert iText oder PDFSharp.result.SaveAsSearchablePdf(outputPath)
N/A — manuelle System.Drawing-Pipelineinput.Deskew(), input.DeNoise(), input.Binarize()
N/A — pro-Thread-Engine in Parallel.ForEachEinzelne IronTesseract, die über alle Threads hinweg geteilt wird
N/A – nicht unterstütztocr.Configuration.ReadBarCodes = true

Gängige Migrationsprobleme und Lösungen

Problem 1: Tessdata-Pfadreferenz bleibt nach der Migration bestehen

Tesseract: TessDataPath-Konstanten, Directory.Exists(TessDataPath)-Schutzmechanismen und File.Exists(Path.Combine(TessDataPath, lang + ".traineddata"))-Überprüfungen erscheinen im gesamten Code und in Projektdateien als <Content Include="tessdata\**">-Build-Items.

Lösung: Suchen Sie nach allen Vorkommen und entfernen Sie diese zusammen mit dem Ordner "tessdata" selbst:

# Find all tessdata references in source
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .
grep -r "tessdata" --include="*.csproj" .
SHELL

Entfernen Sie nach dem Entfernen der Pfadkonstanten und Dateiprüfungen den Ordner "tessdata" aus dem Projekt. Entfernen Sie alle <Content Include="tessdata\**" CopyToOutputDirectory="..." />-Zeilen aus .csproj-Dateien. Dockerfile-COPY ./tessdata-Zeilen und ENV TESSDATA_PREFIX-Umgebungsvariablen-Erklärungen sind ebenfalls sicher zu entfernen.

Problem 2: Der Objekttyp "Pix" kann nicht aufgelöst werden

Tesseract: Pix ist ein Leptonica-Bild-Wrapper-Typ aus dem Tesseract-Namespace. Referenzen erscheinen in Variablendeklarationen (using var img = Pix.LoadFromFile(...)), Methodensignaturen, die Pix-Parameter akzeptieren, und in jedem Code, der Pix.LoadFromMemory() oder Pix.LoadFromBitmap() aufruft.

Lösung: Ersetzen Sie Pix.LoadFromFile(path) durch input.LoadImage(path) auf einer OcrInput-Instanz. Ersetzen Sie Pix.LoadFromMemory(bytes) durch input.LoadImage(bytes). Die OcrInput-Klasse akzeptiert Dateipfade, Byte-Arrays, Streams und System.Drawing.Bitmap-Objekte direkt. Eine Konvertierung in einen Zwischen-Wrapper-Typ ist nicht erforderlich. Die vollständigen Informationen zu den akzeptierten Eingabetypen finden Sie im Leitfaden für Bilddaten und im Leitfaden für Stream-Daten.

Problem 3: Das ResultIterator-Loop-Muster hat keine direkte Entsprechung

Tesseract: Code, der ResultIterator mit iter.Begin(), iter.Next(PageIteratorLevel.Word) und iter.TryGetBoundingBox() iteriert, ist das Standardmuster für Wort- oder Zeichenebenenextraktion. Dieses Muster erfordert die manuelle Verfolgung von Iterator-Zuständen und Level-Übergängen.

Lösung: Ersetzen Sie die Iterator-Schleife durch LINQ über result.Words, result.Pages oder die entsprechende Sammlungsstufe:

// Before: iterator loop
using var iter = page.GetIterator();
iter.Begin();
do
{
    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
    {
        string text = iter.GetText(PageIteratorLevel.Word);
        // process text and bounds
    }
}
while (iter.Next(PageIteratorLevel.Word));

// After: enumerable collection
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    // word.Text, word.X, word.Y, word.Width, word.Height, word.Confidence
}
C#

Für den Zugriff auf Absatzebene — der im Tesseract-Iterator kein äquivalentes Äquivalent hat — verwenden Sie result.Pages[i].Paragraphs. Der Leitfaden zu den Leseergebnissen dokumentiert alle verfügbaren Stufen.

Problem 4: Der Code der PDF-Bibliothek muss vollständig entfernt werden

Tesseract: Jeglicher Code, der PDF-Seiten in Bilder konvertiert, bevor er sie an Tesseract übergibt — PdfiumViewer-document.Render()-Schleifen, PDFtoImage-Conversion.ToImage()-Aufrufe, Docnet.Core-GetPageReader()-Muster oder GhostScript-Prozess-Aufrufe — existiert nur, um die Unfähigkeit von Tesseract zu umgehen, PDFs zu öffnen. Diese Klassen, Schleifen, Muster für temporäre Dateien und nativen Binär-Deployments bilden das Gerüst für die eigentliche Anforderung.

Lösung: Den Code zum PDF-Rendering vollständig löschen. Ersetzen Sie den gesamten Render-then-OCR-Block durch input.LoadPdf(path):

// Before: ~50-150 lines of PdfiumViewer + Tesseract + temp file management
// After:
using var input = new OcrInput();
input.LoadPdf("document.pdf");
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
C#

Entfernen Sie PdfiumViewer-, PDFtoImage- und Docnet.Core-Paketreferenzen aus dem .csproj. Entfernen Sie native Binärbereitstellungen (pdfium.dll, GhostScript-Ausführungen) aus Build-Skripten und Dockerfiles. Der Leitfaden zur PDF-Eingabe behandelt die Auswahl von Seitenbereichen und passwortgeschützte PDF-Dateien.

Thema 5: Muster "Parallel Processing Engine-Per-Thread"

Tesseract: Das Standardmuster für sichere parallele OCR erstellt eine neue TesseractEngine innerhalb des Parallel.ForEach-Körpers, da nur ein einziges Engine nicht threadsicher ist. Dadurch wird das vollständige Sprachmodell pro Thread geladen.

Lösung: Erstellen Sie IronTesseract einmal vor der Schleife und referenzieren Sie es innen:

// Before: engine per thread, 40-100 MB per language model, times thread count
Parallel.ForEach(files, file =>
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(file);
    using var page   = engine.Process(img);
    results[file] = page.GetText();
});

// After: single engine, thread-safe, shared pool
var ocr = new IronTesseract();
Parallel.ForEach(files, file =>
{
    var result = ocr.Read(file);
    results[file] = result.Text;
});
C#

Die Änderung der Threadsicherheit beseitigt auch das using-Entsorgungsmuster aus dem Schleifenkörper, das nur erforderlich war, um sicherzustellen, dass jede pro-Thread-Engine schnell freigegeben wurde.

Problem 6: Die Enumeration "EngineMode" hat keine direkte Zuordnung

Tesseract: EngineMode.Default, EngineMode.TesseractOnly und EngineMode.LstmOnly erscheinen in TesseractEngine-Konstruktoren, um auszuwählen, ob Tesseract die Legacy-Engine, LSTM oder beide verwendet. Der charlesw-Wrapper stellt diese Modi bereit, da Tesseract 4.x beide Engines beibehalten hat.

**Lösung:**IronOCR verwendet ausschließlich die Tesseract 5 LSTM-Engine, die für hohe Genauigkeit ausgelegt ist. Es gibt keinen EngineMode-Parameter, weil es keine Legacy-Engine gibt, auf die zurückgegriffen werden könnte. Entfernen Sie das EngineMode-Argument beim Übersetzen des Konstruktoraufrufs. Verwenden Sie für das Tuning von Durchsatz versus Genauigkeit ocr.Configuration.PageSegmentationMode und konsultieren Sie den Geschwindigkeitsoptimierungs-Leitfaden.

Tesseract-Migrations-Checkliste

Vor der Migration

Überprüfen Sie den Code auf alle Verweise auf Tesseract und tessdata:

# Find all using directives for the Tesseract namespace
grep -rn "using Tesseract" --include="*.cs" .

# Find TesseractEngine constructors
grep -rn "TesseractEngine\|TessDataPath\|tessdata" --include="*.cs" .

# Find Pix object usage
grep -rn "Pix\." --include="*.cs" .

# Find ResultIterator usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .

# Find PDF rendering libraries added for Tesseract
grep -rn "PdfiumViewer\|PDFtoImage\|Docnet\|GhostScript" --include="*.cs" .

# Find tessdata references in project files
grep -rn "tessdata\|traineddata" --include="*.csproj" .

# Find tessdata references in Dockerfiles
grep -rn "tessdata\|TESSDATA_PREFIX\|libtesseract" Dockerfile* .
SHELL

Bestandsaufnahme zur Abschätzung des Migrationsumfangs:

  • Zählen Sie Dateien mit using Tesseract, um festzustellen, wie viele Klassen Änderungen erfordern
  • Ermitteln Sie, welche PDF-Rendering-Bibliothek verwendet wird (PdfiumViewer, PDFtoImage, Docnet.Core, GhostScript)
  • Beachten Sie, welche Sprachen in TesseractEngine-Konstruktzeichenfolgen referenziert werden, um festzustellen, welche IronOCR-Sprachen NuGet-Pakete hinzugefügt werden müssen

Code-Migration

  1. Entfernen Sie die Tesseract-NuGet-Paketreferenz aus allen .csproj-Dateien
  2. Entfernen Sie NuGet-Referenzen auf PDF-Rendering-Bibliotheken, die ausschließlich zur Unterstützung von Tesseract hinzugefügt wurden (PdfiumViewer, PDFtoImage, Docnet.Core)
  3. Installieren Sie das IronOcr-NuGet-Paket
  4. Installieren Sie erforderliche Sprach-NuGet-Pakete (IronOcr.Languages.French usw.)
  5. Fügen Sie IronOcr.License.LicenseKey = "YOUR-KEY"; beim Start der Anwendung hinzu
  6. Ersetzen Sie using Tesseract; durch using IronOcr; in allen betroffenen Dateien
  7. Entfernen Sie TessDataPath-Konstanten und alle Directory.Exists / File.Exists-tessdata-Schutzmechanismen
  8. Ersetzen Sie new TesseractEngine(...) durch new IronTesseract()
  9. Ersetzen Sie Pix.LoadFromFile(path) durch input.LoadImage(path) auf einer OcrInput-Instanz
  10. Ersetzen Sie Pix.LoadFromMemory(bytes) durch input.LoadImage(bytes)
  11. Ersetzen Sie engine.Process(img) durch ocr.Read(input)
  12. Ersetzen Sie page.GetText() durch result.Text
  13. Ersetzen Sie page.GetMeanConfidence() durch result.Confidence
  14. Ersetzen Sie ResultIterator-Schleifen durch Enumeration über result.Words oder result.Pages[i].Paragraphs
  15. Ersetzen Sie PDF-Rendering-Schleifen durch input.LoadPdf(path) — löschen Sie den gesamten Code der Rendering-Bibliothek
  16. Ersetzen Sie "eng+fra+deu"-Sprachzeichenfolgen durch ocr.AddSecondaryLanguage(OcrLanguage.X)-Aufrufe
  17. Löschen Sie den tessdata-Ordner und seine Build-<Content Include="...">-Projektelemente
  18. Entfernen Sie die Schritte zur Bereitstellung nativer Binärdateien aus den Build-Skripten und Dockerfiles (tessdata COPY, TESSDATA_PREFIX ENV, apt-get libtesseract-dev)

Nach der Migration

  • Überprüfen Sie die grundlegende Textextraktion anhand derselben Beispielbilder, die während der Entwicklung mit dem Tesseract-Wrapper verwendet wurden
  • Überprüfen Sie, ob die Konfidenzwerte angemessen sind (70 %+ für saubere Dokumente, 85 %+ für hochwertige Scans)
  • Testen Sie, ob bei Mehrseiten-TIFF-Eingaben die korrekte Anzahl von Seiten in result.Pages erzeugt wird
  • Verify PDF input liest gescannte PDF-Dateien, ohne dass PdfiumViewer oder eine externe Bibliothek erforderlich ist
  • Testen Sie das Lesen von passwortgeschützten PDFs mit input.LoadPdf(path, Password: "...") gegen eine bekannte verschlüsselte Datei
  • Stellen Sie sicher, dass die durchsuchbare PDF-Ausgabe in Adobe Reader geöffnet wird und die Textsuche unterstützt
  • Testen Sie die parallele Verarbeitung: Erstellen Sie eine IronTesseract-Instanz vor einer Parallel.ForEach-Schleife und bestätigen Sie, dass keine Threadsicherheitsausnahmen auftreten
  • Überprüfen Sie, ob jedes Sprachpaket korrekte Ergebnisse für den Dokumentensatz der Zielsprache liefert
  • Führen Sie den Docker-Build ohne COPY tessdata und apt-get libtesseract-dev aus — stellen Sie sicher, dass der Container startet und Dokumente verarbeitet
  • Vergewissern Sie sich, dass der Ordner "tessdata" und die nativen DLL-Dateien nicht im veröffentlichten Ausgabeverzeichnis enthalten sind
  • Überprüfen Sie, dass nach dem Entfernen nativer Binärreferenzen keine TesseractException oder System.DllNotFoundException in den Protokollen erscheinen

Wichtigste Vorteile der Migration zu IronOCR

Die Bereitstellung schrumpft auf ein einziges Paket. Der tessdata-Ordner, plattformspezifische native Bibliotheken (tesseract50.dll, leptonica-1.82.0.dll, libtesseract.so.5) und alle nativen PDF-Rendering-Binärdateien sind aus dem Bereitstellungsartefakt verschwunden. Das Hinzufügen einer neuen Umgebung – eines Linux-Containers, einer AWS-Lambda-Funktion, eines macOS-Entwicklerrechners – erfordert keine plattformspezifischen Einrichtungsschritte. Die Docker-Bereitstellungsanleitung und die Linux-Bereitstellungsanleitung bestätigen den Ablauf: Paket installieren, Lizenzschlüssel hinzufügen, ausführen. Kein apt-get, kein COPY, keine Umgebungsvariablen.

Das Hinzufügen von Sprachen dauert Sekunden, nicht Minuten. Das Hinzufügen von Spanisch-OCR-Unterstützung wechselt von "spa.traineddata herunterladen, im tessdata-Ordner platzieren, das Bereitstellungsmanifest aktualisieren, den Pfad im Engine-Konstruktor überprüfen" zu dotnet add package IronOcr.Languages.Spanish und ocr.AddSecondaryLanguage(OcrLanguage.Spanish). Die gleichen zwei Schritte funktionieren auf jeder Plattform. Teams, die mehr als 10 Sprachen unterstützen – was in multinationalen Dokumentenverarbeitungs-Workflows üblich ist –, sehen, wie sich der Aufwand von stundenlanger laufender Wartung auf wenige Minuten einmaliger Einrichtung reduziert. Durchsuchen Sie den vollständigen Katalog im Sprachenindex.

PDF-Workflows benötigen keine externen Bibliotheken. Die Notwendigkeit, native Binärdateien von PdfiumViewer bereitzustellen und zu warten, die Bit-Tiefe von pdfium.dll für 32-/64-Bit-Umgebungen zu verwalten, AGPL-Lizenzaspekte von GhostScript zu berücksichtigen und seitenweise Render-Schleifen zu schreiben, entfällt. input.LoadPdf() liest gescannte PDFs, digitale PDFs, gemischte Inhalte-PDFs und passwortgeschützte PDFs nativ. result.SaveAsSearchablePdf() erzeugt eine durchsuchbare Ausgabe, ohne eine sekundäre Bibliothek einzubeziehen. Der gesamte Arbeitsablauf – Laden eines gescannten PDFs, Begradigen und Rauschunterdrückung, OCR, Speichern der durchsuchbaren Ausgabe – umfasst weniger als 10 Zeilen Code. Siehe den Blogbeitrag zu durchsuchbaren PDFs für Muster von Produktionspipelines.

Vorverarbeitung ist integriert, nicht von Ihnen erstellt. Die etwa 180 Zeilen manuellen Vorverarbeitungscodes — Graustufen-Farbmatrix, Pixeliterationen zur Kontrastverbesserung, Rauschunterdrückung mittels Medienfilter, Hough-Transform-Entschrägung, DPI-Skalierung — werden zu einer Abfolge von Einzeilenmethodenaufrufen: input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize(). Bei den meisten realen Dokumenten wendet die Standard-Lesefunktion eine intelligente automatische Vorverarbeitung an, ohne dass explizite Filteraufrufe erforderlich sind. Der Leitfaden zur Bildqualitätskorrektur und das Tutorial zu Bildfiltern decken den gesamten Filterkatalog ab.

Die Genauigkeit von Tesseract 5 ist ab sofort verfügbar. Der CharlesW-Wrapper ist an Tesseract 4.1.1 gebunden.IronOCR liefert eine optimierte Tesseract 5 LSTM-Engine aus, ohne dass Ihrerseits Maßnahmen erforderlich sind. Teams, die bei schwierigen Dokumenttypen – Scans mit niedriger DPI, Faxe, handbeschriftete Formulare – eine Verschlechterung der Genauigkeit festgestellt haben, profitieren sofort nach dem Wechsel des Pakets von den Verbesserungen in Tesseract 5. Der Genauigkeitsunterschied ist am deutlichsten bei Dokumenten, bei denen die LSTM-Erkennung die alte Engine übertrifft, was auf die Mehrheit der realen OCR-Workloads zutrifft.

Kommerzieller Support ersetzt die Fehlerbehebung durch die Community. Der CharlesW-Wrapper ist ein von der Community gepflegtes Open-Source-Projekt ohne garantierte Reaktionszeiten und ohne SLA.IronOCR bietet E-Mail-Support, Priority-Support in höheren Tarifen sowie eine kommerziell gepflegte Codebasis mit regelmäßigen .NET-Kompatibilitätsupdates. Für Teams mit Produktions-SLAs für Dokumentenverarbeitungspipelines ist dieses Support-Modell von Bedeutung. Die IronOCR-Produktseite und das Dokumentationsportal behandeln den gesamten Funktionsumfang und die Bereitstellungsoptionen.

Hinweis:: Ghostscript, PDFium, PDFSharp, Tesseract und iText sind eingetragene Marken ihrer jeweiligen Eigentümer. Diese Website ist nicht mit Artifex Software, Chromium Project, Google, Empira Software GmbH oder iText Group verbunden, von ihnen gesponsert oder autorisiert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Besitzer. 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.