Umstellung von Patagames Tesseract.NET SDK auf IronOCR
Dieser Leitfaden führt .NET-Entwickler durch eine vollständige Migration vom Patagames Tesseract .NET SDK zu IronOCR. Sie umfasst die mechanische API-Übersetzung, die plattformübergreifende Bereitstellung, die den Großteil der Migrationen ermöglicht, sowie die praktischen Codeänderungen, die erforderlich sind, um eine OCR-Pipeline in der Produktion von einem reinen Windows-Wrapper auf eine Bibliothek umzustellen, die ohne Änderungen unter Windows, Linux, macOS, Docker, Azure und AWS läuft.
Warum von Patagames Tesseract .NET SDK migrieren?
Die Mehrheit der Teams, die Patagames als Ersatz in Betracht ziehen, ist mit der OCR-Genauigkeit nicht unzufrieden. Sie stoßen auf eine Bereitstellungsbarriere – ein Linux-Container-Ziel, ein Cloud-Migrationsprojekt oder eine CI-Pipeline unter Ubuntu – und stellen fest, dass die ausschließlich für Windows bestimmte native Binärdatei auf dieser Plattform einfach keine Zukunft hat. Diese einzige Vorgabe bestimmt den weiteren Verlauf der Migrationsbewertung.
Die ausschließliche Bereitstellung für Windows blockiert den modernen .NET-Stack. Patagames liefert native Windows-Binärdateien für seinen Tesseract-Engine-Wrapper aus. Es gibt keine Laufzeitpakete für Linux x64, macOS oder ARM. Die OcrApi-Klasse lädt eine Windows-DLL zur Laufzeit; auf jedem anderen Betriebssystem schlägt das Starten der Anwendung fehl. Fügen Sie die System.Drawing.Bitmap Abhängigkeit hinzu, die Microsoft formell als nicht unterstützt für neue plattformübergreifende Entwicklung markiert hat, und die Bibliothek ist mit dem standardmäßigen Bereitstellungsmodell jedes Cloud-Anbieters und Container-Orchestrators inkompatibel.
Kommerzielle Preise für eine kostenlose Engine ohne plattformübergreifenden Zugriff. Die Tesseract-Engine, auf der Patagames basiert, ist Open Source und kostenlos. Kostenlose Community-Wrappers wie tesseractocr liefern heute ebenfalls vorgefertigte Windows-Binaries, was das Hauptargument für die Bequemlichkeit, das Patagames historisch angeboten hat, beseitigt. Eine kommerzielle Lizenz für Patagames bietet eine geringfügig übersichtlichere API-Oberfläche als das reine Tesseract, fügt jedoch keine Vorverarbeitung, PDF-Unterstützung, durchsuchbare PDF-Ausgabe oder plattformübergreifende Bereitstellung hinzu – die vier Funktionen, die eine vollständige OCR-Bibliothek im Jahr 2026 ausmachen.
Undurchsichtige Preisgestaltung macht die Budgetplanung unmöglich. Patagames veröffentlicht keine Lizenzpreise. Für die Bewertung der Bibliothek ist eine Kontaktaufnahme mit dem Vertrieb erforderlich, bevor ein Kostenvergleich vorgenommen werden kann. Die Preise für IronOCR beginnen bei $999 für eine unbefristete einzelne Entwickler-Lite-Lizenz, die ein Jahr Updates beinhaltet. Teams können Kosten und Leistungsumfang ohne Verkaufsprozess bewerten. Auf der IronOCR -Lizenzseite finden Sie alle Details zu den Lizenzstufen.
Rohe Tesseract-Variablen lecken durch die API. Das Festlegen des Seitensegmentierungsmodus in Patagames erfordert den Aufruf von api.SetVariable("tessedit_pageseg_mode", "3") — eine rohe, string-basierte Tesseract-Variableneinstellung ohne IntelliSense, ohne Prüfungen zur Kompilierzeit und ohne Entdeckungsmöglichkeit. Wenn Sie den Variablennamen falsch schreiben, führt der Aufruf stillschweigend keine Aktion aus.IronOCR umhüllt jede Tesseract-Konfigurationsoption in stark typisierte Eigenschaften auf IronTesseract.Configuration.
Kein strukturierter Output außer einem einfachen String. Patagames GetTextFromImage gibt einen einzelnen String zurück. Es besteht kein Zugriff auf Wortgrenzen, Zeilengruppierungen, Absatzstruktur oder Konfidenzwerte pro Wort. Anwendungen, die bestimmte Felder aus Formularen extrahieren oder die OCR-Genauigkeit Wort für Wort überprüfen müssen, finden in der Patagames-API keine Grundlage, auf der sie aufbauen können.
CI/CD-Pipelines scheitern am Linux-Schritt. Moderne .NET-Entwicklungsteams führen CI unter Linux aus – GitHub Actions, GitLab CI und Azure DevOps verwenden standardmäßig Linux-basierte Runner. Ein Projekt, das auf Tesseract.Net.SDK verweist, wird entweder den nativen Binärreferenzaufbau nicht schaffen oder zur Laufzeit bei Integrationstests fehlschlagen. Jeder Testlauf erfordert einen Windows-spezifischen CI-Runner oder eine Umgehungslösung, die die OCR-Schicht vollständig simuliert.
Das grundsätzliche Problem
Patagames ist ausschließlich für Windows bestimmt. Sobald sich Ihr Bereitstellungsziel ändert, kann die Bibliothek nicht mehr mithalten:
// Patagames: Windows DLL loads; fails on Linux container or macOS developer machine
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng"); // tessdata path — must be manually managed in every environment
using var bitmap = new Bitmap(imagePath); // System.Drawing — unsupported on non-Windows targets
return api.GetTextFromImage(bitmap);
// IronOCR: same code runs on Windows, Linux, macOS, Docker, Azure, AWS
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
Kein tessdata-Verzeichnis. Kein nativer DLL-Pfad. Keine plattformabhängigen Bedingungen. Der NuGet-Abhängigkeitsgraph ermittelt automatisch die richtige Laufzeitumgebung für jedes Ziel.
IronOCR vs. Patagames Tesseract.NET SDK: Funktionsvergleich
Die folgende Tabelle enthält die Funktionen, die für Teams relevant sind, die Patagames derzeit in der Produktion einsetzen.
| Feature | Patagames Tesseract .NET SDK | IronOCR |
|---|---|---|
| Windows-Unterstützung | Ja | Ja |
| Linux-Unterstützung | Nein | Ja |
| macOS-Unterstützung | Nein | Ja |
| Docker-Bereitstellung | Nein | Ja |
| Azure App Service | Nein | Ja |
| AWS Lambda | Nein | Ja |
| NuGet -Paket | Tesseract.Net.SDK | IronOcr |
| Lizenzmodell | Kommerziell (Preis auf Anfrage) | Unbefristet ($999–2.999 $, öffentlich) |
| OCR-Engine | Tesseract (Open Source) | Optimiertes Tesseract 5 (im Lieferumfang enthalten) |
| Tessdata-Management | Manuelles Verzeichnis mit .traineddata Dateien | NuGet Sprachpakete |
| Automatische Vorverarbeitung | None | Entzerren, Rauschunterdrückung, Kontrast, Binärisierung, Schärfen, Skalieren, Dilatieren, Erodieren |
| Entfernung tiefer Hintergrundgeräusche | None | Ja (DeepCleanBackgroundNoise()) |
| Native PDF-Eingabe | Nein (externer Renderer erforderlich) | Ja |
| Mehrseitige TIFF-Eingabe | Beschränkt | Ja (input.LoadImageFrames()) |
| Durchsuchbare PDF-Ausgabe | Nein | Ja (result.SaveAsSearchablePdf()) |
| hOCR-Export | Nein | Ja |
| Unterstützte Sprachen | Tesseract-tessdata-Dateien | Mehr als 125 über NuGet -Pakete |
| Mehrsprachige Simultanübertragung | Ja (Zeichenkettenverkettung) | Ja (stark typisiertes OcrLanguage Enum) |
| Regionsbasierte OCR | Nein | Ja (CropRectangle) |
| Barcode-Lesung | Nein | Ja |
| Strukturierte Ausgabe | Nur flacher String | Seiten, Absätze, Zeilen, Wörter, Zeichen mit Koordinaten |
| Vertrauenswerte pro Wort | Nein | Ja |
| Konfiguration der Seitensegmentierung | Roher SetVariable String-Aufruf | Stark typisiertes Configuration.PageSegmentationMode |
| System.Drawing-Abhängigkeit | Erforderlich | Optional |
| Thread-Sicherheit | Standard-Tesseraktgrenzen | Voll (erstelle IronTesseract pro Thread) |
| Kommerzielle Unterstützung | Ja | Ja |
| NuGet-Downloads | Beschränkt | 5,3 Mio.+ |
Schnellstart: Migration von Patagames Tesseract .NET SDK zu IronOCR
Schritt 1: Ersetzen des NuGet-Pakets
Patagames Tesseract.NET SDK entfernen:
dotnet remove package Tesseract.Net.SDK
Installieren Sie IronOCR über NuGet :
Für Sprachunterstützung über Englisch hinaus installieren Sie das entsprechende Sprachpaket:
Schritt 2: Namespaces aktualisieren
Ersetzen Sie die Patagames-Namespaces durch den IronOCR-Namespace:
// Before (Patagames)
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
// After (IronOCR)
using IronOcr;
Schritt 3: Lizenz initialisieren
Fügen Sie die Lizenzinitialisierung beim Start der Anwendung hinzu (vor dem ersten IronTesseract Aufruf):
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Eine kostenlose Testlizenz ist auf ironsoftware.com/C#/ocr/ verfügbar, um Migrationstests ohne Kauf zu beginnen.
Beispiele für die Code-Migration
Stapelverarbeitung von Ordnern
Phase 1 zeigte die Extraktion einzelner Bilder. Produktionsbereitstellungen von Patagames initialisieren typischerweise eine OcrApi innerhalb einer Schleife, wobei api.Init() bei jeder Iteration aufgerufen wird — was das tessdata neu lädt und die Tesseract-Engine für jede Datei neu initialisiert. Dieses Muster verdoppelt die Initialisierungskosten über Hunderte von Dokumenten.
Der Ansatz von Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.IO;
public class PatagamesBatchProcessor
{
private const string TessDataPath = @"./tessdata";
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
// OcrApi re-initialized per file — tessdata loaded each time
using var api = OcrApi.Create();
api.Init(TessDataPath, "eng");
using var bitmap = new Bitmap(file);
var text = api.GetTextFromImage(bitmap);
results[Path.GetFileName(file)] = text;
}
return results;
}
}
IronOCR Ansatz:
// NuGet: IronOcr
using IronOcr;
using System.IO;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public class IronOcrBatchProcessor
{
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
// Single engine instance — initialized once, reused across all files
var ocr = new IronTesseract();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
var result = ocr.Read(file);
results[Path.GetFileName(file)] = result.Text;
}
return results;
}
}
Die IronTesseract Instanz von IronOCR hält den Status der Engine über Aufrufe in Stand. Die Wiederverwendung einer Instanz für einen gesamten Stapel eliminiert den Initialisierungsaufwand pro Datei und beseitigt die Abhängigkeit vom Tessdata-Pfad vollständig. Für die parallele Batch-Verarbeitung über mehrere CPU-Kerne hinweg siehe das Multithreading-Beispiel — erstelle eine IronTesseract pro Thread anstatt eine einzelne Instanz zu teilen.
Migration des Seitensegmentierungsmodus
Patagames enthüllt den Seitensegmentierungsmodus durch einen rohen SetVariable Aufruf mit einem String-Schlüssel und einem in String geworfenen Ganzzahlwert. Kein IntelliSense, keine Enum-Validierung, kein Dokumentationshinweis an der Aufrufstelle. Eine einzige Ziffer bestimmt, ob Tesseract die Eingabe als einzelnen Textblock, eine Spalte, ein WORD oder ein einzelnes Zeichen behandelt – und es gibt keine Rückmeldung, wenn der Variablenname falsch eingegeben wird.
Der Ansatz von Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
public string OcrSingleLineField(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
// Raw variable string — no IntelliSense, no validation
// PageSegmentationMode.SingleLine == 7
api.SetVariable("tessedit_pageseg_mode", "7");
// Additional variable to suppress dictionary output
api.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -.:/");
using var bitmap = new Bitmap(imagePath);
return api.GetTextFromImage(bitmap);
}
IronOCR Ansatz:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrSingleLineField(string imagePath)
{
var ocr = new IronTesseract();
// Strongly typed enum — discoverable through IntelliSense
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine;
var result = ocr.Read(imagePath);
return result.Text;
}
Jede durch SetVariable enthüllte Tesseract-Konfigurationsoption von Patagames hat ein direkt stark typisiertes Äquivalent in IronTesseract.Configuration. Die Migration ist eine mechanische Ersetzung von String-Literalen durch benannte Enum-Werte. Die vollständige Konfigurationsoberfläche finden Sie in der IronTesseract-API Referenz. Der Leitfaden zum Lesen spezifischer Dokumente behandelt, wann die einzelnen Seitensegmentierungsmodi bei verschiedenen Dokumenttypen anzuwenden sind.
Ergebnis: Ersetzen des Iterator-Musters
Patagames gibt einen flachen String von GetTextFromImage zurück. Das Extrahieren einzelner Wörter, ihrer Begrenzungsrahmen oder ihrer Konfidenzwerte aus der Patagames-Ausgabe erfordert das Schreiben eines Parsers auf Basis der zurückgegebenen Zeichenfolge – oder den direkten Zugriff auf die zugrunde liegende Tesseract-Ergebnis-Iterator-API über Interop. Keiner dieser Ansätze ist zuverlässig oder wartbar.IronOCR bietet einen vollständig strukturierten OcrResult mit nativem Zugang zu jeder Ebene der Dokumentenhierarchie.
Der Ansatz von Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
public void ExtractWordsWithPositions(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
using var bitmap = new Bitmap(imagePath);
// Nur flacher String — no word positions, no confidence, no line grouping
var text = api.GetTextFromImage(bitmap);
// Only option: split on whitespace and hope line breaks survive
var words = text.Split(new[] { ' ', '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
//NeinX, Y, Width, Height — position information is lost
Console.WriteLine(word);
}
}
IronOCR Ansatz:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public void ExtractWordsWithPositions(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Width}x{page.Height}px");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y})");
Console.WriteLine($" Text: {paragraph.Text}");
}
foreach (var word in page.Words)
{
// Bounding box, confidence, and text for every word
Console.WriteLine($" Word: '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence:F1}%");
}
}
Console.WriteLine($"Overall confidence: {result.Confidence:F1}%");
}
Die vollständige OcrResult Struktur — Seiten, Absätze, Zeilen, Wörter und Zeichen — beseitigt die Notwendigkeit eines Nachbearbeitungsparsers. Word-Koordinaten ermöglichen die Feldextraktion nach Position, was die Grundlage für die Rechnungsbearbeitung, Formular-OCR und die Tabellenextraktion bildet. Siehe den Leitfaden zu strukturierten Ergebnissen für die vollständige Hierarchie und den Leitfaden zu Konfidenzwerten zum Filtern von Wörtern mit geringer Konfidenz.
Verarbeitung mehrseitiger TIFF-Dateien
Patagames akzeptiert ein System.Drawing.Bitmap. Ein mehrseitiges TIFF enthält mehrere eingebettete Bilder, jedoch zählt System.Drawing.Bitmap die Rahmen nicht automatisch auf — Sie müssen Image.SelectActiveFrame() verwenden, um manuell durch sie zu gehen und jede Rahmen-Bitmap in einer Schleife an GetTextFromImage zu übergeben. Die Rahmennummerierungs-API ist nicht offensichtlich und die Fehlermeldungen, wenn es fehlschlägt, sind nicht beschreibend.
Der Ansatz von Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
public string ProcessMultiPageTiff(string tiffPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
using var tiffImage = Image.FromFile(tiffPath);
var frameCount = tiffImage.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
// Manual frame selection — FrameDimension.Page required
tiffImage.SelectActiveFrame(FrameDimension.Page, i);
using var frameBitmap = new Bitmap(tiffImage);
var pageText = api.GetTextFromImage(frameBitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
IronOCR Ansatz:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
// LoadImageFrames handles all frames automatically
input.LoadImageFrames(tiffPath);
// Optional: apply preprocessing to all frames at once
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
// Per-page access if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");
}
return result.Text;
}
OcrInput.LoadImageFrames() verarbeitet die Rahmennummerierung intern und wendet Vorverarbeitung auf jeden Rahmen in der Pipeline an. Die System.Drawing Rahmenselektionszeremonie verschwindet vollständig. Weitere Optionen, einschließlich der Auswahl einzelner Bilder, wenn nur bestimmte Seiten benötigt werden, finden Sie im Leitfaden zur TIFF- und GIF-Eingabe.
PDF-Eingabe ohne externen Renderer
Patagames bietet keine native PDF-Unterstützung. Eine auf Patagames basierende PDF-OCR-Pipeline erfordert eine externe PDF-Rendering-Bibliothek — PdfiumViewer, iText oder PDFSharp — um jede Seite in ein Bitmap zu konvertieren, bevor sie an GetTextFromImage übergeben wird. Diese externe Abhängigkeit verursacht zusätzlichen Aufwand bei der Paketverwaltung, erfordert separate Lizenzüberlegungen und stellt einen sekundären Ausfallpunkt dar. Die Wiedergabequalität variiert zudem je nach Bibliothek, was sich unabhängig von der Tesseract-Engine auf die OCR-Genauigkeit auswirkt.
Der Ansatz von Patagames:
// NuGet: Tesseract.Net.SDK + PdfiumViewer (external dependency)
using Patagames.Ocr;
using PdfiumViewer; // separate NuGet package required
using System.Drawing;
using System.Text;
public string OcrPdfDocument(string pdfPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
// External renderer required — Patagames has no PDF support
using var pdfDoc = PdfDocument.Load(pdfPath);
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render at 300 DPI for acceptable OCR accuracy
using var img = pdfDoc.Render(page, 300, 300, false);
using var bitmap = new Bitmap(img);
var pageText = api.GetTextFromImage(bitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
IronOCR Ansatz:
// NuGet: IronOcr only — no external PDF renderer
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrPdfDocument(string pdfPath)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
// Preprocessing applies to every page in one call
input.Deskew();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Full per-page structured access
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Paragraphs.Length} paragraphs");
}
return result.Text;
}
Ein NuGet-Paket ersetzt zwei. Der Rendering-Schritt entfällt. Der Leitfaden zur PDF-Eingabe umfasst einseitige, mehrseitige und passwortgeschützte PDFs. Für den Workflow zur Erstellung durchsuchbarer PDF-Dateien – also die Erstellung eines mit Strg+F durchsuchbaren Dokuments aus einem gescannten PDF – zeigen der Leitfaden zu durchsuchbaren PDF-Dateien und das Beispiel für durchsuchbare PDF-Dateien die gesamte Pipeline in fünf Zeilen.
Patagames Tesseract .NET SDK API zu IronOCR Mapping-Referenz
| Patagames Tesseract .NET SDK | IronOCR-Äquivalent |
|---|---|
Tesseract.Net.SDK (NuGet-Paket) | IronOcr (NuGet-Paket) |
Patagames.Ocr (Namespace) | IronOcr (Namespace) |
Patagames.Ocr.Enums (Namespace) | IronOcr (Namespace) |
OcrApi.Create() | new IronTesseract() |
api.Init(tessDataPath, "eng") | ocr.Language = OcrLanguage.English (kein Pfad) |
api.Init(path, "eng+fra+deu") | ocr.Language = OcrLanguage.English + OcrLanguage.French + OcrLanguage.German |
api.GetTextFromImage(bitmap) | ocr.Read(imagePath).Text |
api.SetVariable("tessedit_pageseg_mode", "7") | ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine |
api.SetVariable(key, value) (jede rohe Variable) | ocr.Configuration.[TypedProperty] |
new Bitmap(imagePath) (Eingabevorbereitung) | input.LoadImage(imagePath) |
OcrBitmap.FromFile(path) | input.LoadImage(path) |
| Keine Unterstützung für Multi-Frame-TIFF | input.LoadImageFrames(tiffPath) |
| Keine PDF-Eingabe | input.LoadPdf(pdfPath) oder ocr.Read(pdfPath) |
| Keine durchsuchbare PDF-Datei | result.SaveAsSearchablePdf("output.pdf") |
| Keine Vorverarbeitung | input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize() |
| Keine Region OCR | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
| Kein Barcode-Lesen | ocr.Configuration.ReadBarCodes = true |
| Nur flaches String-Ergebnis | result.Pages, result.Lines, result.Words, result.Paragraphs |
| Keine Wort-für-Wort-Übersetzung | result.Words[i].Confidence, result.Confidence |
PageSegmentationMode Enum | TesseractPageSegmentationMode Enum |
| Kein hOCR-Export | Ergebnis .ToHOcrString() Ausgabe |
| Nur Windows x64/x86 | Windows, Linux, macOS, Docker, Azure, AWS |
Gängige Migrationsprobleme und Lösungen
Problem 1: Tessdata-Verzeichnis fehlt in neuer Umgebung
Patagames: Der api.Init(@"./tessdata", "eng") Aufruf schlägt zur Laufzeit fehl, wenn das tessdata Verzeichnis nicht vorhanden ist oder die eng.traineddata Datei fehlt. In containerisierten Umgebungen handelt es sich hierbei um einen Fehler bei der Bereitstellung, ohne dass eine Warnung während der Erstellung erfolgt. Teams, die auf Docker bereitstellen, stellen dies häufig erst fest, nachdem das Image bereits gepusht wurde.
**Lösung:**IronOCR entfernt das Konzept des tessdata-Verzeichnisses vollständig. Installieren Sie die Sprachdaten als NuGet-Pakete:
Die Sprachdaten werden zur Build-Zeit aufgelöst und sind automatisch im dotnet publish Output enthalten. Es gibt keinen falschen Weg und keinen Punkt auf der Bereitstellungs-Checkliste für Sprachdateien.
Problem 2: System.Drawing.Bitmap schlägt unter Linux fehl
Patagames: Der System.Drawing.Bitmap Konstruktor wirft TypeInitializationException oder PlatformNotSupportedException unter Linux, es sei denn, libgdiplus ist als Systempaket installiert. Selbst bei vorhandener libgdiplus ist das Verhalten über Distributionen hinweg inkonsistent. Microsoft empfiehlt ausdrücklich, System.Drawing in neuen Entwicklungen auf Nicht-Windows-Plattformen zu vermeiden.
**Lösung:**IronOCR akzeptiert Dateipfade, Byte-Arrays und Streams direkt. Die System.Drawing Abhängigkeit ist nicht erforderlich:
// Replace this pattern:
using var bitmap = new Bitmap(imagePath); // fails without libgdiplus on Linux
api.GetTextFromImage(bitmap);
// With:
var result = new IronTesseract().Read(imagePath); // no System.Drawing required
Alle unterstützten Eingabetypen, einschließlich Byte-Arrays und Streams, finden Sie im Leitfaden zur Bild-Eingabe.
Problem 3: Stille SetVariable-Fehler
Patagames: api.SetVariable("tessedit_pageseg_mode", someValue) gibt bool zurück, aber die meisten Aufrufer verwerfen den Rückgabewert. Wenn ein Variablenname falsch geschrieben ist oder ein nicht unterstützter Wert übergeben wird, wendet Tesseract stillschweigend einen Standardwert an und fährt fort. Die daraus resultierende Genauigkeitsminderung lässt sich nur schwer auf den Konfigurationsaufruf zurückführen.
Lösung: Die Konfigurationseigenschaften von IronOCR sind stark typisiert. Eine ungültige Zuweisung führt zu einem Compilerfehler, nicht zu einem stillen Laufzeitaufwertungswert:
// Compile-time safety — no silent failures
var ocr = new IronTesseract();
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleBlock;
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5; // also strongly typed
Problem 4: OcrApi innerhalb einer Schleife initialisiert
Patagames: Teams, die OcrApi innerhalb einer Verarbeitungsschleife initialisieren, verursachen tessdata-Ladeüberkopf bei jeder Iteration. Das typische Muster — OcrApi.Create() und api.Init() innerhalb eines foreach — ist aus Sicht der Thread-Isolierung korrekt, aber teuer bei der Verarbeitung von Hunderten von Dokumenten.
Lösung: Erstellen Sie eine IronTesseract pro Thread und verwenden Sie sie für alle Dokumente, die diesem Thread zugewiesen sind, erneut. Die Instanz ist zwischen .Read() Aufrufen zustandslos:
// One instance, many reads — engine initialized once
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
foreach (var file in imageFiles)
{
var text = ocr.Read(file).Text;
ProcessText(text);
}
Erstellen Sie für parallele Batch-Workloads eine Instanz pro Aufgabe. Siehe den Leistungsoptimierungsleitfaden für Durchsatzoptimierungsmöglichkeiten einschließlich IronTesseract.Configuration.TesseractVersion und Lesegeschwindigkeitsvoreinstellungen.
Problem 5: Es funktioniert kein Linux-Docker-Basis-Image
Patagames: Es gibt keine Linux-kompatible Patagames-Binärdatei. Jeder Versuch, eine auf Patagames basierende Anwendung in einem Linux-Docker-Container auszuführen, schlägt fehl. Der einzige Workaround ist ein Windows-basierter Container (FROM mcr.microsoft.com/windows/servercore), der erheblich größer, langsamer zu ziehen ist und mit den meisten Kubernetes-Konfigurationen, die Linux-Knotenpools verwenden, inkompatibel ist.
**Lösung:**IronOCR unterstützt Standard-Linux-Basisimages. Der Docker-Bereitstellungsleitfaden behandelt die genaue Konfiguration der Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
#IronOCR resolves the Linux native runtime from NuGet automatically
ENTRYPOINT ["dotnet", "MyApp.dll"]
Kein Windows-Container erforderlich. Keine separate Binärdistribution. Das gleiche Docker-Image läuft auf jedem Linux-basierten Container-Host.
Problem 6: PDF-OCR erfordert zwei NuGet-Pakete
Patagames: Das Hinzufügen von PDF-OCR zu einer Patagames-Anwendung erfordert ein zweites NuGet-Paket für die PDF-Darstellung (PdfiumViewer, iTextSharp.LGPLv2.Core oder ähnliches). Jedes Produkt hat seine eigenen Lizenzbedingungen, Aktualisierungsrhythmus und potenziellen Kompatibilitätsprobleme. Wenn die Version des PDF-Renderers und die Version von Patagames miteinander in Konflikt stehen, müssen beide Teams einbezogen werden, um das Problem zu lösen.
**Lösung:**IronOCR verarbeitet PDF-Eingaben nativ, ohne dass ein zweites Paket erforderlich ist. Die Abhängigkeit vom PDF-Renderer vollständig entfernen:
# Remove the PDF rendering shim
dotnet remove package PdfiumViewer
#IronOCR handles PDF natively
var result = new IronTesseract().Read("document.pdf");
Patagames Tesseract .NET SDK Migrations-Checkliste
Vor der Migration
Überprüfen Sie den Code vor Beginn, um alle Patagames-Verweise zu identifizieren:
# Find all files using Patagames namespaces
grep -r "Patagames.Ocr" --include="*.cs" . -l
# Find all OcrApi usage patterns
grep -r "OcrApi\|GetTextFromImage\|api\.Init\|SetVariable" --include="*.cs" .
# Find tessdata path references
grep -r "tessdata\|TessDataPath\|traineddata" --include="*.cs" .
# Find System.Drawing.Bitmap usage tied to OCR
grep -r "new Bitmap\|System\.Drawing" --include="*.cs" . -l
# Find any PDF rendering libraries used to feed Patagames
grep -r "PdfiumViewer\|iTextSharp\|PdfSharp" --include="*.csproj" .
Dokument: Gesamtsumme der OcrApi.Create() Aufrufstellen, Anzahl der verschiedenen api.Init() Sprachkonfigurationen, Standort des tessdata-Verzeichnisses in jeder Bereitstellungsumgebung und jeder Vorverarbeitungscode, der in System.Drawing oder ImageSharp geschrieben wurde und Patagames-Aufrufe umschließt.
Code-Migration
- Entfernen Sie die
Tesseract.Net.SDKNuGet-Paketreferenz von allen Projekten. - Entfernen Sie alle PDF-Render-NuGet-Pakete (PdfiumViewer, iText, etc.), die ausschließlich zur Unterstützung von Patagames verwendet wurden.
- Installieren Sie
IronOcrNuGet-Paket. - Installieren Sie
IronOcr.Languages.Englishund alle anderen benötigten Sprachpakete. - Fügen Sie
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"beim Start der Anwendung hinzu. - Ersetzen Sie
using Patagames.Ocr;undusing Patagames.Ocr.Enums;durchusing IronOcr;. - Ersetzen Sie jeden
OcrApi.Create()+api.Init(path, lang)Block durchnew IronTesseract()+ocr.Language = OcrLanguage.[Language]. - Ersetzen Sie jeden
api.GetTextFromImage(bitmap)Aufruf durchocr.Read(imagePath).Text(entfernen Sie denBitmapKonstruktor). - Ersetzen Sie jeden
api.SetVariable("tessedit_pageseg_mode", value)Aufruf durch den typisiertenocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.[Value]. - Entfernen Sie alle
System.Drawing.BitmapInstanziierungen, die ausschließlich dazu dienten, Bilder an Patagames zu übergeben. - Ersetzen Sie PDF-Rendering-Schleifen (falls vorhanden) durch
input.LoadPdf(pdfPath). - Ersetzen Sie mehrseitige TIFF-Schleifen mit
Image.SelectActiveFrame()durchinput.LoadImageFrames(tiffPath). - Ersetzen Sie jeden benutzerdefinierten Vorverarbeitungscode (System.Drawing-Resize, Kontrast, Schwelle) durch gleichwertige
OcrInputFilteraufrufe. - Entfernen Sie das Verzeichnis "tessdata" aus allen Deployment-Manifesten, Dockerfiles und CI-Kopier-Schritten.
- Aktualisieren Sie die Integrationstests, damit sie auf Linux-CI-Runner (GitHub Actions ubuntu-latest usw.) ausgeführt werden können, um das plattformübergreifende Verhalten zu überprüfen.
Nach der Migration
- Führen Sie die vollständige Suite der Tests unter Linux (nicht nur unter Windows) aus, um zu überprüfen, ob die plattformübergreifende Bereitstellung funktioniert.
- Überprüfen Sie, ob die OCR-Genauigkeit bei demselben Satz von Testbildern mindestens so gut ist wie der Patagames-Referenzwert.
- Bestätigen Sie, dass mehrsprachige Dokumente korrekten Output mit dem
OcrLanguageEnum-Ansatz produzieren. - Testen Sie die PDF-Eingabe direkt ohne die externe Rendering-Bibliothek und vergleichen Sie die Genauigkeit der Ausgabe mit dem alten Rendered-Bitmap-Pfad.
- Die Validierung der Verarbeitung von TIFF-Dateien mit mehreren Frames ergibt dieselbe Seitenanzahl und denselben Textinhalt wie die vorherige Schleife zur Frame-Nummerierung.
- Stellen Sie sicher, dass das Verzeichnis "tessdata" nicht im Deployment-Artefakt enthalten ist und keine Laufzeitpfadfehler auftreten.
- Führen Sie einen Docker-Build durch, der auf
linux/amd64abzielt, und führen Sie mindestens einen OCR-Aufruf innerhalb des Containers aus. - Stellen Sie sicher, dass die CI-Pipeline (GitHub Actions, GitLab CI, Azure DevOps) auf ihrem Standard-Linux-Runner erfolgreich abgeschlossen wird.
- Überprüfen Sie, ob für das Ergebnis Konfidenzwerte verfügbar sind und ob die auf Konfidenz basierende Filterlogik wie erwartet funktioniert.
- Bestätigen Sie, dass die Lizenzschlüsselinitialisierung vor der ersten
IronTesseractInstanz in Produktionsstartcode durchgeführt wird.
Wichtigste Vorteile der Migration zu IronOCR
Plattformübergreifende Bereitstellung ohne Codeänderungen. Nach der Migration läuft dieselbe Binärdatei auf Windows Server, Ubuntu-Docker-Containern, macOS-Entwicklerrechnern, Azure App Service unter Linux und AWS Lambda. Es gibt keine plattformabhängigen Bedingungen, keine Flags zur Laufzeitidentifizierung und keine separaten Bereitstellungsartefakte pro Betriebssystem. Eine Cloud-Migration, die zuvor durch die Windows-exklusive OCR-Bibliothek blockiert wurde, wird zu einer Standard-Container-Bereitstellung. Die Bereitstellungsanleitungen für Linux, Docker, Azure und AWS behandeln die Produktionskonfigurationen für jedes Ziel.
Die Verwaltung von Tessdata verschwindet aus dem Betrieb. Das Verzeichnis "tessdata" – sein Speicherort, sein Inhalt, seine Präsenz in jeder Umgebung – spielt für den Betrieb keine Rolle mehr. Sprachdaten sind eine NuGet-Abhängigkeit, die zur Build-Zeit aufgelöst wird. Sie erscheint automatisch im dotnet publish-Output. Es gibt keine Deployment-Runbooks, die bei der Hinzufügung einer neuen Sprache aktualisiert werden müssen, keine Docker-Layer, die bei Änderungen an Tessdata-Dateien ungültig gemacht werden müssen, und keine Produktionsstörungen aufgrund fehlender Tessdata-Dateien, die untersucht werden müssen.
Strukturierter Output ersetzt String-Parsing. Anwendungen, die zuvor den flachen String von GetTextFromImage analysierten, um Felder zu extrahieren, Inhalte zu validieren oder Vertrauen zu berechnen, greifen jetzt direkt auf diese Daten von OcrResult zu. Wortkoordinaten, Zeilengrenzen, Absatzgruppierungen und Wort-Konfidenzwerte sind Eigenschaften erster Ordnung. Feldextraktion durch Bounding-Box — die Grundlage für Rechnungsbearbeitung und OCR-Formularbearbeitung — ist ein direkter CropRectangle Aufruf anstatt einer empfindlichen Teilzeichenkettensuche.
Eingebaute Vorverarbeitung ersetzt benutzerdefinierte Bildpipelines. Jeder Vorverarbeitungscode, der geschrieben wurde, um das Fehlen eingebauter Filter von Patagames auszugleichen, kann durch OcrInput-Methodenaufrufe ersetzt werden. Entzerrung, Rauschunterdrückung, Kontrastverstärkung, Binarisierung und Auflösungsnormalisierung sind Einzeiler-Operationen. Teams, die 20-40 Stunden mit dem Aufbau und der Feinabstimmung einer System.Drawing Vorverarbeitungspipeline verbracht haben, können diese mit fünf Methodenaufrufen ersetzen und diese Wartungsbemühungen anderswo lenken. Den vollständigen Filterkatalog finden Sie in der Übersicht über die Vorverarbeitungsfunktionen.
Native PDF-Unterstützung beseitigt eine Abhängigkeitsklasse. PDF-Rendering-Bibliotheken, die ausschließlich hinzugefügt wurden, um die PDF-Lücke bei Patagames zu schließen, werden entfernt. Ein Produktions-OCR-System, das zuvor eine Koordination von Updates über drei Pakete erforderte — Tesseract.Net.SDK, ein PDF-Renderer und deren gemeinsame System.Drawing Abhängigkeit — hat jetzt ein OCR-Paket ohne Brückenabhängigkeiten. PDF-Eingaben, einschließlich passwortgeschützter und mehrseitiger Dokumente, sind ein erstklassiger Eingabetyp. Für Compliance- und Aufzeichnungsverwaltungsanwendungsfälle erzeugt result.SaveAsSearchablePdf() Textschicht-PDF-Output in einem einzigen Aufruf ohne zusätzliche Bibliotheken.
Transparente Preisgestaltung und kommerzieller Support. IronOCRs $999 unbefristete Lite-Lizenz deckt einen Entwickler und einen Bereitstellungsort mit einem Jahr Updates ab. Die Preise sind öffentlich, die Preisstruktur ist klar und kommerzieller Support ist ohne Enterprise-Vertrag verfügbar. Teams, die bisher Patagames-Tarife für eine Windows-exklusive Tesseract-Wrapper-Lösung zahlten, erhalten nun plattformübergreifende Bereitstellung, Vorverarbeitung, PDF-Unterstützung und mehr als 125 Sprachen – und wechseln gleichzeitig zu einem Preismodell, bei dem die Kosten bereits vor Abschluss der Evaluierung bekannt sind. Vollständige Informationen zu den Lizenzstufen finden Sie unter IronOCR-Lizenzierung und eine kostenlose Testlizenz auf der IronOCR-Produktseite.
