IronOCR vs. AWS Textract: OCR-Lösungen für Startups
GdPicture.NET erfordert eine Kernlizenz, bevor Sie einen einzelnen Dollar für das OCR-Plugin zahlen — und wenn Sie PDFs lesen oder durchsuchbare Ausgaben erstellen möchten, benötigen Sie auch zusätzliche PDF-Plugins. Kontaktieren Sie GdPicture für aktuelle Preisinformationen. Für ein Team, das Text aus Bildern und PDFs extrahieren muss, können sich die kombinierten Kosten mehrerer Plugins plus jährliche Wartungsgebühren erheblich addieren. Die Abrechnung ist eine direkte Folge der Architektur von GdPicture: Es handelt sich um eine vollständige Dokumentenverarbeitungsplattform, die Scannen, DICOM, Annotationen, Barcode-Verarbeitung und PDF-Bearbeitung abdeckt, wobei OCR nur eines von vielen Plugins ist. Teams, die lediglich OCR-Anforderungen haben, tragen die Kosten für ein komplettes Dokumenten-Imaging-SDK, das sie nie vollständig nutzen werden.
Die API spiegelt dieselbe Philosophie wider. GdPicture verwendet ganze Bild-IDs, um Ressourcen im Speicher zu verfolgen — jedes Bild, das Sie laden, gibt einen int zurück, Sie rufen Methoden gegen diesen ganzzahligen Handle auf und müssen ihn dann explizit freigeben oder ein Speicherleck in Kauf nehmen. Dieses Muster existiert schon vor IDisposable und using Anweisungen. Es funktioniert zwar, aber die Verantwortung für jede einzelne Bereinigungsentscheidung liegt jedes Mal beim Entwickler. Dieser Vergleich untersucht diese beiden Spannungsfelder – pluginbasierte Preisgestaltung und den Lebenszyklus der Bild-ID – sowie die Komplexität der API, die Vorverarbeitung und die PDF-Verarbeitung, wobei IronOCR als Gegenbeispiel dient.
GdPicture .NET verstehen
GdPicture .NET ist ein kommerzielles SDK für die Dokumentenbildverarbeitung, das von ORPALIS entwickelt wurde. Über viele Jahre hinweg wurde daraus eine breit angelegte Plattform entwickelt, die Bildverarbeitung, PDF-Erstellung und -Bearbeitung, Barcode-Lesen und -Generierung, TWAIN/WIA-Scannerintegration, DICOM-medizinische Bildgebung, Annotations- und Prüfworkflows sowie Dokumentenarchivierung mit PDF/A-Konformität umfasst. OCR ist eine Funktion innerhalb dieses Ökosystems und wird über ein spezielles Plugin bereitgestellt.
Das SDK organisiert seine Funktionalität in verschiedene Module, von denen jedes seine eigene Hauptklasse hat:
- GdPictureImaging – Laden, Verarbeiten und Konvertieren von Bildern sowie die Quelle aller ganzzahligen Bild-IDs
- GdPicturePDF – PDF-Erstellung, -Bearbeitung, -Rendering und OCR-Operationen auf Seitenebene (separate Plugin-Lizenz erforderlich)
- GdPictureOCR — Texterkennung und -extraktion; verbraucht von GdPictureImaging erzeugte Bild-IDs.
- GdPicture1DBarcode / GdPicture2DBarcode — Lesen und Schreiben von linearen und 2D-Barcodes (separate Plugin-Lizenzen)
- GdPictureDocumentImaging – Erweiterte Dokumentenbereinigungsfilter, einschließlich Entzerren, Fleckenentfernung, Randentfernung und Lochungsentfernung (separates Plugin)
- GdPictureAnnotations – Dokumentenmarkierung, -prüfung und -schwärzung
Sogar die grundlegende OCR erfordert das Instanziieren von zwei Komponenten — GdPictureImaging zum Laden des Bildes und GdPictureOCR zur Texterkennung — und die Verwaltung beider Lebenszyklen. OCR aus einem PDF benötigt eine dritte: GdPicturePDF. Der Namespace selbst enthält eine Versionsnummer (GdPicture14), was bedeutet, dass jedes große SDK-Upgrade ein Suchen-und-Ersetzen im gesamten Code erfordert.
Der Plugin-Abhängigkeitsbaum für gängige OCR-Szenarien sieht folgendermaßen aus:
| Falls Sie benötigen | Sie müssen eine Lizenz erwerben |
|---|---|
| OCR aus Bildern | Basislizenz + OCR-Plugin |
| OCR aus PDFs | Basisversion + OCR-Plugin + PDF-Plugin |
| Durchsuchbare PDF-Ausgabe | Basisversion + OCR-Plugin + PDF-Plugin |
| Dokumentenbereinigung vor der OCR | Basis + OCR-Plugin + Dokumenten-Imaging-Plugin |
Der Lebenszyklus der Bild-ID
Das definierende architektonische Merkmal von GdPicture ist die Verwaltung von ganzzahligen Bild-IDs. Das Laden eines Bildes reserviert Speicherplatz innerhalb der GdPicture-Runtime und gibt einen int Handle zurück. Sie verwenden diese Ganzzahl, um in allen nachfolgenden Aufrufen auf das Bild zu verweisen. Wenn Sie fertig sind, rufen Sie ReleaseGdPictureImage mit dieser Ganzzahl auf. Wenn Sie dies nicht tun, wird der Speicher erst freigegeben, wenn der Prozess beendet ist.
using GdPicture14;
// Every image load returns an integer handle
int imageId = _imaging.CreateGdPictureImageFromFile(imagePath);
if (imageId == 0)
{
throw new Exception($"Failed to load image: {_imaging.GetStat()}");
}
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId))
{
throw new Exception($"OCR failed: {_ocr.GetStat()}");
}
return _ocr.GetOCRResultText(resultId);
}
finally
{
// CRITICAL: omitting this line causes a memory leak
_imaging.ReleaseGdPictureImage(imageId);
}
using GdPicture14;
// Every image load returns an integer handle
int imageId = _imaging.CreateGdPictureImageFromFile(imagePath);
if (imageId == 0)
{
throw new Exception($"Failed to load image: {_imaging.GetStat()}");
}
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId))
{
throw new Exception($"OCR failed: {_ocr.GetStat()}");
}
return _ocr.GetOCRResultText(resultId);
}
finally
{
// CRITICAL: omitting this line causes a memory leak
_imaging.ReleaseGdPictureImage(imageId);
}
Imports GdPicture14
' Every image load returns an integer handle
Dim imageId As Integer = _imaging.CreateGdPictureImageFromFile(imagePath)
If imageId = 0 Then
Throw New Exception($"Failed to load image: {_imaging.GetStat()}")
End If
Try
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If String.IsNullOrEmpty(resultId) Then
Throw New Exception($"OCR failed: {_ocr.GetStat()}")
End If
Return _ocr.GetOCRResultText(resultId)
Finally
' CRITICAL: omitting this line causes a memory leak
_imaging.ReleaseGdPictureImage(imageId)
End Try
Bei der Verarbeitung mehrseitiger PDFs erzeugt jede gerenderte Seite eine separate Bild-ID. Ein 100-seitiges Dokument mit 200 DPI kann 1–5 GB Speicherplatz belegen, wenn die Speicherbereinigung versäumt wird. Das korrekte Muster erfordert das Sammeln aller IDs und das Freigeben in einem finally Block — aber diese Disziplin liegt ganz in der Verantwortung des Entwicklers.
IronOCR verstehen
IronOCR ist eine kommerzielle OCR-Bibliothek für .NET , die als einzelnes NuGet Paket entwickelt wurde. Ziel des Designs ist Genauigkeit ohne Konfigurationsaufwand: Paket installieren, Lizenzschlüssel setzen, Read aufrufen. Die Bibliothek kapselt eine optimierte Tesseract 5-Engine mit automatischer Vorverarbeitung, nativer PDF-Verarbeitung und strukturiertem Ergebniszugriff, die alle über Standard .NET -Muster bereitgestellt werden.
Hauptmerkmale:
- Einzelnes NuGet-Paket —
dotnet add package IronOcrinstalliert alles inklusive Unterstützung der englischen Sprache; keine externen Ressourcenordner, keine native Binärverwaltung - Standard .NET resource management —
OcrInputimplementsIDisposable; EineusingAnweisung behandelt alle Aufräumarbeiten, unabhängig von Ausnahmen. - Automatische Vorbearbeitung — Deskew, DeNoise, Kontrast, Binarisierung und EnhanceResolution sind Einzeiler-Methodenaufrufe auf
OcrInput; die Engine nimmt auch ohne ausdrückliche Anweisung automatische Korrekturen vor - Natives PDF-Input — gescannte PDFs und native PDFs werden beide direkt in
IronTesseract.Readeingespeist, ohne dass ein separater Rendering-Schritt erforderlich ist. - Thread-sicher durch Design — eine einzelne
IronTesseractInstanz verarbeitet parallele Anforderungen;Parallel.ForEachfunktioniert ohne zusätzliche Synchronisation. - 125+ Sprachen — verteilt als separate NuGet-Pakete (
IronOcr.Languages.French, etc.), kein tessdata-Ordner zu verwalten. - Strukturierter Ergebniszugriff —
OcrResultstellt.Pages,.Lines,.Words,.Charactersund.Barcodesals typisierte Sammlungen mit Koordinatendaten zur Verfügung.
Die Preisgestaltung ist unbefristet: $999 Lite, $1,499 Plus, $2,999 Professional, $5,999 Unlimited. Alle Funktionen sind in jeder Stufe verfügbar; Der Unterschied liegt in der Anzahl der Entwickler und der abgedeckten Projekte.
Funktionsvergleich
| Feature | GdPicture.NET | IronOCR |
|---|---|---|
| Preismodell | Plugin-basierte, unbefristete Lizenz + 20 %/Jahr Wartung | Feste, unbefristete Gebühr, optionale jährliche Aktualisierungen |
| Eingabekosten (OCR aus PDFs) | Mehrere Plugins erforderlich (kontaktieren Sie GdPicture für Preisangaben) | $2,999 (ein Paket, alle Funktionen) |
| Ressourcenmanagement | Manuelle Verfolgung und Freigabe von Ganzzahl-IDs | IDisposable / using Anweisung |
| Namensraumstabilität | Versionsnummer im Namespace (GdPicture14) |
Versions-agnostisch (IronOcr) |
| PDF-OCR | Erfordert ein separates PDF-Plugin. | Integriert, keine zusätzliche Lizenz erforderlich |
| Installation | Mehrere NuGet Pakete + externer Ressourcenordner | Einzelnes NuGet, keine externen Dateien |
| Plattformübergreifend | Windows, Linux, macOS | Windows, Linux, macOS, Docker, AWS, Azure |
Detaillierter Funktionsvergleich
| Feature | GdPicture.NET | IronOCR |
|---|---|---|
| Einrichtung und Installation | ||
| NuGet -Installation | Mehrere Pakete erforderlich | dotnet add package IronOcr |
| Externer Ressourcenordner | Erforderlich (Sprachdateien im Tessdata-Format) | Nicht erforderlich (im Paket enthalten) |
| Lizenzaktivierung | LicenseManager.RegisterKEY() |
IronOcr.License.LicenseKey = "..." |
| Komponenteninitialisierung | 3–4 Klassen für den PDF-OCR-Workflow | new IronTesseract() |
| Namespace bei größerem Upgrade | Jede Quelldatei muss aktualisiert werden. | Keine Änderung erforderlich |
| OCR-Fähigkeiten | ||
| Bild-OCR | Ja | Ja |
| PDF-OCR | Ja (PDF-Plugin erforderlich) | Ja (integriert) |
| Passwortgeschütztes PDF | Ja | Ja |
| Mehrseitiges PDF | Manuelle Seitenschleife + ID-Bereinigung | Automatisch |
| Durchsuchbare PDF-Ausgabe | OcrPage + SaveToFile |
result.SaveAsSearchablePdf() |
| hOCR-Export | Nein | Ja |
| Vorverarbeitung | ||
| Entschiefen | Über das GdPictureDocumentImaging-Plugin | input.Deskew() |
| Rauschunterdrückung | Über das GdPictureDocumentImaging-Plugin | input.DeNoise() |
| Kontrastverbesserung | Über GdPictureImaging | input.Contrast() |
| Binärisierung | Über GdPictureImaging | input.Binarize() |
| DPI-Verbesserung | Über GdPictureImaging | input.EnhanceResolution(300) |
| Automatische Korrektur (kein Code) | Nein | Ja (integriert zum Lesen) |
| Ressourcenmanagement | ||
| Speicherverwaltungsmodell | Manuelle Verfolgung von Ganzzahl-IDs | IDisposable / GC |
| Risiko eines Speicherlecks | Hoch (fehlendes ReleaseGdPictureImage) | Keine (using-Anweisung) |
| Gewindesicherheit | Manuelle Instanzverwaltung | Thread-sicher durch Design |
| Ergebnisse und Daten | ||
| Klartext | GetOCRResultText(resultId) |
result.Text |
| Vertrauensindex | GetOCRResultConfidence(resultId) |
result.Confidence |
| Daten auf Wortebene | Verschachtelte Block-/Zeilen-/Wortiteration | result.Words Sammlung |
| Koordinierter Zugriff | Über Block-/Zeilen-/Wortindexaufrufe | Direkte .X, .Y, .Width, .Height |
| Barcode-Lesung während der OCR | Über ein separates Barcode-Plugin | ocr.Configuration.ReadBarCodes = true |
| Sprachen | ||
| Wortanzahl | Tesseract-basiert, ähnliche Abdeckung | Mehr als 125 über NuGet -Pakete |
| Sprachverteilung | Ressourcenordnerdateien | NuGet-Pakete |
| Mehrsprachigkeit in einem Durchgang | Ja | Ja (AddSecondaryLanguage) |
| Einsatz | ||
| Docker | Unterstützt | Unterstützt (dokumentiert) |
| Linux | Unterstützt | Unterstützt |
| AWS Lambda | Möglich | Dokumentierter Leitfaden |
| Azure App-Dienst | Möglich | Dokumentierter Leitfaden |
Bild-ID-Lebenszyklus vs. Einweg-OCR-Eingabe
Der bedeutendste architektonische Unterschied zwischen GdPicture und IronOCR besteht nicht in einem Funktionsumfang – sondern darin, wie die jeweilige Bibliothek den Speicher für die von ihr verarbeiteten Bilder verwaltet.
GdPicture-Ansatz
Jedes Bild in GdPicture existiert als Integer-Handle in einem zur Laufzeit verwalteten Pool. Man erhält das Handle, indem man ein Bild lädt, diese Ganzzahl an die OCR und andere Operationen übergibt und sie dann wieder freigibt, wenn man fertig ist. Das Muster ist eindeutig und bei Einhaltung korrekt. Das Problem ist, dass man sich leicht irren kann, und die Folge ist ein unbegrenztes Speicherwachstum.
Der PDF-OCR-Workflow verdeutlicht das Risiko am deutlichsten. Jeder Aufruf von pdf.RenderPageToGdPictureImage() allokiert ein neues Rasterbild im Speicher und gibt eine neue Ganzzahl-ID zurück. Ein 100-seitiges Dokument erzeugt 100 separate Zuordnungen. Vergessen Sie einen ReleaseGdPictureImage Aufruf und der Prozess akkumuliert geleakten Speicher:
using GdPicture14;
public string ExtractTextFromPdf(string pdfPath)
{
var text = new StringBuilder();
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(pdfPath, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Failed to load PDF: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// Each page render = new memory allocation + new integer ID
int imageId = pdf.RenderPageToGdPictureImage(200, false);
if (imageId == 0) continue;
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (!string.IsNullOrEmpty(resultId))
text.AppendLine(_ocr.GetOCRResultText(resultId));
}
finally
{
// Without this: ~10–50MB leaked per page
_imaging.ReleaseGdPictureImage(imageId);
}
}
return text.ToString();
}
using GdPicture14;
public string ExtractTextFromPdf(string pdfPath)
{
var text = new StringBuilder();
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(pdfPath, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Failed to load PDF: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// Each page render = new memory allocation + new integer ID
int imageId = pdf.RenderPageToGdPictureImage(200, false);
if (imageId == 0) continue;
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (!string.IsNullOrEmpty(resultId))
text.AppendLine(_ocr.GetOCRResultText(resultId));
}
finally
{
// Without this: ~10–50MB leaked per page
_imaging.ReleaseGdPictureImage(imageId);
}
}
return text.ToString();
}
Imports GdPicture14
Imports System.Text
Public Function ExtractTextFromPdf(ByVal pdfPath As String) As String
Dim text As New StringBuilder()
Using pdf As New GdPicturePDF()
Dim status As GdPictureStatus = pdf.LoadFromFile(pdfPath, False)
If status <> GdPictureStatus.OK Then
Throw New Exception($"Failed to load PDF: {status}")
End If
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
' Each page render = new memory allocation + new integer ID
Dim imageId As Integer = pdf.RenderPageToGdPictureImage(200, False)
If imageId = 0 Then Continue For
Try
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If Not String.IsNullOrEmpty(resultId) Then
text.AppendLine(_ocr.GetOCRResultText(resultId))
End If
Finally
' Without this: ~10–50MB leaked per page
_imaging.ReleaseGdPictureImage(imageId)
End Try
Next
End Using
Return text.ToString()
End Function
Die Stapelverarbeitung mehrerer PDFs verschärft dieses Problem. Die Dokumentation für jede for Schleife muss eine Notiz enthalten, die die Verantwortlichen daran erinnert, IDs in einem List<int> zu sammeln und sie alle in finally freizugeben. Das ist Infrastrukturarbeit, keine OCR-Arbeit.
IronOCR-Ansatz
OcrInput ist ein Standard IDisposable. Eine using Anweisung garantiert das Aufräumen, unabhängig davon, ob die Methode normal zurückkehrt oder eine Ausnahme wirft. Es gibt keine ganzzahligen IDs, die verfolgt werden müssen, keine separate Bildverarbeitungskomponente, die initialisiert werden muss, und keinen externen DPI-Rendering-Schritt für PDF-Seiten.
using IronOcr;
public string ExtractTextFromPdf(string pdfPath)
{
// LoadPdf handles page rendering internally
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = new IronTesseract().Read(input);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
return result.Text;
// using block exits — all internal resources released automatically
}
using IronOcr;
public string ExtractTextFromPdf(string pdfPath)
{
// LoadPdf handles page rendering internally
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = new IronTesseract().Read(input);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
return result.Text;
// using block exits — all internal resources released automatically
}
Imports IronOcr
Public Function ExtractTextFromPdf(pdfPath As String) As String
' LoadPdf handles page rendering internally
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Dim result = New IronTesseract().Read(input)
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text}")
Next
Return result.Text
' using block exits — all internal resources released automatically
End Using
End Function
Bei passwortgeschützten PDFs handelt es sich bei dem Parameter um ein benanntes Argument und nicht um eine separate Überladung, die eine zusätzliche Statusprüfung erfordert:
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
Using input As New OcrInput()
input.LoadPdf("encrypted.pdf", Password:="secret")
Dim result = New IronTesseract().Read(input)
result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
Der IronOCR PDF-Eingabeleitfaden enthält weitere Optionen, darunter die Auswahl des Seitenbereichs. Für Teams, die bereits mit IDisposable Mustern bei Entity Framework, HttpClient und Stream-Verarbeitung vertraut sind, erfordert OcrInput kein neues mentales Modell.
Plugin-Bundling-Kosten
Für eine Serveranwendung, die Text aus Bildern und PDFs extrahiert und durchsuchbare Ausgaben erstellt, erfordert der GdPicture Lizenzstapel mehrere Plugins. Kontaktieren Sie GdPicture für aktuelle Preisinformationen zur Professional-Kernlizenz, dem OCR-Plugin und dem PDF-Plugin. Jährliche Wartungsgebühren (typischerweise ein Prozentsatz der gesamten Lizenzkosten) summieren sich im Laufe der Zeit.
IronOCR Professional deckt denselben Arbeitsablauf in einem einzigen Paket ab:
IronOCR Professional: $professionalLicense (einmalig)
Optionale jährliche Aktualisierungen: $plusLicense/Jahr
3-Jahres-Gesamtkosten (unbefristet, keine Aktualisierungen): $professionalLicense
Die Mehrjahreskosten-Differenz kann je nach Aktualisierungspräferenzen erheblich sein. Diese Lücke besteht, weil das Plugin-Modell von GdPicture auf eine vollständige Dokumentenverarbeitungsplattform ausgelegt ist und nicht auf OCR-orientierte Arbeitslasten. Das OCR-Plugin wird benötigt, bevor das PDF-Plugin verwendet werden kann, um das häufigste OCR-Eingabeformat nutzbar zu machen.
Teams, die GdPicture für OCR evaluieren, bezahlen für Funktionen, die in OCR-fokussierten Backlogs selten vorkommen: TWAIN/WIA-Scannerintegration, DICOM-medizinische Bildgebung, Annotations- und Schwärzungs-Workflows sowie erweiterte PDF-Bearbeitung, die über die Textextraktion hinausgeht. Siehe die IronOCR-Lizenzierungsseite für ein Preismodell, bei dem alle Funktionen auf jeder Stufe verfügbar sind – keine Plugins, keine Addons, keine per-Funktions-Lizenzierungsentscheidungen.
API-Komplexität und Vorverarbeitung
GdPicture bietet Vorverarbeitung über GdPictureImaging (Kontrast, Binarisierung, Auflösungsanpassung) und über ein separates GdPictureDocumentImaging Plugin (Deskew, Despeckle, Randentfernung) an. Das Anwenden der Entzerrung vor der OCR erfordert die Lizenz des Document Imaging Plugins und stellt somit einen dritten Kostenfaktor in jedem Workflow dar, der gescannte Dokumente von unterschiedlicher Qualität verarbeitet.
GdPicture-Ansatz
Der vollständige Workflow für ein gescanntes PDF minderer Qualität – Laden, Vorverarbeitung, OCR jeder Seite, Freigabe – umfasst drei Komponentenklassen und erfordert eine sorgfältige Statusprüfung in jedem Schritt:
using GdPicture14;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(inputPdf, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Load failed: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// OcrPage adds text layer to each page
// Requires: OCR plugin + PDF plugin + resource folder path
GdPictureStatus ocrStatus = pdf.OcrPage(
"eng",
@"C:\GdPicture\Resources\OCR", // Externer Ressourcenordner required
"",
200
);
if (ocrStatus != GdPictureStatus.OK)
Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}");
}
pdf.SaveToFile(outputPdf, true);
}
using GdPicture14;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(inputPdf, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Load failed: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// OcrPage adds text layer to each page
// Requires: OCR plugin + PDF plugin + resource folder path
GdPictureStatus ocrStatus = pdf.OcrPage(
"eng",
@"C:\GdPicture\Resources\OCR", // Externer Ressourcenordner required
"",
200
);
if (ocrStatus != GdPictureStatus.OK)
Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}");
}
pdf.SaveToFile(outputPdf, true);
}
Imports GdPicture14
Public Sub CreateSearchablePdf(inputPdf As String, outputPdf As String)
Using pdf As New GdPicturePDF()
Dim status As GdPictureStatus = pdf.LoadFromFile(inputPdf, False)
If status <> GdPictureStatus.OK Then
Throw New Exception($"Load failed: {status}")
End If
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
' OcrPage adds text layer to each page
' Requires: OCR plugin + PDF plugin + resource folder path
Dim ocrStatus As GdPictureStatus = pdf.OcrPage(
"eng",
"C:\GdPicture\Resources\OCR", ' Externer Ressourcenordner required
"",
200
)
If ocrStatus <> GdPictureStatus.OK Then
Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}")
End If
Next
pdf.SaveToFile(outputPdf, True)
End Using
End Sub
Der ResourceFolder Pfad ist nicht optional. Er muss zu einem Verzeichnis führen, das zur Laufzeit .traineddata Sprachdateien enthält. Dieser Pfad funktioniert auf dem Entwicklungssystem, scheitert jedoch in der Produktion, wenn das Dienstkonto C:\GdPicture\Resources\OCR nicht sehen kann, oder wenn die Anwendung auf Linuxbereitgestellt wird, oder wenn Docker-Images diese Verzeichnisstruktur nicht enthalten. Das Debuggen dieser Fehler bedeutet oft, dass man generischen GdPictureStatus Fehlercodes nachjagt, die wenig über die eigentliche Ursache aussagen.
IronOCR-Ansatz
Der entsprechende Arbeitsablauf in IronOCR– einschließlich der Vorverarbeitung zur Entzerrung und Rauschentfernung – umfasst fünf Zeilen:
using IronOcr;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(inputPdf);
input.Deskew(); //Neinseparate plugin required
input.DeNoise();
var result = ocr.Read(input);
result.SaveAsSearchablePdf(outputPdf);
}
using IronOcr;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(inputPdf);
input.Deskew(); //Neinseparate plugin required
input.DeNoise();
var result = ocr.Read(input);
result.SaveAsSearchablePdf(outputPdf);
}
Imports IronOcr
Public Sub CreateSearchablePdf(inputPdf As String, outputPdf As String)
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf(inputPdf)
input.Deskew() 'Neinseparate plugin required
input.DeNoise()
Dim result = ocr.Read(input)
result.SaveAsSearchablePdf(outputPdf)
End Using
End Sub
Die englische Sprachunterstützung ist im NuGet Paket integriert. Zusätzliche Sprachen werden als NuGet-Pakete installiert (IronOcr.Languages.French) anstelle von .traineddata Dateien in einem Dateisystempfad. Der Leitfaden zur Bildqualitätskorrektur und der Leitfaden zur Bildorientierungskorrektur decken das gesamte Spektrum der Vorverarbeitungsoptionen auf OcrInput ab.
Bei der vertrauensbasierten Verarbeitung – beispielsweise beim Filtern von Ergebnissen unterhalb eines Schwellenwerts vor dem Schreiben in eine Datenbank – gibt das Ergebnisobjekt die Vertrauenswürdigkeit direkt an:
var result = new IronTesseract().Read("scanned.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");
// Per-word confidence for fine-grained filtering
var highConfidenceWords = result.Words
.Where(w => w.Confidence > 85)
.Select(w => w.Text);
var result = new IronTesseract().Read("scanned.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");
// Per-word confidence for fine-grained filtering
var highConfidenceWords = result.Words
.Where(w => w.Confidence > 85)
.Select(w => w.Text);
Imports System
Imports System.Linq
Dim result = (New IronTesseract()).Read("scanned.jpg")
Console.WriteLine($"Confidence: {result.Confidence}%")
' Per-word confidence for fine-grained filtering
Dim highConfidenceWords = result.Words _
.Where(Function(w) w.Confidence > 85) _
.Select(Function(w) w.Text)
GdPicture erfordert drei verschachtelte Schleifen — Blöcke, Zeilen, Wörter — um die gleichen Daten zu erreichen, mit indexbasierten Methodenaufrufen auf jeder Ebene (GetOCRResultBlockLineWordConfidence(resultId, b, l, w)). Die Anleitung zur Berechnung der Konfidenzwerte veranschaulicht das strukturierte Zugriffsmodell für gängige Anwendungsfälle.
Zugriff auf strukturierte Daten und Ergebnisse
Die Extraktion von Koordinaten und Konfidenzwerten pro Wort ist eine häufige Voraussetzung für Workflows zur Dokumentenanalyse – die Extraktion von Rechnungsfeldern, die Formularverarbeitung und die Layoutanalyse benötigen sie alle.
GdPicture-Ansatz
GdPicture gibt einen resultId String von RunOCR() zurück, und alle Ergebnisdaten werden über diese ID durch Methodenaufrufe auf der GdPictureOCR Instanz abgefragt. Um ein Vertrauen in die einzelnen Wörter zu erreichen, müssen drei verschachtelte Ebenen durchlaufen werden:
using GdPicture14;
public List<(string word, float confidence)> GetWordConfidences(int imageId)
{
var words = new List<(string, float)>();
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
int blockCount = _ocr.GetOCRResultBlockCount(resultId);
for (int b = 0; b < blockCount; b++)
{
int lineCount = _ocr.GetOCRResultBlockLineCount(resultId, b);
for (int l = 0; l < lineCount; l++)
{
int wordCount = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l);
for (int w = 0; w < wordCount; w++)
{
string word = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w);
float conf = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w);
words.Add((word, conf));
}
}
}
return words;
}
using GdPicture14;
public List<(string word, float confidence)> GetWordConfidences(int imageId)
{
var words = new List<(string, float)>();
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
int blockCount = _ocr.GetOCRResultBlockCount(resultId);
for (int b = 0; b < blockCount; b++)
{
int lineCount = _ocr.GetOCRResultBlockLineCount(resultId, b);
for (int l = 0; l < lineCount; l++)
{
int wordCount = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l);
for (int w = 0; w < wordCount; w++)
{
string word = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w);
float conf = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w);
words.Add((word, conf));
}
}
}
return words;
}
Imports GdPicture14
Public Function GetWordConfidences(imageId As Integer) As List(Of (word As String, confidence As Single))
Dim words As New List(Of (String, Single))()
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
Dim blockCount As Integer = _ocr.GetOCRResultBlockCount(resultId)
For b As Integer = 0 To blockCount - 1
Dim lineCount As Integer = _ocr.GetOCRResultBlockLineCount(resultId, b)
For l As Integer = 0 To lineCount - 1
Dim wordCount As Integer = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l)
For w As Integer = 0 To wordCount - 1
Dim word As String = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w)
Dim conf As Single = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w)
words.Add((word, conf))
Next
Next
Next
Return words
End Function
Das ist nicht falsch – die Daten sind zugänglich. Dies erfordert jedoch das Verständnis und die Pflege eines dreidimensionalen Indexes der Ergebnisstruktur für jedes Projekt, das Daten auf Wortebene benötigt.
IronOCR-Ansatz
OcrResult stellt .Words als typisierte Sammlung zur Verfügung. LINQ arbeitet direkt dagegen:
using IronOcr;
var result = new IronTesseract().Read("invoice.jpg");
// All words with position and confidence
foreach (var word in result.Words)
{
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}");
}
// Lines, paragraphs, and pages follow the same pattern
foreach (var line in result.Lines)
Console.WriteLine(line.Text);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters");
using IronOcr;
var result = new IronTesseract().Read("invoice.jpg");
// All words with position and confidence
foreach (var word in result.Words)
{
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}");
}
// Lines, paragraphs, and pages follow the same pattern
foreach (var line in result.Lines)
Console.WriteLine(line.Text);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters");
Imports IronOcr
Dim result = New IronTesseract().Read("invoice.jpg")
' All words with position and confidence
For Each word In result.Words
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}")
Next
' Lines, paragraphs, and pages follow the same pattern
For Each line In result.Lines
Console.WriteLine(line.Text)
Next
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters")
Next
Die regionenbasierte OCR – das Extrahieren von Text aus einem definierten Rechteck eines Dokuments – ist ähnlich direkt:
var region = new CropRectangle(0, 0, 600, 100); // header area
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var headerText = new IronTesseract().Read(input).Text;
var region = new CropRectangle(0, 0, 600, 100); // header area
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var headerText = new IronTesseract().Read(input).Text;
Imports IronOcr
Dim region As New CropRectangle(0, 0, 600, 100) ' header area
Using input As New OcrInput()
input.LoadImage("invoice.jpg", region)
Dim headerText As String = New IronTesseract().Read(input).Text
End Using
Der Leitfaden zu den Leseergebnissen und der Leitfaden zur regionenbasierten OCR zeigen, wie sich diese Muster auf mehrseitige Dokumente und strukturierte Arbeitsabläufe zur Feldextraktion ausweiten lassen.
API-Mapping-Referenz
| GdPicture.NET | IronOCR-Äquivalent |
|---|---|
LicenseManager.RegisterKEY("key") |
IronOcr.License.LicenseKey = "key" |
new GdPictureImaging() |
Nicht erforderlich – wird intern abgewickelt. |
new GdPictureOCR() |
new IronTesseract() |
new GdPicturePDF() |
Nicht erforderlich — OcrInput.LoadPdf() kümmert sich darum. |
ocr.ResourceFolder = path |
Nicht erforderlich – Ressourcen sind in NuGet enthalten. |
imaging.CreateGdPictureImageFromFile(path) |
input.LoadImage(path) auf OcrInput |
imaging.ReleaseGdPictureImage(imageId) |
using var input = new OcrInput() — automatisch |
ocr.SetImage(imageId) |
Nicht erforderlich — OcrInput hält das Bild. |
ocr.Language = "eng" |
ocr.Language = OcrLanguage.English |
ocr.RunOCR() → resultId |
ocr.Read(input) → OcrResult |
ocr.GetOCRResultText(resultId) |
result.Text |
ocr.GetOCRResultConfidence(resultId) |
result.Confidence |
ocr.GetOCRResultBlockLineWordText(resultId, b, l, w) |
result.Words[i].Text |
ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w) |
result.Words[i].Confidence |
pdf.LoadFromFile(path, false) → GdPictureStatus |
input.LoadPdf(path) — wirft bei Fehler |
pdf.LoadFromFile(path, password) |
input.LoadPdf(path, Password: password) |
pdf.RenderPageToGdPictureImage(200, false) |
Nicht erforderlich –IronOCR rendert intern. |
pdf.SelectPage(i) |
Nicht erforderlich – alle Seiten werden standardmäßig verarbeitet |
pdf.GetPageCount() |
Nicht erforderlich — oder result.Pages.Count |
pdf.OcrPage("eng", resourcePath, "", 200) |
result.SaveAsSearchablePdf(outputPath) |
pdf.SaveToFile(outputPath, true) |
result.SaveAsSearchablePdf(outputPath) |
imaging.GetStat() / ocr.GetStat() |
Standard .NET Ausnahmen |
GdPictureStatus.OK Kontrolle nach jedem Aufruf |
Nicht erforderlich – Ausnahmen werden normal weitergegeben. |
using GdPicture14; |
using IronOcr; |
Wenn Teams einen Wechsel von GdPicture .NET zu IronOCR erwägen
OCR ist die einzige Voraussetzung.
Teams, die Dokumentenaufnahmeprozesse implementieren – von der Erfassung gescannter Rechnungen über die Verarbeitung medizinischer Formulare bis hin zur Extraktion von Vertragstexten – evaluieren GdPicture häufig, weil es in Verzeichnissen für Enterprise neben LEADTOOLS und Kofax erscheint. Sobald die Plugin-Abhängigkeitstabelle übersichtlich wird, ändert sich das Bild. Das PDF-Plugin ist nicht optional, wenn PDF-Eingabe erforderlich ist. Das Document Imaging Plugin ist nicht optional, wenn eine Vorverarbeitung erforderlich ist. Ein Team, das OCR von gescannten PDFs mit Schräglagenkorrektur benötigt, endet mit drei Plugin-Lizenzen zu erheblichen Einstiegskosten im Professional-Bereich. Wenn die Anforderung Textextraktion ist und nichts darüber hinaus in der GdPicture-Featureliste benötigt wird, stellt dieser Preis reine Mehrkosten dar.IronOCR bei $2,999 Professional deckt den identischen Arbeitsablauf ab — Bildinput, PDF-Input, Vorverarbeitung, durchsuchbares PDF-Output — aus einem einzigen Paket ohne Plug-in-Entscheidungen treffen zu müssen.
Speicherleckvorfälle in der Produktion
Der Lebenszyklus von Integer-IDs stellt in Dokumentenverarbeitungsdiensten mit hohem Durchsatz ein potenzielles Produktionsproblem dar. Bei einem Web-API-Endpunkt, der hochgeladene PDFs unter Last verarbeitet, wird es irgendwann einen Codepfad geben, bei dem der Aufruf zur Bildfreigabe nicht erreicht wird – sei es durch eine vorzeitige Rückgabe in einem Fehlerzweig, eine unbehandelte Ausnahme vor dem Aufräumblock oder einfach dadurch, dass ein neuer Entwickler, der mit diesem Muster nicht vertraut ist, eine Hilfsmethode hinzufügt, die ein ganzzahliges Bildhandle als Parameter entgegennimmt, und vergisst, dieses freizugeben. Der Speicherverbrauch steigt, der Dienst wird langsamer, und die Ursache ist in einem Heap-Dump nicht ersichtlich. Teams, die solche Vorfälle debuggt haben, wünschen sich typischerweise ein Modell, bei dem die Laufzeitumgebung die Bereinigung übernimmt. Das Standard-Disposal-Muster in IronOCR entspricht diesem Modell – einer strukturierten Bereinigung, die vom Compiler und nicht von den Entwicklern bei jedem Aufruf erzwungen wird.
Versionsaktualisierung Reibung
GdPicture bettet die Hauptversionsnummer in seinen Namensraum ein. Ein Upgrade von Version 14 auf Version 15 erfordert die Aktualisierung dieser Namespace-Direktive in jeder Quelldatei, die auf GdPicture-Klassen verweist. Bei einer großen Anwendung, in der OCR, PDF-Verarbeitung und Bildverarbeitung über Dutzende von Diensten und Hilfsklassen verteilt sind, ist dies eine nicht triviale Migrationsaufgabe – und sie bietet keinen funktionalen Nutzen. Alle modernen .NET Bibliotheken, von Microsoft.EntityFrameworkCore bis Newtonsoft.Json, verwenden versionsunabhängige Namensräume und verwalten die Versionierung stattdessen über die NuGet Paketversionsnummer.IronOCR folgt dieser Konvention: Der gleiche Namespace-Import gilt von Version 1 bis zur aktuellen Version.
Microservice- und Container-Bereitstellung
GdPicture OCR benötigt zur Laufzeit einen externen Ressourcenordner mit Sprachdatendateien unter einem bestimmten Pfad. In einer containerisierten Umgebung bedeutet dies, dass diese Dateien entweder in das Docker-Image eingebunden, ein Volume eingebunden oder ein Startskript zum Herunterladen konfiguriert werden müssen. Das typische Ergebnis ist ein Docker-Image, das mehrere hundert Megabyte größer ist als nötig, ein Punkt auf der Bereitstellungs-Checkliste, der übersehen wird, und Produktionsausfälle bei sauberen Container-Neustarts, bei denen das Volume nicht eingebunden ist.IronOCR bietet bereits englische Unterstützung im Paket selbst; Zusätzliche Sprachen werden als NuGet Pakete installiert, die Teil der Build-Ausgabe sind. Der Container erhält alles, was er benötigt, vom Wiederherstellungsschritt, und es müssen keine Pfade konfiguriert werden. Der Docker-Bereitstellungsleitfaden und der Linux-Bereitstellungsleitfaden beschreiben die spezifische Konfiguration für jede Zielumgebung.
Entwicklungsteams ohne Expertise im Bereich Dokumentenverarbeitung
Die Oberfläche von GdPicture ist zwangsläufig groß – sie deckt eine vollständige Dokumentenverarbeitungsplattform ab. Für einen Entwickler, der einem Team beitritt, um einen OCR-Mikrodienst zu warten, ist das Verständnis der Bildverarbeitungskomponente, der OCR-Komponente, der PDF-Komponente, des Lebenszyklus der Ganzzahl-ID, der Behandlung von Status-Rückgabecodes und der Konfiguration des Ressourcenordners eine hohe anfängliche Investition. Die Oberfläche von IronOCR für die OCR besteht aus drei Klassen: der Engine, dem Eingabecontainer und dem Ergebnisobjekt. Das ist das gesamte mentale Modell für 90 % der Anwendungsfälle. Das Onboarding neuer Entwickler bedeutet, sie auf die Einrichtung von IronTesseract hinzuweisen, anstatt auf eine Anleitung für ein Multi-Modul-SDK.
Gemeinsame Überlegungen zur Migration
Ersetzen der Komponenteninitialisierung
GdPicture erfordert eine vierstufige Initialisierungssequenz: den Lizenzschlüssel über LicenseManager registrieren, GdPictureImaging initialisieren, GdPictureOCR initialisieren und den Ressourcenordnerpfad festlegen.IronOCR reduziert dies auf eine einzige Eigenschaftszuweisung, die in Program.cs oder Startup.cs gehört:
// Remove
LicenseManager lm = new LicenseManager();
lm.RegisterKEY("GDPICTURE-LICENSE-KEY");
_imaging = new GdPictureImaging();
_ocr = new GdPictureOCR();
_ocr.ResourceFolder = @"C:\GdPicture\Resources\OCR";
// Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
// IronTesseract instances are instantiated per-use or as a singleton
// Remove
LicenseManager lm = new LicenseManager();
lm.RegisterKEY("GDPICTURE-LICENSE-KEY");
_imaging = new GdPictureImaging();
_ocr = new GdPictureOCR();
_ocr.ResourceFolder = @"C:\GdPicture\Resources\OCR";
// Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
// IronTesseract instances are instantiated per-use or as a singleton
' Remove
Dim lm As New LicenseManager()
lm.RegisterKEY("GDPICTURE-LICENSE-KEY")
_imaging = New GdPictureImaging()
_ocr = New GdPictureOCR()
_ocr.ResourceFolder = "C:\GdPicture\Resources\OCR"
' Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY"
' IronTesseract instances are instantiated per-use or as a singleton
Eliminierung der Bild-ID-Verfolgung
Jeder CreateGdPictureImageFromFile Aufruf und jeder RenderPageToGdPictureImage Aufruf hat einen entsprechenden ReleaseGdPictureImage Aufruf irgendwo im bestehenden Code. Diese Aufräumaufrufe werden in IronOCR vollständig entfernt — OcrInput kümmert sich um die Entsorgung. Die Migration ist mechanisch: Finde jede int imageId = ..., finde ihr entsprechendes ReleaseGdPictureImage(imageId), umhülle den Ladecode mit using var input = new OcrInput() und ersetze die GdPicture-Methodeaufrufe durch ihre IronOCR-Äquivalente.
// Remove
int imageId = _imaging.CreateGdPictureImageFromFile(path);
if (imageId == 0) throw new Exception(_imaging.GetStat().ToString());
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId)) throw new Exception(_ocr.GetStat().ToString());
string text = _ocr.GetOCRResultText(resultId);
_imaging.ReleaseGdPictureImage(imageId);
// Replace with
using var input = new OcrInput();
input.LoadImage(path);
var result = new IronTesseract().Read(input);
string text = result.Text;
// Remove
int imageId = _imaging.CreateGdPictureImageFromFile(path);
if (imageId == 0) throw new Exception(_imaging.GetStat().ToString());
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId)) throw new Exception(_ocr.GetStat().ToString());
string text = _ocr.GetOCRResultText(resultId);
_imaging.ReleaseGdPictureImage(imageId);
// Replace with
using var input = new OcrInput();
input.LoadImage(path);
var result = new IronTesseract().Read(input);
string text = result.Text;
Imports System
' Remove
Dim imageId As Integer = _imaging.CreateGdPictureImageFromFile(path)
If imageId = 0 Then Throw New Exception(_imaging.GetStat().ToString())
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If String.IsNullOrEmpty(resultId) Then Throw New Exception(_ocr.GetStat().ToString())
Dim text As String = _ocr.GetOCRResultText(resultId)
_imaging.ReleaseGdPictureImage(imageId)
' Replace with
Using input As New OcrInput()
input.LoadImage(path)
Dim result = New IronTesseract().Read(input)
Dim text As String = result.Text
End Using
Anpassung der Fehlerbehandlung
GdPicture verwendet GdPictureStatus Rückgabecodes, die nach jedem wesentlichen Vorgang überprüft werden.IronOCR löst Standard- .NET Ausnahmen aus. Die Migration ersetzt if (status != GdPictureStatus.OK) Wächter durch try/catch Blöcke, die IronOcr.Exceptions.OcrException für OCR-spezifische Fehler und standardmäßige IOException und FileNotFoundException für Inputfehler behandeln. Das Tutorial zum Lesen von Texten aus Bildern behandelt Fehlerbehandlungsmuster für häufige Szenarien.
Bereitstellung von Sprachpaketen
GdPicture Sprachdateien sind .traineddata Dateien in einem Dateisystemordner.IronOCR Sprachpakete sind NuGet Pakete. Die Migration entfernt den Ressourcenordner aus dem Bereitstellungsmanifest und fügt NuGet Paketverweise für jede erforderliche Sprache hinzu:
# Remove filesystem dependency for each language
# Add NuGet package instead
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
# Remove filesystem dependency for each language
# Add NuGet package instead
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
Der Leitfaden für mehrere Sprachen deckt die Konfiguration für mehrsprachige Dokumente ab, bei denen sowohl Haupt- als auch Sekundärsprachen auf der IronTesseract Instanz angegeben sind.
Zusätzliche Funktionen von IronOCR
Über die in diesem Vergleich behandelten Bereiche hinaus umfasst IronOCR Funktionen, für die es in einem reinen OCR-Kontext keine direkten GdPicture-Äquivalente gibt:
- Async OCR —
ReadAsyncfür nicht blockierende Operationen in ASP.NET Core-Anforderern und Hintergrunddiensten - Seitenrotationserkennung – automatische Erkennung und Korrektur gedrehter Seiten ohne manuelle Vorverarbeitung
- Fortschrittsverfolgung – Callback-basierte Fortschrittsereignisse für langlaufende Batch-Jobs, die in den Fortschrittsbalken der Benutzeroberfläche angezeigt werden.
- Stream-Eingabe —
input.LoadImage(stream)nimmtSystem.IO.Streamdirekt entgegen, wodurch temporäre Dateischreibvorgänge in Pipeline-Architekturen vermieden werden. - Spezialisierte Dokumentenlesung — speziell entwickeltes Handling für Pässe, Nummernschilder, MICR-Schecks und handschriftlichen Text über die gleiche
IronTesseractSchnittstelle
.NET-Kompatibilität und Zukunftsfähigkeit
IronOCR ist kompatibel mit .NET 8, .NET 9, .NET Standard 2.0 und .NET Framework 4.6.2 und höher. Das einzelne NuGet Paket lässt sich auf Windows x64, Windows x86, Linuxx64 und macOS identisch bereitstellen. GdPicture .NET unterstützt auch plattformübergreifende Ziele, aber aufgrund seiner Plugin-Architektur müssen bei Linux- und Container-Bereitstellungen die nativen Abhängigkeiten jedes Plugins einzeln berücksichtigt werden. Der Namespace von IronOCR ist über alle großen Versionen hinweg IronOcr geblieben, was bedeutet, dass Aktualisierungspfade keine umfassenden Suchen-und-Ersetzen-Operationen im Code erfordern. Da .NET 10 erst Ende 2026 erscheint, bietet IronOCRs Erfolgsbilanz bei der Aufrechterhaltung der Kompatibilität über aufeinanderfolgende .NET Versionen hinweg, ohne API-Änderungen zu beeinträchtigen, eine stabile Grundlage für Anwendungen mit langen Wartungszyklen.
Abschluss
GdPicture .NET ist eine legitime Wahl für Teams, die eine konsolidierte Dokumentenverarbeitungsplattform benötigen – Scannerintegration, PDF-Bearbeitung, Annotation, DICOM-Unterstützung und OCR in einem SDK von einem Anbieter. Dieser Anwendungsfall existiert. Das Plugin-Modell ist dann sinnvoll, wenn die meisten dieser Funktionen tatsächlich im Anwendungsbereich liegen.
Die Diskrepanz entsteht, wenn die Anforderung OCR lautet und die Antwort GdPicture. Das PDF-Plugin ist untrennbar mit dem Anwendungsfall der OCR-Erkennung aus PDF-Dateien verbunden. Das Document Imaging Plugin ist untrennbar mit der Vorverarbeitung verbunden. Der Lebenszyklus der Integer-IDs ist nicht optional – er ist das grundlegende Ressourcenmanagementmodell für das gesamte SDK. Ein Team, das Text aus gescannten PDFs extrahieren muss, trägt die gesamte Komplexität und die gesamten Kosten, und keine der zusätzlichen Funktionen rechtfertigt dies für seinen Arbeitsaufwand.
Die Preislücke über mehrere Jahre kann beträchtlich für einen einzelnen Entwickler-Professional-Workflow sein. Der Unterschied in der Codekomplexität ist messbar: mehr als 25 Zeilen für einfache OCR mit Aufräumarbeiten gegenüber einer einzigen Zeile. Die operative Lücke – externe Ressourcenordner, versionsspezifische Namensräume, Initialisierung mehrerer Komponenten – äußert sich eher in Reibungsverlusten bei der Bereitstellung und einem längeren Onboarding-Zeitraum als in einer höheren Zeilenanzahl, aber sie ist real.
IronOCR bei $2,999 unbefristet liefert die gleichen grundlegenden OCR-Ergebnisse — Bildtextextraktion, gescannte PDF-Verarbeitung, durchsuchbarer PDF-Ausgang, 125+ Sprachen, Vertrauenserfassung, strukturierter Datenzugriff — durch Standard .NET-Muster, die keine spezialisierte SDK-Kenntnisse erfordern, um gepflegt zu werden. Für Teams, bei denen OCR das Ziel ist und nicht nur eine Komponente in einer umfassenderen Dokumentenmanagement-Plattform, ist dies die passendere Lösung.
Häufig gestellte Fragen
Was ist GdPicture.NET OCR?
GdPicture.NET OCR ist eine OCR-Lösung, die von Entwicklern und Unternehmen verwendet wird, um Text aus Bildern und Dokumenten zu extrahieren. Es ist eine von mehreren OCR-Optionen, die neben IronOCR for .NET Application Development evaluiert wurden.
Wie ist IronOCR im Vergleich zu GdPicture.NET OCR for .NET-Entwicklern?
IronOCR ist eine NuGet-native OCR-Bibliothek für .NET, die IronTesseract als Kern-Engine verwendet. Im Vergleich zu GdPicture.NET OCR bietet sie eine einfachere Bereitstellung (keine SDK-Installationsprogramme), Pauschalpreise und eine saubere C#-API ohne COM-Interop oder Cloud-Abhängigkeiten.
Ist IronOCR einfacher einzurichten als GdPicture.NET OCR?
IronOCR wird über ein einziges NuGet-Paket installiert. Es gibt keine SDK-Installationsprogramme, keine Lizenzdateien, die kopiert werden müssen, keine COM-Komponenten, die registriert werden müssen, und keine separaten Laufzeit-Binärdateien, die verwaltet werden müssen. Die gesamte OCR-Engine ist in diesem Paket enthalten.
Welche Genauigkeitsunterschiede bestehen zwischen GdPicture.NET OCR und IronOCR?
IronOCR erreicht eine hohe Erkennungsgenauigkeit für Standardgeschäftsdokumente, Rechnungen, Quittungen und gescannte Formulare. Bei stark degradierten Dokumenten oder ungewöhnlichen Skripten variiert die Genauigkeit je nach Qualität der Quelle. IronOCR enthält Bildvorverarbeitungsfilter zur Verbesserung der Erkennung bei Eingaben von geringer Qualität.
Unterstützt IronOCR die PDF-Textextraktion?
Ja, IronOCR extrahiert Text sowohl aus nativen PDF-Dateien als auch aus gescannten PDF-Bildern in einem einzigen Aufruf. Es unterstützt auch mehrseitige TIFF-Dateien, Bilder und Streams. Bei gescannten PDFs wird die OCR seitenweise mit seitenweisen Ergebnisobjekten angewendet.
Wie sieht die Lizenzierung von GdPicture.NET OCR im Vergleich zu IronOCR aus?
IronOCR verwendet eine unbefristete Pauschallizenz, bei der keine Gebühren pro Seite oder pro Scan anfallen. Unternehmen, die große Dokumentenmengen verarbeiten, zahlen unabhängig vom Volumen die gleichen Lizenzkosten. Einzelheiten und Volumenpreise finden Sie auf der IronOCR-Lizenzierungsseite.
Welche Sprachen unterstützt IronOCR?
IronOCR unterstützt 127 Sprachen über separate NuGet-Sprachpakete. Das Hinzufügen einer Sprache erfordert einen einzigen Befehl 'dotnet add package IronOcr.Languages.{Language}'. Es ist keine manuelle Dateiablage oder Pfadkonfiguration erforderlich.
Wie installiere ich IronOCR in einem .NET -Projekt?
Installation über NuGet: 'Install-Package IronOcr' in der Paketmanager-Konsole oder 'dotnet add package IronOcr' in der CLI. Zusätzliche Sprachpakete werden auf die gleiche Weise installiert. Es ist kein natives SDK-Installationsprogramm erforderlich.
Ist IronOCR im Gegensatz zu GdPicture.NET für Docker und containerisierte Bereitstellungen geeignet?
Ja, IronOCR funktioniert in Docker-Containern über sein NuGet-Paket. Der Lizenzschlüssel wird über eine Umgebungsvariable festgelegt. Für die OCR-Engine selbst sind keine Lizenzdateien, SDK-Pfade oder Volume-Mounts erforderlich.
Kann ich IronOCR im Vergleich zu GdPicture.NET vor dem Kauf ausprobieren?
Ja. Der IronOCR-Testmodus verarbeitet Dokumente und liefert OCR-Ergebnisse mit einem Wasserzeichen als Overlay auf der Ausgabe. Sie können die Genauigkeit an Ihren eigenen Dokumenten überprüfen, bevor Sie eine Lizenz erwerben.
Unterstützt IronOCR neben der Textextraktion auch das Lesen von Barcodes?
IronOCR konzentriert sich auf die Textextraktion und OCR. Für das Lesen von Barcodes bietet Iron Software IronBarcode als Begleitbibliothek an. Beide sind einzeln oder als Teil des Iron Suite-Pakets erhältlich.
Ist es einfach, von GdPicture.NET OCR zu IronOCR zu migrieren?
Die Migration von GdPicture.NET OCR zu IronOCR umfasst in der Regel das Ersetzen von Initialisierungssequenzen durch IronTesseract-Instanziierung, das Entfernen des COM-Lifecycle-Managements und die Aktualisierung von API-Aufrufen. Die meisten Migrationen reduzieren die Code-Komplexität erheblich.

