Paddle OCR vs Tesseract: Detaillierter OCR-Vergleich
PaddleOCR bietet modernste chinesische Zeichenerkennung – aber die Verarbeitung eines einzelnen Bildes in einer .NET Anwendung erfordert fünf NuGet Pakete, einen asynchronen Modell-Download (~100 MB), der eine Verbindung zu Baidu-Servern in China herstellt, eine OpenCvSharp-Abhängigkeit für jeden Bildladevorgang und eine Kaltstartzeit von 3-5 Sekunden beim ersten Start. Das ist der Preis für die Nutzung eines Python-basierten Deep-Learning-Systems aus einem .NET Projekt. Bei Arbeitslasten mit hohem CJK-Anteil, bei denen Genauigkeit bei der chinesischen Schriftzeichen zwingend erforderlich ist und bereits eine GPU-Infrastruktur vorhanden ist, lohnt sich dieser Aufwand. Alles andere sind unnötige Gemeinkosten für das Projekt.
PaddleOCR verstehen
PaddleOCR ist ein Open-Source-OCR-System, das von Baidu auf Basis von PaddlePaddle, Baidus eigenem Deep-Learning-Framework, entwickelt wurde. Das Projekt wurde von Grund auf für Python-Entwickler entworfen und die .NET-Community greift über einen Community-Wrapper darauf zu, Sdcb.PaddleOCR, gewartet von Zhou Jie (sdcb) auf GitHub.
Die Erkennungspipeline verknüpft drei neuronale Netze nacheinander: ein Texterkennungsmodell mit differenzierbarer Binarisierung (DB), das die Begrenzungsrahmen der Textregion identifiziert, einen Richtungsklassifikator, der die Textausrichtung bestimmt, und ein Erkennungsmodell mit einem Convolutional Recurrent Neural Network (CRNN), das die erkannten Regionspixel in eine Zeichenkette umwandelt. Jedes dieser Netzwerke ist eine separate Modelldatei, die auf der Festplatte vorhanden sein muss, bevor mit der Inferenz begonnen werden kann.
Wichtigste architektonische Merkmale:
- Multi-Paket-Installation: Kernpaket (
Sdcb.PaddleOCR), Plattform-Laufzeit (Sdcb.PaddleInference.runtime.win64.mkloder das CUDA-Äquivalent), Modell-Download-Helfer (Sdcb.PaddleOCR.Models.Online) und OpenCvSharp für Bildladen — mindestens vier Pakete, fünf, wenn Sie die OpenCvSharp-Laufzeit trennen. - Obligatorischer Modell-Download: Modelle sind nicht im Paket enthalten. Der erste Aufruf verwendet
OnlineFullModels.ChineseV4.DownloadAsync(), das von Baidu-kontrollierten Servern (bj.bcebos.com) herunterlädt und etwa 100MB zu den Bereitstellungsartefakten hinzufügt. - OpenCV-Abhängigkeit für jedes Bild: Es gibt keinen direkten Pfad von einem Dateipfad zur Inferenz. Bilder müssen als OpenCvSharp
MatObjekt geladen werden, bevor sie anocr.Run(mat)übergeben werden. - GPU-Beschleunigung erfordert CUDA/cuDNN-Einrichtung: Um die beworbenen Leistungswerte zu erreichen, werden NVIDIA-Treiber, CUDA Toolkit 11.8, cuDNN 8.6+ und ein separates GPU-Runtime NuGet Paket benötigt – die Einrichtung dauert 2–8 Stunden pro Umgebung.
- Python-First-Release-Zyklus: Neue PaddleOCR-Modellversionen erscheinen zuerst in Python; .NET Wrapper-Updates folgen Wochen bis Monate später.
- 14 unterstützte Sprachen: Chinesisch (vereinfacht), Chinesisch (traditionell), Englisch, Französisch, Deutsch, Koreanisch, Japanisch, Italienisch, Spanisch, Portugiesisch, Russisch, Arabisch, Hindi und Tamil – eine feste Obergrenze
Das NuGet Paket wurde rund 200.000 Mal heruntergeladen. Der geringere Ressourcenbedarf bedeutet weniger Antworten auf Stack Overflow, weniger praxiserprobte Produktionsberichte und einen kleineren Pool an Entwicklern, die Fragen aus Erfahrung beantworten können.
Die Drei-Modell-Pipeline in der Praxis
Bei jedem PaddleOCR-Inferenzaufruf werden drei neuronale Netze nacheinander ausgeführt. Der folgende Code zeigt den kompletten Setup-Pfad, den ein Entwickler durchläuft, bevor Text zurückgegeben wird:
// Five packages required before this compiles:
// dotnet add package Sdcb.PaddleOCR
// dotnet add package Sdcb.PaddleOCR.Models.Online
// dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
// dotnet add package OpenCvSharp4
// dotnet add package OpenCvSharp4.runtime.win
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Async download from Baidu servers — blocks first run for 10-30 seconds
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// PaddleOcrAll bundles detection, classification, and recognition
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
// OpenCV required — no file path shortcut
using Mat mat = Cv2.ImRead("document.png");
if (mat.Empty())
{
throw new FileNotFoundException("Could not load image");
}
// Three neural networks fire in sequence
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
// Five packages required before this compiles:
// dotnet add package Sdcb.PaddleOCR
// dotnet add package Sdcb.PaddleOCR.Models.Online
// dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
// dotnet add package OpenCvSharp4
// dotnet add package OpenCvSharp4.runtime.win
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Async download from Baidu servers — blocks first run for 10-30 seconds
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// PaddleOcrAll bundles detection, classification, and recognition
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
// OpenCV required — no file path shortcut
using Mat mat = Cv2.ImRead("document.png");
if (mat.Empty())
{
throw new FileNotFoundException("Could not load image");
}
// Three neural networks fire in sequence
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
' Five packages required before this compiles:
' dotnet add package Sdcb.PaddleOCR
' dotnet add package Sdcb.PaddleOCR.Models.Online
' dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
' dotnet add package OpenCvSharp4
' dotnet add package OpenCvSharp4.runtime.win
' Async download from Baidu servers — blocks first run for 10-30 seconds
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
' PaddleOcrAll bundles detection, classification, and recognition
Using ocr As New PaddleOcrAll(models) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
' OpenCV required — no file path shortcut
Using mat As Mat = Cv2.ImRead("document.png")
If mat.Empty() Then
Throw New FileNotFoundException("Could not load image")
End If
' Three neural networks fire in sequence
Dim result As PaddleOcrResult = ocr.Run(mat)
Console.WriteLine(result.Text)
End Using
End Using
Das result.Regions Array enthält einzelne Texbereichsobjekte, jedes mit einem Text Zeichenkette, einem Score Vertrauenswert und einer Rect Begrenzungsbox. Um nach Vertrauenswert zu filtern: result.Regions.Where(r => r.Score > 0.8). Die Regionenreihenfolge ist räumlich, nicht lesereihenfolgegarantiert, daher ist das Sortieren nach region.Rect.Center.Y dann region.Rect.Center.X ein häufiges Muster.
IronOCR verstehen
IronOCR ist eine kommerzielle OCR-Bibliothek für .NET , die auf einer optimierten Tesseract 5 LSTM-Engine basiert und darauf ausgelegt ist, die Konfigurations- und Vorverarbeitungsarbeiten zu eliminieren, die bei der Verwendung von Tesseract erforderlich sind. Ein einziges NuGet Paket installiert die komplette Laufzeitumgebung, Sprachmodelle, native Binärdateien und die Vorverarbeitungspipeline.
Hauptmerkmale:
- Einzelpaket-Bereitstellung:
dotnet add package IronOcrinstalliert alles. Keine zusätzlichen Laufzeitpakete, keine Modell-Downloads, keine Konfiguration nativer Bibliotheken - Automatische Vorverarbeitung: Entzerren, Rauschen entfernen, Kontrast anpassen, Binarisieren und Auflösung verbessern werden automatisch bei Eingaben von geringer Qualität angewendet; explizite Kontrolle ist bei Bedarf möglich
- Nativen PDF-Support: Gescannte PDFs werden direkt über
input.LoadPdf()geladen, ohne einen Drittanbieter-Konvertierungsschritt. - 125+ Sprachen über NuGet: Jedes Sprachpaket ist eine standardmäßige NuGet-Abhängigkeit —
dotnet add package IronOcr.Languages.ChineseSimplified— keine Modellverzeichnisverwaltung. - Thread-sicher, CPU-optimiert: Integrierte Parallelisierung ohne CUDA- oder GPU-Hardwareanforderungen
- Kommerzieller Support mit SLA: Der in den USA ansässige Anbieter Iron Software bietet kommerziellen Support; Das Produkt ist kein gemeinschaftliches Nebenprojekt.
- Unbefristete Lizenzierung: $999 Lite / $1,499 Plus / $2,999 Professional — einmal zahlen, unbegrenzt laufen, ohne pro-Seite Gebühren.
Funktionsvergleich
| Feature | PaddleOCR (Sdcb) | IronOCR |
|---|---|---|
| Erforderliche NuGet Pakete | 4-5 | 1 |
| Modell-Download erforderlich | Ja (~100 MB, Baidu-Server) | Nein (gebündelt) |
| Einrichtungszeit | 30-60 Minuten | 5 Minuten |
| CJK-Genauigkeit | Ausgezeichnet (95%+) | Gut (85-90%) |
| Englisch/Lateinische Genauigkeit | Gut (92-95%) | Ausgezeichnet (97-99 %) |
| GPU-Unterstützung | Ja (komplexe CUDA-Konfiguration) | CPU-optimiert |
| Native PDF-Unterstützung | Nein | Ja |
| Unterstützte Sprachen | 14 | 125+ |
| Lizenz | Apache 2.0 (kostenlos) | Kommerziell ($999+) |
| Firmenursprung | China (Baidu) | USA (Iron Software) |
Detaillierter Funktionsvergleich
| Kategorie / Funktion | PaddleOCR (Sdcb) | IronOCR |
|---|---|---|
| Einrichten | ||
| NuGet-Pakete | 4-5 | 1 |
| Modell-Download bei Installation | Erforderlich | Enthalten |
| Erster Kaltstart | 3-5 Sekunden | Unter 1 Sekunde |
| Installationszeit | 30-60 Minuten | Unter 5 Minuten |
| OpenCV-Abhängigkeit | Erforderlich | None |
| Sprachunterstützung | ||
| Unterstützte Sprachen | 14 | 125+ |
| Methode zur Sprachinstallation | Modell herunterladen | NuGet-Paket |
| Mehrsprachige Simultanübertragung | Sequenzieller Modellwechsel | Ja (AddSecondaryLanguage) |
| CJK-Genauigkeit | Ausgezeichnet | Gut |
| Latein/Englische Genauigkeit | Gut | Ausgezeichnet |
| Eingabeverarbeitung | ||
| Eingabe einer Bilddatei | Über OpenCvSharp Mat | Direkter Dateipfad |
| Native PDF-Eingabe | Nein | Ja |
| Passwortgeschütztes PDF | Nein | Ja |
| Stream-Eingabe | Indirekt | Ja |
| Byte-Array-Eingabe | Indirekt | Ja |
| Vorverarbeitung | ||
| Automatische Vorverarbeitung | Nein | Ja |
| Entschiefen | Handbuch | Eingebaut |
| Rauschunterdrückung | Handbuch | Eingebaut |
| Kontrastverbesserung | Handbuch | Eingebaut |
| Auflösungsskalierung | Handbuch | EnhanceResolution(300) |
| Ausgabe | ||
| Vollständiger Text | Ja | Ja |
| Ergebnisse pro Region/Wort | result.Regions |
result.Words, result.Lines |
| Konfidenzwerte | Pro Region (region.Score) |
Pro Wort (word.Confidence) |
| Begrenzungsrahmen | region.Rect |
word.X, word.Y, word.Width, word.Height |
| Durchsuchbare PDF-Ausgabe | Nein | Ja |
| hOCR-Export | Nein | Ja |
| Leistung | ||
| CPU pro Image | 300-500 ms | 150-300ms |
| GPU pro Bild | 50-100 ms (erfordert CUDA) | Nicht verfügbar (CPU-optimiert) |
| Speicherverbrauch | 500 MB – 1 GB | 100-200 MB |
| Bereitstellungsgröße | 300-500 MB | ~80MB |
| Einsatz | ||
| Docker-Basisimagegröße | ~1,5 GB (mit CUDA-Basis) | ~400 MB |
| Plattformübergreifend | Windows/Linux (teilweise) | Windows, Linux, macOS |
| Air-Gapped-Bereitstellung | Ja (Modelle vor dem Download) | Ja (keine Downloads erforderlich) |
| Support und Lizenzierung | ||
| Lizenztyp | Apache 2.0 (kostenlos) | Dauerhafter Werbespot |
| Kommerzielle Unterstützung | Community/GitHub | Ja, mit SLA |
| Firma / Wartungsfirma | Baidu / Community-Wrapper | Iron Software (USA) |
| NuGet -Downloads | ~200.000 | ~5.3M |
CJK-Genauigkeit vs. Einrichtungskosten
Die Genauigkeit der CJK-Klassifizierung ist die wahre Stärke von PaddleOCR. Bei Dokumenten in vereinfachtem Chinesisch erzielt die Deep-Learning-CRNN-Architektur Genauigkeitswerte von über 95 % – und liegt damit bei dichten chinesischen Zeichenraster, gemischten chinesisch/englischen Layouts und vertikalen Textblöcken stets vor den Tesseract-basierten Systemen. Wenn der Hauptarbeitsschwerpunkt eines Projekts in der Verarbeitung chinesischer Rechnungen, Mandarin-Verträge oder japanischer Produktkataloge liegt, ist dieser Genauigkeitsvorteil real.
PaddleOCR-Ansatz
Die chinesische Modellpipeline funktioniert gut, weil die Erkennungs- und Identifizierungsnetzwerke von Baidu, dessen Kerngeschäft die Verarbeitung chinesischer Webinhalte in großem Umfang ist, anhand umfangreicher chinesischer Dokumentendatensätze trainiert wurden.
// Chinese model: highest accuracy for CJK documents
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("chinese-invoice.png");
PaddleOcrResult result = ocr.Run(mat);
// Filter low-confidence regions for cleaner output
var highConfidence = result.Regions
.Where(r => r.Score >= 0.8)
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in highConfidence)
{
Console.WriteLine($"{region.Text} ({region.Score:P0})");
}
// Chinese model: highest accuracy for CJK documents
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("chinese-invoice.png");
PaddleOcrResult result = ocr.Run(mat);
// Filter low-confidence regions for cleaner output
var highConfidence = result.Regions
.Where(r => r.Score >= 0.8)
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in highConfidence)
{
Console.WriteLine($"{region.Text} ({region.Score:P0})");
}
Imports System
Imports System.Linq
Imports OpenCvSharp
' Chinese model: highest accuracy for CJK documents
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
Using mat As Mat = Cv2.ImRead("chinese-invoice.png")
Dim result As PaddleOcrResult = ocr.Run(mat)
' Filter low-confidence regions for cleaner output
Dim highConfidence = result.Regions _
.Where(Function(r) r.Score >= 0.8) _
.OrderBy(Function(r) r.Rect.Center.Y) _
.ThenBy(Function(r) r.Rect.Center.X)
For Each region In highConfidence
Console.WriteLine($"{region.Text} ({region.Score:P0})")
Next
End Using
End Using
Das Vertrauensfilter-Muster (r.Score >= 0.8) ist wichtig, da der Deep-Learning-Erkennungsschritt gelegentlich Nicht-Text-Bereiche als Text kennzeichnen wird. Ohne Filterung entstehen im Ausgangssignal Rauschbereiche. Sortieren nach Rect.Center.Y dann Rect.Center.X approximiert die Lesereihenfolge, garantiert sie aber nicht für komplexe mehrspaltige Layouts.
IronOCR-Ansatz
Die Unterstützung für vereinfachtes Chinesisch von IronOCR wird als NuGet Paket installiert und erfordert keine Modellverwaltung. Die Genauigkeit bei chinesischen Dokumenten liegt bei 85-90% – niedriger als die über 95% von PaddleOCR beim gleichen Material, aber ausreichend für viele Anwendungsfälle in der Produktion, insbesondere wenn die Dokumente eine einheitliche Formatierung aufweisen.
// dotnet add package IronOcr.Languages.ChineseSimplified
using IronOcr;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
using var input = new OcrInput();
input.LoadImage("chinese-invoice.png");
// Preprocessing handles rotation, noise, and contrast automatically
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Word-level results with coordinates
foreach (var word in result.Words)
{
Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%");
}
// dotnet add package IronOcr.Languages.ChineseSimplified
using IronOcr;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
using var input = new OcrInput();
input.LoadImage("chinese-invoice.png");
// Preprocessing handles rotation, noise, and contrast automatically
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Word-level results with coordinates
foreach (var word in result.Words)
{
Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%");
}
Imports IronOcr
' dotnet add package IronOcr.Languages.ChineseSimplified
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
Using input As New OcrInput()
input.LoadImage("chinese-invoice.png")
' Preprocessing handles rotation, noise, and contrast automatically
input.Deskew()
input.DeNoise()
Dim result = ocr.Read(input)
' Word-level results with coordinates
For Each word In result.Words
Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%")
Next
End Using
Für Teams, die gleichzeitig mehrere Sprachen benötigen — wie gemischte Chinesische/Englische Dokumente — behandelt IronOCR die Kombination mit AddSecondaryLanguage. PaddleOCR erfordert das Umschalten von Modellsätzen zwischen den Sprachen, was separate Download-Aufrufe und separate Engine-Instanzen bedeutet.
Der Kompromiss ist eindeutig: PaddleOCR punktet mit reiner CJK-Genauigkeit.IronOCR punktet mit Genauigkeit bei Englisch/Latein (97-99% gegenüber 92-95%), Vorverarbeitung für Scans minderer Qualität und der einfachen Bedienung, da keine Modelldateien verwaltet werden müssen. Teams, die Dokumente in verschiedenen Sprachen verarbeiten oder hauptsächlich europäischsprachige Dokumente mit gelegentlichem CJK-Inhalt bearbeiten, werden das Genauigkeitsprofil von IronOCR in der Gesamtheit als nützlicher empfinden. Im IronOCR -Tutorial-Hub finden Sie Beispiele für Mehrsprachigkeit und Vorverarbeitung.
Modell-Download und -Verwaltung
Der größte Unterschied im Modellmanagement zwischen PaddleOCR und IronOCR stellt den bedeutendsten Unterschied im täglichen Betrieb dar. Es betrifft die Ersteinrichtung, CI/CD-Pipelines, Docker-Images und Air-Gap-Bereitstellungen.
PaddleOCR-Ansatz
PaddleOCR liefert die Modelle separat vom NuGet Paket aus. Für einen vollständigen OCR-Lauf werden drei Modellverzeichnisse benötigt, und jede Methode zur Beschaffung dieser Verzeichnisse birgt unterschiedliche Vor- und Nachteile:
// Option A: Online download — simplest, but requires Baidu server access
// This runs on application startup; first run blocks for 10-30 seconds
FullOcrModel onlineModels = await OnlineFullModels.ChineseV4.DownloadAsync();
// Option B: Pre-downloaded local models — for air-gapped or compliance environments
// Developer must manually download and maintain three directories:
// models/ch_PP-OCRv4_det_infer/
// models/ch_ppocr_mobile_v2.0_cls_infer/
// models/ch_PP-OCRv4_rec_infer/
FullOcrModel localModels = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"),
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"),
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer")
);
// Option C: Embedded model package — adds 100MB to NuGet restore, simplest deployment
// dotnet add package Sdcb.PaddleOCR.Models.LocalV4
// Japanese and Korean require separate model downloads:
FullOcrModel japaneseModels = await OnlineFullModels.JapanV4.DownloadAsync();
FullOcrModel koreanModels = await OnlineFullModels.KoreanV4.DownloadAsync();
// Option A: Online download — simplest, but requires Baidu server access
// This runs on application startup; first run blocks for 10-30 seconds
FullOcrModel onlineModels = await OnlineFullModels.ChineseV4.DownloadAsync();
// Option B: Pre-downloaded local models — for air-gapped or compliance environments
// Developer must manually download and maintain three directories:
// models/ch_PP-OCRv4_det_infer/
// models/ch_ppocr_mobile_v2.0_cls_infer/
// models/ch_PP-OCRv4_rec_infer/
FullOcrModel localModels = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"),
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"),
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer")
);
// Option C: Embedded model package — adds 100MB to NuGet restore, simplest deployment
// dotnet add package Sdcb.PaddleOCR.Models.LocalV4
// Japanese and Korean require separate model downloads:
FullOcrModel japaneseModels = await OnlineFullModels.JapanV4.DownloadAsync();
FullOcrModel koreanModels = await OnlineFullModels.KoreanV4.DownloadAsync();
Die Modellversion muss mit der Wrapper-Version übereinstimmen. Wenn Sdcb.PaddleOCR aktualisiert wird, können vorab heruntergeladene Modelle aus der vorherigen Version möglicherweise erneut heruntergeladen werden müssen. CI/CD-Pipelines, die den NuGet Wiederherstellungsschritt zwischenspeichern, müssen außerdem das Zwischenspeichern von Modelldateien separat verwalten oder Modell-Downloads während der Container-Build-Phase auslösen. Der Docker-Image-Vergleich zeigt die Konsequenz: Ein PaddleOCR-Container hat eine Größe von ca. 1,5 GB. ein IronOCR Container mit einer Größe von ca. 400 MB.
IronOCR-Ansatz
IronOCR Sprachmodelle sind Standard NuGet Pakete. Keine Download-Aufrufe, keine Modellverzeichnisverwaltung, keine Versionssynchronisierung. Das NuGet Paket für IronOCR enthält das englische Modell; Zusätzliche Sprachpakete werden genau wie jede andere Abhängigkeit installiert.
// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese
using IronOcr;
//Neinasync initialization, no model path, no version matching
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.Japanese);
using var input = new OcrInput();
input.LoadImage("mixed-cjk-document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese
using IronOcr;
//Neinasync initialization, no model path, no version matching
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.Japanese);
using var input = new OcrInput();
input.LoadImage("mixed-cjk-document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
' dotnet add package IronOcr
' dotnet add package IronOcr.Languages.ChineseSimplified
' dotnet add package IronOcr.Languages.Japanese
Imports IronOcr
'Neinasync initialization, no model path, no version matching
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.Japanese)
Using input As New OcrInput()
input.LoadImage("mixed-cjk-document.png")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Sprachpakete werden als Teil von dotnet restore wiederhergestellt. Der Docker-Bausschritt, der models/ Verzeichnisse kopiert, apt-get install libopencv-dev ausführt und das CUDA-Basisimage hinzufügt, existiert einfach nicht in einem IronOCR-Container. Für Teams, die Docker- oder Azure-Bereitstellung verwenden, ist der Unterschied in der Komplexität des Container-Builds erheblich.
GPU- und CUDA-Abhängigkeit
Die GPU-Leistungswerte von PaddleOCR – 50–100 ms pro Bild gegenüber 300–500 ms auf der CPU – sind real. Die Deep-Learning-Modelle profitieren deutlich von der GPU-Parallelität, was bei Tesseract-basierten Engines nicht der Fall ist. Bei einer Arbeitslast, die Zehntausende von Bildern pro Tag verarbeitet, verändert diese 5- bis 10-fache Durchsatzsteigerung die Diskussion um die Infrastruktur.
PaddleOCR-Ansatz
Für GPU-Inferenz ist ein völlig separater Software-Stack außerhalb von NuGet erforderlich. Die Systemvoraussetzungen sind präzise und versionsspezifisch:
// Prerequisites (must be installed before this compiles correctly):
// 1. NVIDIA GPU with CUDA capability 3.5+
// 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// 3. CUDA Toolkit 11.8 — exact version, not 12.x
// 4. cuDNN 8.6.0+ for CUDA 11.x
// 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB GPU memory pool
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead(imagePath);
PaddleOcrResult result = ocr.Run(mat);
// Prerequisites (must be installed before this compiles correctly):
// 1. NVIDIA GPU with CUDA capability 3.5+
// 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// 3. CUDA Toolkit 11.8 — exact version, not 12.x
// 4. cuDNN 8.6.0+ for CUDA 11.x
// 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB GPU memory pool
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead(imagePath);
PaddleOcrResult result = ocr.Run(mat);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports Sdcb.PaddleInference
Imports OpenCvSharp
' Prerequisites (must be installed before this compiles correctly):
' 1. NVIDIA GPU with CUDA capability 3.5+
' 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
' 3. CUDA Toolkit 11.8 — exact version, not 12.x
' 4. cuDNN 8.6.0+ for CUDA 11.x
' 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
' GPU device 0, 1000MB GPU memory pool
Using ocr As New PaddleOcrAll(models, PaddleDevice.Gpu(deviceId:=0)) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
Using mat As Mat = Cv2.ImRead(imagePath)
Dim result As PaddleOcrResult = ocr.Run(mat)
End Using
End Using
Wenn CUDA_PATH nicht gesetzt ist, fehlt die passende cuDNN DLL im erwarteten Pfad oder die Laufzeitpaketversion stimmt nicht mit dem installierten CUDA Toolkit überein, wirft der Aufruf eine Ausnahme bei der nativen Bibliotheksladung. Die Diagnose dieses Fehlers erfordert die Überprüfung der Treiberversionen, der PATH-Einträge und des Vorhandenseins von DLL-Dateien in mehreren Verzeichnissen. In Docker erfordert der GPU-Support das nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 Basis-Image plus nvidia-container-toolkit auf dem Host, was die Komplexität sowohl des Image-Baus als auch der Container-Laufzeitkonfiguration erhöht.
Bei reinen CPU-Bereitstellungen verwendet PaddleOCR standardmäßig die MKL-beschleunigte Laufzeitumgebung: ca. 300-500 ms pro Bild mit einem Kaltstart des Modellladens von 3-5 Sekunden.
IronOCR-Ansatz
IronOCR wurde für die CPU-Inferenz entwickelt. Es liefert 150-300 ms pro Bild auf Standardhardware ohne GPU-Abhängigkeit, ohne CUDA-Stack und ohne Treiberversionsprobleme. Die Engine startet auch in weniger als einer Sekunde, da die Modelle gebündelt und nicht bei der Initialisierung von der Festplatte geladen werden.
using IronOcr;
//NeinGPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// Preprocessing built-in — improves accuracy on poor scans without extra code
using var input = new OcrInput();
input.LoadImage("document.png");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using IronOcr;
//NeinGPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// Preprocessing built-in — improves accuracy on poor scans without extra code
using var input = new OcrInput();
input.LoadImage("document.png");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' NeinGPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
' Preprocessing built-in — improves accuracy on poor scans without extra code
Using input As New OcrInput()
input.LoadImage("document.png")
input.Deskew()
input.DeNoise()
input.EnhanceResolution(300)
Dim result = ocr.Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
Für Durchsatz im großen Maßstab ohne GPU-Hardware ermöglicht das thread-sichere Design von IronOCRParallel.ForEach über eine Gruppe von Bildern mit separaten IronTesseract Instanzen — jede wird unabhängig ohne Sperren verarbeitet. Das Beispiel mit Multithreading verdeutlicht das Muster. Bei einer Verarbeitungszeit von 150-300 ms pro Bild auf einer 4-Kern-CPU ist ein Batch von 100 Bildern in 20-40 Sekunden durch Parallelverarbeitung abgeschlossen – ein CPU-Durchsatz, der Investitionen in GPUs für die meisten Web-API- und Dokumentenpipeline-Szenarien überflüssig macht.
Der Leitfaden zur Bildqualitätskorrektur beschreibt detailliert die Vorverarbeitungskonfiguration für Fälle, in denen die automatische Vorverarbeitung angepasst werden muss.
PDF-Verarbeitung
PaddleOCR bietet keine native PDF-Unterstützung. Für jede mit PaddleOCR verarbeitete PDF-Datei ist eine externe Bibliothek erforderlich, um die Seiten zunächst in Bilder umzuwandeln, die Verwaltung temporärer Dateien zwischen Konvertierung und Auswertung sowie eine Bereinigungslogik.
PaddleOCR-Ansatz
// Requires additional package: PdfiumViewer or similar
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using PdfiumViewer;
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var results = new StringBuilder();
// Handbuch PDF-to-image conversion, page by page
using PdfDocument pdf = PdfDocument.Load("document.pdf");
for (int i = 0; i < pdf.PageCount; i++)
{
// Render page to bitmap — 200 DPI
using var pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
// Save to temp file — OpenCvSharp cannot read from memory easily
string tempPath = Path.GetTempFileName() + ".png";
pageImage.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
var result = ocr.Run(mat);
results.AppendLine($"--- Page {i + 1} ---");
results.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
return results.ToString();
// Requires additional package: PdfiumViewer or similar
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using PdfiumViewer;
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var results = new StringBuilder();
// Handbuch PDF-to-image conversion, page by page
using PdfDocument pdf = PdfDocument.Load("document.pdf");
for (int i = 0; i < pdf.PageCount; i++)
{
// Render page to bitmap — 200 DPI
using var pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
// Save to temp file — OpenCvSharp cannot read from memory easily
string tempPath = Path.GetTempFileName() + ".png";
pageImage.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
var result = ocr.Run(mat);
results.AppendLine($"--- Page {i + 1} ---");
results.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
return results.ToString();
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports System.Text
Public Class OcrProcessor
Public Shared Async Function ProcessPdfAsync() As Task(Of String)
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Dim results As New StringBuilder()
' Handbuch PDF-to-image conversion, page by page
Using pdf As PdfDocument = PdfDocument.Load("document.pdf")
For i As Integer = 0 To pdf.PageCount - 1
' Render page to bitmap — 200 DPI
Using pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
' Save to temp file — OpenCvSharp cannot read from memory easily
Dim tempPath As String = Path.GetTempFileName() & ".png"
pageImage.Save(tempPath, ImageFormat.Png)
Try
Using mat As Mat = Cv2.ImRead(tempPath)
Dim result = ocr.Run(mat)
results.AppendLine($"--- Page {i + 1} ---")
results.AppendLine(result.Text)
End Using
Finally
File.Delete(tempPath) ' Must clean up temp files
End Try
End Using
Next
End Using
Return results.ToString()
End Using
End Function
End Class
Das sind mehr als 30 Zeilen für eine einzige PDF-Datei. Hinzufügen einer weiteren NuGet Abhängigkeit (PdfiumViewer), manuelles Rendern der Seite mit einer gewählten DPI-Einstellung, Erstellen und Löschen von temporären Dateien sowie iteratives Sammeln von Ergebnissen – all dies, bevor PaddleOCR selbst ausgeführt wird. Eine zu niedrige DPI-Einstellung beeinträchtigt die Genauigkeit; Ein zu hoher Wert verlängert die Verarbeitungszeit. Die Entscheidung liegt beim Entwickler.
IronOCR-Ansatz
IronOCR liest PDFs nativ. Keine Konvertierungsbibliothek, keine temporären Dateien, keine Schleife pro Seite am Aufrufort:
using IronOcr;
var ocr = new IronTesseract();
// Native PDF-Eingabe — no external library needed
using var input = new OcrInput();
input.LoadPdf("document.pdf");
var result = ocr.Read(input);
// Per-page access available if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars");
}
// Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf");
using IronOcr;
var ocr = new IronTesseract();
// Native PDF-Eingabe — no external library needed
using var input = new OcrInput();
input.LoadPdf("document.pdf");
var result = ocr.Read(input);
// Per-page access available if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars");
}
// Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
Dim ocr As New IronTesseract()
' Native PDF-Eingabe — no external library needed
Using input As New OcrInput()
input.LoadPdf("document.pdf")
Dim result = ocr.Read(input)
' Per-page access available if needed
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars")
Next
' Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
Passwortgeschützte PDFs verwenden denselben LoadPdf Pfad mit einem Password Parameter. Die PDF-Eingabeanleitung und die durchsuchbare PDF-Anleitung beschreiben die Optionen für mehrseitige Formate und Ausgaben im Detail. Für Organisationen, die gescannte Dokumentenarchive digitalisieren – wo jede Datei als PDF ankommt – entfällt durch diesen Unterschied eine wichtige Ebene an Integrationscode.
API-Mapping-Referenz
| PaddleOCR (Sdcb) | IronOCR-Äquivalent | Notizen |
|---|---|---|
Sdcb.PaddleOCR |
IronOcr |
Namensraum |
PaddleOcrAll |
IronTesseract |
Haupt-OCR-Orchestrierungsklasse |
FullOcrModel |
Nicht anwendbar | Kein Äquivalent – Modelle gebündelt |
OnlineFullModels.ChineseV4.DownloadAsync() |
dotnet add package IronOcr.Languages.ChineseSimplified |
Modellakquisition |
LocalDetectionModel.FromDirectory(path) |
Nicht anwendbar | Keine Modellpfadverwaltung |
LocalClassificationModel.FromDirectory(path) |
Nicht anwendbar | Keine Modellpfadverwaltung |
LocalRecognitionModel.FromDirectory(path) |
Nicht anwendbar | Keine Modellpfadverwaltung |
new PaddleOcrAll(models) |
new IronTesseract() |
Engine-Instanziierung |
new PaddleOcrAll(models, PaddleDevice.Gpu(0)) |
Nicht verfügbar (CPU-optimiert) | GPU-Geräteauswahl |
Cv2.ImRead(imagePath) (OpenCvSharp) |
new OcrInput(imagePath) oder input.LoadImage(path) |
Bild wird geladen |
ocr.Run(mat) |
ocr.Read(input) |
OCR ausführen |
result.Text |
result.Text |
Vollständiger Dokumenttext |
result.Regions |
result.Words / result.Lines |
Strukturierte Textbereiche |
region.Text |
word.Text |
Text aus einer Region |
region.Score |
word.Confidence |
Konfidenzwert (0-1 vs 0-100) |
region.Rect.Center.X / .Center.Y |
word.X / word.Y |
Position des Begrenzungsrahmens |
region.Rect.Size.Width / .Height |
word.Width / word.Height |
Abmessungen des Begrenzungsrahmens |
AllowRotateDetection = true |
input.Deskew() |
Rotationshandhabung |
Enable180Classification = true |
Automatisch | Erkennung von Text auf dem Kopf stehend |
| Nicht anwendbar | input.DeNoise() |
Rauschunterdrückung |
| Nicht anwendbar | input.Contrast() |
Kontrastverbesserung |
| Nicht anwendbar | input.EnhanceResolution(300) |
DPI-Skalierung |
| Nicht anwendbar | input.LoadPdf(path) |
Native PDF-Eingabe |
| Nicht anwendbar | result.SaveAsSearchablePdf(path) |
Durchsuchbare PDF-Ausgabe |
| Nicht anwendbar | ocr.AddSecondaryLanguage(lang) |
Mehrsprachig gleichzeitig |
Wenn Teams einen Wechsel von PaddleOCR zu IronOCR erwägen
Wenn die Sprachanforderungen über 14 hinausgehen
Ein Projekt beginnt mit der Verarbeitung chinesischer Rechnungen – PaddleOCR bewältigt das gut. Dann erweitert sich der Kundenstamm und Dokumente treffen in Polnisch, Niederländisch, Griechisch, Vietnamesisch und Türkisch ein. Die 14 von PaddleOCR unterstützten Sprachen decken keine dieser Sprachen ab. Die Migration wird notwendig, weil das Tool nicht mit den Anwendungsfällen mitwachsen kann. Das Hinzufügen von polnischer Unterstützung in IronOCR erfordert lediglich das Hinzufügen eines einzigen NuGet Pakets und eine Konfigurationsänderung in einer einzigen Zeile. Teams, die ein Projekt als "anfangs stark auf Chinesisch ausgerichtet, später aber multiregional" planen, müssen im Vorfeld entscheiden, ob sie mit einem Tool beginnen, das die Sprachabdeckung ohne Neuprogrammierung skalieren kann.
Wenn die Einrichtungskosten das Problembudget überschreiten
Laut der PaddleOCR-Dokumentation beträgt die erstmalige Einrichtung schätzungsweise 30-60 Minuten für die CPU und 2-8 Stunden für die GPU. Bei einem Entwicklerzeitaufwand von 100 US-Dollar pro Stunde bedeutet dies, dass der erste Versuch der GPU-Konfiguration 200 bis 800 US-Dollar kostet, bevor das erste Produktionsimage verarbeitet wird. Die Einrichtung von IronOCR besteht aus einem einzigen Installationsbefehl und einem vierzeiligen Codebeispiel – in weniger als fünf Minuten. Bei internen Tools, Prototypen oder Projekten, bei denen OCR eine sekundäre Funktion und nicht das Kernprodukt ist, entscheidet diese Zeitdifferenz darüber, ob die OCR-Funktion im aktuellen Sprint ausgeliefert wird oder eine niedrigere Priorität erhält. Der Einstieg in IronOCR ist schneller als die Konfiguration einer CUDA-Umgebung.
Wenn PDF-Workflows dominieren
Organisationen, die gescannte Dokumentenarchive digitalisieren, Fax-zu-PDF-Pipelines verarbeiten oder Daten aus Rechnungen und Verträgen im PDF-Format extrahieren, stehen mit PaddleOCR vor einem strukturellen Problem: Jedes PDF erfordert eine zusätzliche Bibliothek, manuelles Seitenrendering, temporäre Dateiverwaltung und eine DPI-Auswahllogik, bevor PaddleOCR es verarbeiten kann. Das ist keine nebensächliche Komplexität – es handelt sich um permanente Instandhaltung. Teams, die nach der ersten PaddleOCR-Integration feststellen, dass ihre Arbeitslast zu mehr als 80 % aus PDFs besteht, migrieren in der Regel dann, wenn die PDF-Konvertierungsschicht zu einer Fehlerquelle wird, und nicht, wenn PaddleOCR selbst versagt.
Wenn Compliance-Prüfungen den Baidu-Ursprung kennzeichnen
Sicherheitsteams in Enterprise der Regierung, des Verteidigungsministeriums, des Gesundheitswesens und des Finanzdienstleistungssektors wenden zunehmend Prüfkriterien auf Komponenten an, die ihren Ursprung in Unternehmen mit Verbindungen zum chinesischen Staat haben. PaddleOCR ist ein Projekt von Baidu; Modell-Downloads verbinden sich standardmäßig mit Baidu Cloud Storage; Das PaddlePaddle-Framework ist ein Produkt von Baidu. Der Code wird lokal ausgeführt und Dokumente werden nicht übertragen, die Modellartefakte stammen jedoch aus der Baidu-Infrastruktur. In FedRAMP-, ITAR- oder CMMC-Umgebungen löst diese Herkunft eine Compliance-Prüfung aus, die die Einführung verhindern kann.IronOCR ist ein Produkt von Iron Software, einem US-amerikanischen Unternehmen, verarbeitet alle Inhalte lokal, stellt keine externen Verbindungen her und benötigt keine Modell-Downloads von Servern Dritter.
Wenn keine GPU-Infrastruktur vorhanden ist
PaddleOCR auf der CPU (300-500 ms/Bild, 3-5 Sekunden Kaltstartzeit, 500 MB-1 GB Speicher) ist langsamer und ressourcenintensiver als IronOCR auf der CPU (150-300 ms/Bild, unter 1 Sekunde Kaltstartzeit, 100-200 MB Speicher). Der GPU-Vorteil von PaddleOCR kommt erst nach der Einrichtung von CUDA/cuDNN zum Tragen, und dieser Vorteil rechtfertigt die operative Komplexität nur bei hohem Datenaufkommen. Teams, die Standard-Cloud-Infrastrukturen ohne GPU-Instanzen nutzen – EC2 ohne GPU, Azure App Service, AWS Lambda – zahlen die Einrichtungskosten von PaddleOCR, ohne den Leistungsvorteil zu erhalten, der diese rechtfertigt.
Gemeinsame Überlegungen zur Migration
Paket- und Namensraumersetzung
Der Pakettausch entfernt fünf Abhängigkeiten und fügt eine hinzu. Entfernen Sie Sdcb.PaddleOCR, Sdcb.PaddleOCR.Models.Online, das Sdcb.PaddleInference.runtime.* Paket, OpenCvSharp4, und OpenCvSharp4.runtime.win aus dem .csproj. Fügen Sie IronOcr hinzu. Fügen Sie Sprachpakete als NuGet Pakete für alle nicht-englischen Sprachen hinzu, die zuvor ein heruntergeladenes Modellset verwendet haben.
Die using Sdcb.PaddleOCR und using OpenCvSharp Direktiven werden durch using IronOcr ersetzt. Das Mat mat = Cv2.ImRead(path) Muster wird durch new OcrInput(path) oder input.LoadImage(path) ersetzt. Der ocr.Run(mat) Aufruf wird zu ocr.Read(input). Für Projekte, die die Bild-Eingabe-API verwenden, akzeptiert das OcrInput Objekt Dateipfade, Bytesequenzen, Streams und System.Drawing.Bitmap — der OpenCvSharp-Vermittler verschwindet vollständig.
Ergebnisstruktur-Neuzuordnung
PaddleOCR gibt result.Regions zurück — ein Array von PaddleOcrResultRegion Objekten, wobei region.Score ein Float von 0 bis 1 ist.IronOCR gibt result.Words zurück — wobei word.Confidence ein Prozentsatz von 0 bis 100 ist. Die Vertrauensfilter r.Score >= 0.8 mappt zu w.Confidence >= 80. Der Zugriff auf die Begrenzungsbox ändert sich von region.Rect.Center.X / region.Rect.Size.Width zu word.X / word.Width. Der Leitfaden für strukturierte Ergebnisse umfasst Seiten, Absätze, Zeilen und Wörter.
Die räumliche Sortierung (Sortierung zuerst nach Y, dann nach X, um die Lesereihenfolge zu approximieren) ist bei IronOCR seltener erforderlich, da die Layout-Engine von Tesseract die Lesereihenfolgeanalyse im Rahmen der Seitensegmentierung durchführt. Bei Dokumenten, für die PaddleOCR eine explizite Sortierlogik benötigte, sollte vor der Portierung des Sortiercodes geprüft werden, ob die Standardausgabereihenfolge von IronOCR die Anforderung bereits erfüllt.
Vorverarbeitungsübergang
Das Deep-Learning-Erkennungsmodell von PaddleOCR toleriert moderate Beeinträchtigungen der Bildqualität – das neuronale Netzwerk verarbeitet Rauschen und Verzerrungen zuverlässiger als die klassische Segmentierungspipeline von Tesseract. Bei der Migration zu IronOCR ist eine explizite Vorverarbeitung für Dokumente erforderlich, die zuvor ohne diese erfolgreich verarbeitet wurden.
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("low-quality-scan.png");
// These filters recover the accuracy that PaddleOCR provided automatically
// on noisy or skewed inputs
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = ocr.Read(input);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("low-quality-scan.png");
// These filters recover the accuracy that PaddleOCR provided automatically
// on noisy or skewed inputs
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("low-quality-scan.png")
' These filters recover the accuracy that PaddleOCR provided automatically
' on noisy or skewed inputs
input.Deskew()
input.DeNoise()
input.Contrast()
input.Binarize()
input.EnhanceResolution(300)
Dim result = ocr.Read(input)
End Using
Bei gescannten Dokumenten, die aus ungewöhnlichen Winkeln aufgenommen wurden oder Hintergrundrauschen aufweisen, gleichen diese vier Filter den größten Teil der Genauigkeitslücke aus. Die Anleitungen zur Bildorientierungskorrektur und zur Bildfarbkorrektur beschreiben die Wirkung jedes Filters auf häufige Scanartefakte. Führen Sie vor dem endgültigen Abschluss der Migration repräsentative Dokumente durch beide Pipelines, um zu überprüfen, ob die Genauigkeit den Anforderungen an den tatsächlichen Dokumentensatz entspricht.
Bereitstellungsbereinigung
Nach der Migration verkleinert sich das Bereitstellungsartefakt erheblich. Löschen Sie den models/ Verzeichnispfad (drei Unterverzeichnisse, ~21MB an Modell-Dateien), paddle_inference.dll (~200MB), paddle2onnx.dll (~5MB) und die opencv_world*.dll Dateien (~50MB insgesamt). Entfernen Sie die apt-get install libopencv-dev Zeile aus der Dockerfile und den Modellkopierschritt. Entfernen Sie jegliche CI/CD-Schritte, die Modelle vorab herunterladen oder Modellverzeichnisse zwischenspeichern. Das Docker-Image reduziert sich von ca. 1,5 GB auf ca. 400 MB.
Zusätzliche Funktionen von IronOCR
Über die oben genannten Vergleichspunkte hinaus bietet IronOCR Funktionen, die die OCR über die Textextraktion hinaus erweitern:
- Barcodelesen während OCR: Setzen Sie
ocr.Configuration.ReadBarCodes = trueund Barcodes im selben Dokument werden zusammen mit dem Text in einem Durchgang dekodiert — keine separate Barcode-Bibliothek erforderlich. - Regionsbasierte OCR: Verwenden Sie
CropRectangle, um spezifische Dokumentzonen (Rechnungsnummernfeld, Kopfzeile, Unterschriftsblock) zu zielen, ohne die gesamte Seite zu verarbeiten. - Asynchrone OCR : Vollständige Unterstützung für async/await zur nicht-blockierenden Integration in ASP.NET -Controller und Hintergrunddienste
- Konfidenzbewertung : Die Konfidenz auf Dokument- und Wortebene ermöglicht die Qualitätssicherung – Ergebnisse mit geringer Konfidenz werden abgelehnt oder zur manuellen Überprüfung markiert.
- hOCR-Export : Erzeugt hOCR-Ausgabe für nachgelagerte Dokumentenmanagementsysteme, die positionelles HTML verarbeiten.
- Handschrifterkennung : Erweitert die Texterkennung von getippten Dokumenten auf handschriftliche Formulare und Notizen.
- Tabellenextraktion : Strukturierte Extraktion tabellarischer Daten aus Rechnungen, Kontoauszügen und Formularen
- Fortschrittsverfolgung : OCR-Fortschrittsmeldung für lange, mehrseitige Stapelverarbeitungen in UI-Kontexten
.NET-Kompatibilität und Zukunftsfähigkeit
IronOCR unterstützt .NET 6, 7, 8 und 9 unter Windows x64, Windows x86, Linux x64 und macOS. Es läuft auf Azure App Service, AWS Lambda, Docker-Containern und abgeschotteten lokalen Umgebungen – alles über dasselbe NuGet Paket. Die Bibliothek erhält von Iron Software regelmäßig Updates, die auf die jeweiligen .NET Releasezyklen abgestimmt sind, einschließlich der geplanten Kompatibilität mit .NET 10 nach dessen Veröffentlichung. Der .NET Wrapper von PaddleOCR ist ein von der Community gepflegtes Projekt; Die Kompatibilität mit neuen .NET Versionen hängt von den Kapazitäten des jeweiligen Maintainers ab. Der Veröffentlichungszeitplan des Wrappers und die dreimonatige Verzögerung bei der Verfügbarkeit neuer PaddleOCR Python-Modellversionen for .NET verdeutlichen die Abhängigkeit von der Verfügbarkeit durch die Community und nicht von kommerziellen Veröffentlichungsverpflichtungen.
Abschluss
Der Genauigkeitsvorteil von PaddleOCR bei CJK-Systemen ist echt und spezifisch. Bei einem Projekt, dessen Hauptarbeitslast in der Verarbeitung vereinfachter chinesischer Dokumente besteht und dessen Team über Expertise im Bereich Deep Learning sowie eine bestehende GPU-Infrastruktur verfügt, sind die Kosten für die Einrichtung mehrerer Pakete und die Komplexität der CUDA-Konfiguration durch Genauigkeitswerte gerechtfertigt, die Tesseract-basierte Engines derzeit bei der Erkennung dichter chinesischer Zeichen nicht erreichen.
Das Problem ist, dass dieses spezielle Szenario nur eine Minderheit der .NET OCR-Anwendungsfälle beschreibt. Bei den meisten kommerziellen Anwendungen werden englische und europäischsprachige Dokumente verarbeitet, wobei die Genauigkeit von IronOCR mit 97-99% die von PaddleOCR mit 92-95% übertrifft. Die meisten Entwicklungsteams verfügen nicht über eine vorkonfigurierte CUDA-Infrastruktur. Die meisten Dokumentenverarbeitungsprozesse erhalten PDFs, die PaddleOCR ohne eine zusätzliche Bibliothek nicht verarbeiten kann. Die meisten Entwickler, die an einem .NET -Projekt arbeiten, erwarten, dass die Installation eines einzigen Pakets den gesamten Installationsvorgang abschließt – und nicht, dass zunächst fünf Pakete heruntergeladen, dann ein asynchrones Modell heruntergeladen und eine OpenCV-Abhängigkeit installiert wird.
Für Teams, die einen hohen GPU-Durchsatz benötigen, hinkt die CPU-Leistung von PaddleOCR (300-500 ms) bereits der CPU-Leistung von IronOCR(150-300 ms) hinterher – das heißt, das Leistungsargument von PaddleOCR ist nur dann gültig, wenn die CUDA-Infrastruktur bereits betriebsbereit ist. Die Kosten für die Dauerlizenz von IronOCR amortisieren sich in der Regel schon innerhalb der ersten Woche, wenn man nur den Zeitaufwand für die GPU-Konfiguration berücksichtigt.
Die Ausgangsfrage ist, ob eine Genauigkeit von über 95 % bei chinesischen Schriftzeichen den gesamten dafür notwendigen Technologie-Stack rechtfertigt. Für primär chinesische Workloads in Umgebungen mit GPU-Infrastruktur und Compliance-Zulassung für Software mit Baidu-Ursprung lautet die Antwort ja. Für alle anderen Fälle ist IronOCR in weniger als fünf Minuten einsatzbereit und deckt die Sprach-, Vorverarbeitungs- und PDF-Anforderungen ab, die bei den meisten .NET OCR-Projekten tatsächlich auftreten.
Häufig gestellte Fragen
Was ist PaddleOCR?
PaddleOCR 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.
Was ist der Unterschied zwischen IronOCR und PaddleOCR for .NET-Entwicklern?
IronOCR ist eine NuGet-native OCR-Bibliothek für .NET, die IronTesseract als Kern-Engine verwendet. Im Vergleich zu PaddleOCR 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 PaddleOCR?
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 gibt es zwischen PaddleOCR 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 ist die Lizenzierung von PaddleOCR im Vergleich zu IronOCR?
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 PaddleOCR 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 PaddleOCR 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 PaddleOCR zu IronOCR zu migrieren?
Die Migration von PaddleOCR zu IronOCR umfasst in der Regel das Ersetzen von Initialisierungssequenzen durch IronTesseract-Instanziierung, das Entfernen des COM-Lebenszyklusmanagements und das Aktualisieren von API-Aufrufen. Die meisten Migrationen reduzieren die Code-Komplexität erheblich.

