Docling-OCR-Engines
Es gibt keine einzelne „beste“ OCR-Engine — die richtige hängt von Plattform, Sprachen und Setup-Bereitschaft ab. Diese Seite vergleicht jede Engine, zeigt Installation + CLI + Python je Engine, erklärt das portable iso:-Sprachsystem, deckt GPU-Backends ab und liefert Rezepte zum Kopieren. Engine-Fakten sind gegen die offiziellen OCR-Konzepte und die native Engine-Referenz geprüft.
1. Welche Engine wählen?
Digitale (Text-)PDFs brauchen oft gar kein OCR — erst --no-ocr für Maximaltempo probieren und nur für gescannte Seiten eine Engine ergänzen.
| Situation | Wahl | Warum |
|---|---|---|
| Standard / unsicher | RapidOCR | Nur-pip-Installation, CPU-freundlich, mehrsprachig, GPU-fähig. Die sicherste erste Wahl. |
| 100+ Sprachen oder eigene traineddata | Tesseract (CLI oder tesserocr) | Bewährte Engine, Schriftmodelle (script/Latin), Vertikal-Japanisch (jpn_vert), eigene trainierte Dateien. |
| Auf einem Mac, ohne Setup | OcrMac | Nutzt Apple Vision auf dem Gerät; keine Binärdateien, keine Modell-Downloads. |
| Einfaches CJK + Latein, leichte Installation | EasyOCR | Nur pip mit selbst geladenen Gen2-Modellen; nimmt mehrere Sprachen zugleich. |
| NVIDIA-Serverfarm, max. Durchsatz | Nemotron OCR | GPU-beschleunigt; Englisch- + mehrsprachige Modelle (Linux x86_64, CUDA 13.x). |
| OCR läuft auf einem anderen Service | KServe v2 | Docling ruft den eigenen Remote-Endpunkt; Sprachcodes sind die der Bereitstellung. |
| Nischenmodell nötig | Plugin (OnnxTR, SuryaOCR) | Installation via Plugin-System mit --allow-external-plugins. |
2. Wie OCR in die Pipeline passt (Modi & Flags)
OCR ist standardmäßig an (--ocr). Drei Flags steuern, wo es läuft und welche Engine es ausführt. Python-Entsprechung: PdfPipelineOptions().do_ocr = True plus eine der RapidOcrOptions / EasyOcrOptions / TesseractOcrOptions / TesseractCliOcrOptions / OcrMacOptions / NemotronOcrOptions mit mode=OcrMode.FULL_PAGE für Vollseiten-Verhalten. Mit --debug-visualize-ocr debuggen, was OCR sieht.
| Flag | Werte / Standard | Bedeutung |
|---|---|---|
| --ocr / --no-ocr | Standard an | Hauptschalter. --no-ocr überspringt OCR komplett — schnellste für digitale PDFs. |
| --ocr-mode | default, full_page, layout_regions, pdf_aware_layout_regions | Welche Regionen an die Engine gehen. full_page OCRt jede Seite Ende-zu-Ende (langsamer, beste für Scans). --force-ocr ist veraltet — --ocr-mode full_page nutzen. |
| --ocr-engine | auto (Standard), rapidocr, easyocr, tesseract, tesserocr, ocrmac, nemotron-ocr, kserve_v2_ocr | Welche Engine. auto wählt aus dem Installierten je Plattform. |
| --ocr-lang | Kommaliste, z. B. ch, deu, iso:de | Sprachen, nativ oder portabel (siehe Abschnitt 11). Leer (--ocr-lang "") lässt die Engine entscheiden. |
| --psm | 0–13 | Page Segmentation Mode für die OCR-Engine. |
3. Engine-Vergleichstabelle
| Engine | Am besten für | Plattform | Hinweise | Docs |
|---|---|---|---|---|
| auto (default) | Docling eine verfügbare Engine wählen lassen. | All | Standardwert von --ocr-engine. Docling wählt anhand von Installation und Plattform. Python: ocr_options einfach weglassen. | Dokumentation |
| RapidOCR | Leichtgewichtiges, CPU-freundliches mehrsprachiges OCR; gute Standardwahl. | Cross-platform | ONNX-Runtime-Backend als Standard (auch openvino/paddle/torch). pip install "docling[rapidocr]". Eine Sprache pro Durchlauf; PP-OCR-v4/v5/v6-Tokens inkl. Schriftfamilien latin/cyrillic/arabic/devanagari. Python: RapidOcrOptions. | Dokumentation |
| Tesseract (CLI) | Bewährtes OCR mit über 100 Sprachen; eigene traineddata. | Cross-platform (system binary) | Braucht Tesseract-Systembinärdatei plus Sprachdaten (TESSDATA_PREFIX mit / am Ende). Für CLI-Nutzung kein pip-Extra nötig. Python: TesseractCliOcrOptions. Leere lang löst OSD-Skripterkennung aus (braucht osd-Datei). | Dokumentation |
| Tesseract (tesserocr) | Gleiche Tesseract-Genauigkeit, schneller via Python-Bindings. | Cross-platform (compiled) | Nach der Systembinärdatei pip install "docling[tesserocr]". Unter Windows ggf. C++ Build Tools nötig. Python: TesseractOcrOptions. | Dokumentation |
| EasyOCR | Einfaches mehrsprachiges Setup; CJK- und lateinische Schriften. | Cross-platform | pip install "docling[easyocr]". Lädt eigene Gen2-Modelle. Nimmt mehrere Sprachen gleichzeitig — Liste kurz halten (en allein schlägt en+de). Python: EasyOcrOptions. | Dokumentation |
| OcrMac | Müheloses natives OCR auf Macs (Apple Vision). | macOS only | pip install "docling[ocrmac]". Keine Modelle im Paket — Sprachumfang hängt von der macOS-Version ab. Python: OcrMacOptions. | Dokumentation |
| Nemotron OCR | GPU-beschleunigtes OCR im großen Maßstab auf NVIDIA-Servern. | Linux x86_64 + CUDA 13.x | pip install "docling[feat-ocr-nemotron]" mit cu130-Index (Python 3.12; v2.0.2 ergänzt 3.11/3.13). english oder multilingual (+ ca. 170 lateinische Best-Effort-Codes). Python: NemotronOcrOptions. | Dokumentation |
| KServe v2 OCR | Einen OCR-Microservice aufrufen. | Service | Verbindet sich mit einem KServe-v2-Endpunkt. lang wird wörtlich gesendet (nur erster Eintrag) — Codes der eigenen Bereitstellung verwenden. Keine Prüfung, kein Mapping. | Dokumentation |
Keine Engines passen zur Suche.
4. Jede Engine installieren
Tesseract-Systembinärdatei je BS: Vollständige Schritte je BS in der Installationsübersicht und den OS-Anleitungen. OCR-Modelle für Offline- oder CI-Rechner vorab laden: docling-tools models download --all oder gezielt --easyocr-lang de / --rapidocr-backend-lang onnxruntime:el. Siehe die CLI-Referenz.
brew install tesseract leptonica pkg-configsudo apt-get install -y tesseract-ocr tesseract-ocr-eng libtesseract-dev libleptonica-dev pkg-configsudo dnf install -y tesseract tesseract-devel tesseract-langpack-eng tesseract-osd leptonica-devel| Engine | Installation | Systemabhängigkeit? |
|---|---|---|
| RapidOCR | pip install "docling[rapidocr]" (oder pip install rapidocr onnxruntime) | Nein — nur pip. |
| EasyOCR | pip install "docling[easyocr]" (oder pip install easyocr) | Nein — lädt eigene Modelle beim ersten Einsatz. |
| Tesseract CLI | Nur Systembinärdatei (unten); kein pip-Extra nötig | Ja — Binärdatei + TESSDATA_PREFIX (mit / am Ende). |
| Tesseract (tesserocr) | Erst Systembinärdatei, dann pip install "docling[tesserocr]" | Ja — plus Compiler unter Windows fürs Binding. |
| OcrMac | pip install "docling[ocrmac]" | Nur macOS; keine Modelle — Vision ist Teil des OS. |
| Nemotron | pip install "docling[feat-ocr-nemotron]" --extra-index-url https://download.pytorch.org/whl/cu130 --index-strategy unsafe-best-match | Linux x86_64 + Python 3.12 + CUDA 13.x. |
| OnnxTR (Plugin) | pip install "docling-ocr-onnxtr[cpu]" + --allow-external-plugins | Nein — Plugin-System. |
Windows: UB-Mannheim-Build installieren, zu PATH hinzufügen und TESSDATA_PREFIX auf dessen tessdata\-Ordner setzen. Scheitert tesserocr beim Bauen: pip uninstall tesserocr, dann pip install --no-binary :all: tesserocr.
5. RapidOCR im Detail (Backends, PP-OCR-Versionen, Sprachen)
RapidOCR kapselt PP-OCR-Modelle. Zwei Dinge variieren unabhängig: das Backend (Runtime) und die PP-OCR-Version (Modellgeneration).
Sprach-Tokens (native Codes): v4: arabic, ch, chinese_cht, cyrillic, devanagari, en, japan, ka, korean, latin, ta, te. v5: arabic, ch, cyrillic, devanagari, el, en, eslav, korean, latin, ta, te, th. v6: ch, chinese_cht, en, japan + ca. 45 europäische Codes (de, fr, es, it, pt, nl, pl …) mit Aliasen zh→ch, zh_cn→ch, zh_tw→chinese_cht, ja/jp→japan, ko→korean (Achtung: Koreanisch existiert in v6 nur als Alias). de/german und fr/french existieren jeweils doppelt.
Schriftfamilien (ein Token deckt viele Sprachen ab): cyrillic (34: Russisch, Ukrainisch, Kasachisch … + Englisch), devanagari (14: Hindi, Marathi, Sanskrit … + Englisch), arabic (9: Arabisch, Persisch, Urdu … + Englisch), eslav (Ostslawisch: Russisch, Belarussisch, Ukrainisch + Englisch).
Eine Sprache pro Durchlauf: RapidOCR nutzt den ersten lang-Eintrag und warnt vor dem Rest. Python: RapidOcrOptions(lang=["eslav"], backend="onnxruntime"); eigene Checkpoints werden unterstützt (siehe Custom-Models-Beispiel).
docling convert scan.pdf --ocr-engine rapidocr --ocr-mode full_page| Backend | PP-OCR-Versionen | Hinweise |
|---|---|---|
onnxruntime (Standard) | v4, v5, v6 | Vollste Abdeckung — einziges Backend mit PP-OCRv5-eslav/cyrillic. |
openvino | v4, v5, v6 | Intel-Hardware-Pfad. |
paddle | v4, v5, v6 | PaddlePaddle-Runtime. |
torch | v4, v5 (nur Chinesisch), v6 | PP-OCRv5 auf torch kann nur Chinesisch. |
6. EasyOCR im Detail (Sprachliste kurz halten)
EasyOCR (Gen2-Checkpoints, craft_mlt_25k.pth-Detektor) nimmt mehrere Sprachen zugleich — doch die Auflösung wählt den einen Checkpoint, der alle gewünschten Sprachen deckt. Eine unnötige Sprache stuft das Modell still herab: ["en"] wählt das genaue english_g2.pth, während ["en","de"] auf das breitere latin_g2.pth zurückfällt.
docling convert scan.pdf --ocr-engine easyocr --ocr-lang en| Checkpoint | Deckt ab |
|---|---|
english_g2.pth | en |
latin_g2.pth | Europäisch/Latein-Familie (de, fr, es, it, pt, nl, pl …) |
zh_sim_g2.pth | ch_sim + en |
japanese_g2.pth / korean_g2.pth | ja / ko + en |
telugu.pth / kannada.pth | te / kn + en |
cyrillic_g2.pth | ru, be, bg, uk, mn … + en |
7. Tesseract im Detail (CLI vs. tesserocr, traineddata)
docling convert scan.pdf --ocr-engine tesseract --ocr-lang deu+engTESSDATA_PREFIX=/opt/homebrew/share/tessdata/ docling convert scan.pdf --ocr-engine tesserocr- Zwei Geschmacksrichtungen, eine Engine:
tesseractruft die System-CLI auf (kein pip-Extra);tesserocrbindet die Bibliothek in-process ein (schneller, braucht das kompilierte Binding). Gleiche Genauigkeit, gleiche traineddata. - Sprache = traineddata-Stamm:
deu, chi_sim, chi_tra, srp_latn, aze_cyrl, deu_latf, frk, jpn_vert, script/Latin, script/Cyrillic— plus jede selbst trainierte Datei. Was an.traineddata-Dateien installiert ist, ist nutzbar. - Prüfung zur Bauzeit: Fehlende Dateien scheitern sofort mit dem installierten Satz in der Fehlermeldung — nicht mitten in der Umwandlung.
- Leere
lang= Skripterkennung:--ocr-lang ""startet Orientierungs-/Skripterkennung je Seite, die dieosd-traineddata braucht. - Automatische Spracherkennung zeigt das offizielle Beispiel.
8. OcrMac im Detail (nur macOS)
OcrMac ist ein dünner Wrapper um Apples Vision-Framework: keine Binärdateien, keine ladbaren Modelle — die Erkenner sind Teil des OS, daher ist der Sprachumfang eine Eigenschaft der eigenen macOS-Version, nicht des ocrmac-Releases.
docling convert scan.pdf --ocr-engine ocrmac --ocr-mode full_page- Installieren:
pip install "docling[ocrmac]"; Python:OcrMacOptions. - Abgleich per BCP-47 mit Regionen:
iso:defindetde-DE,iso:ptfindetpt-BR,iso:zh-CNfindetzh-Hans. - Kuriose Regionscodes wie
vi-VTmüssen nativ (ohne Präfix) übergeben werden. Leerelanglässt Vision automatisch wählen.
9. Nemotron OCR im Detail (Linux + CUDA)
Braucht Linux x86_64 mit CUDA 13.x und den cu130-torch-Index (Installationszeile in Abschnitt 4). Eine Sprache pro Durchlauf (erster Eintrag gewinnt). Python: NemotronOcrOptions.
| Nemotron-Version | Python | Sprachen |
|---|---|---|
| v2.0.0 | nur 3.12 | english (Alias en), multilingual (Alias multi: en, zh sim+trad, ja, ko, ru) + ca. 170 lateinische Best-Effort-Codes (warnt, von NVIDIA ungetestet) |
| v2.0.2 | 3.11, 3.12, 3.13 | wie oben |
10. KServe v2 + Plugin-Engines (OnnxTR, SuryaOCR)
- KServe v2: Für Teams, deren OCR als Remote-Microservice läuft.
langwird weder geprüft noch gemappt — der erste Eintrag geht wörtlich raus, der Rest wird mit Warnung verworfen. Die Codes der eigenen Bereitstellung nutzen;iso:geht nur, falls der Server es spricht (keiner tut es). - OnnxTR-Plugin:
pip install "docling-ocr-onnxtr[cpu]",--allow-external-pluginsaktivieren, mit dem Engine-Namen des Plugins wählen. Siehe das docling-OCR-OnnxTR-Repo. - SuryaOCR mit eigenen Modellen zeigt das offizielle Beispiel; Drittanbieter-Optionen mit
--show-external-pluginslisten.
11. Sprachen: native Codes vs. portable iso:-Tags
Jede Engine nimmt Sprachen über ein Feld, OcrOptions.lang. Jeder Eintrag hat genau zwei Formen:
Nativer Code (ohne Präfix) — die engine-eigene Schreibweise, wörtlich durchgereicht: ch (PP-OCR-Chinesisch), deu (Tesseract-Deutsch), ch_sim (EasyOCR), en-US (Vision).
Portabler Tag — BCP-47 hinter iso:, auf die Engine gemappt: iso:de, iso:en-US, iso:zh-Hant. Das Skript immer angeben, wenn es nicht Standard ist: Serbisch-Latein muss iso:sr-Latn sein (Standard-Serbisch ist Kyrillisch).
Jede Engine meldet, was sie kann: supported_ocr_languages() liefert native + BCP-47-Codes in einer Schreibweise, die sich direkt in lang einfügen lässt. Docling ersetzt nie still — eine nicht bedienbare Sprache wirft einen Fehler und nennt, was die Engine kann. RapidOCR und Nemotron laufen eine Sprache zur Zeit (erster Tag gewinnt, Rest warnt).
| Tag | Bedeutet | Stattdessen sagen |
|---|---|---|
mul | mehrere Sprachen | Der engine-eigene Code fürs mehrsprachige Modell (z. B. Nemotron-multilingual) |
und | unbestimmt | Leere Liste oder eine Sprache in der gewünschten Schrift |
zxx | kein Sprachinhalt | OCR abschalten: --no-ocr / do_ocr=False |
from docling.datamodel.pipeline_options import TesseractCliOcrOptions
TesseractCliOcrOptions(lang=["deu", "eng"]) # nativ: tesseract -l deu+eng
TesseractCliOcrOptions(lang=["iso:de", "iso:en"]) # portabel: dasselbe
Was eine leere Sprachliste je Engine bedeutet — und Codes, die einen Sprach-Tag überschatten (nackt = das Modell; iso: = die Sprache):
| Engine | lang=[] (--ocr-lang "") |
|---|---|
| Tesseract (beide) | Orientierungs- + Skripterkennung je Seite (braucht osd-Datei) |
| EasyOCR | Englisch (en) |
| RapidOCR | Standard Vereinfachtes Chinesisch (ch) |
| Nemotron | Englisch-Modell |
| OcrMac | Visions Automatik |
| KServe | Sendet en |
| Code | Nackt erreicht | iso: bedeutet |
|---|---|---|
ch | PP-OCR Chinesisch (vereinfacht) | ch-Latn = Chamorro |
ka | PP-OCR Kannada | ka-Geor = Georgisch (kann PP-OCR nicht — Fehler) |
ang | EasyOCR Angika | Altenglisch |
frk | Tesseract Deutsch-Fraktur | Fränkisch |
tab | EasyOCR Tabasaranisch (kyrillisch) | Tabasaranisch (lateinisch) |
mah | EasyOCR Magahi | Marshallesisch |
12. GPU-Beschleunigung für OCR
- RapidOCR auf CUDA: GPU-ONNX-Runtime installieren —
pip install "docling[onnxruntime]"— prüfen, dassCUDAExecutionProviderinort.get_available_providers()steht, dannonnxruntime-Backend mit CUDA-Gerät nutzen. Dastorch-Backend ist die Alternative (Achtung: PP-OCRv5 + torch = nur Chinesisch). - Nemotron ist konstruktionsbedingt GPU-only (CUDA 13.x, Linux x86_64).
- EasyOCR / Tesseract / OcrMac sind praktisch CPU-gebunden — auf eine schnelle CPU setzen und GPU-Budget lieber in Layout-/Tabellenstufen stecken. Feintuning (Batch-Größen, VLM-Server) steht in der offiziellen GPU-Anleitung.
import onnxruntime as ort
assert "CUDAExecutionProvider" in ort.get_available_providers()
from docling.datamodel.accelerator_options import AcceleratorDevice, AcceleratorOptions
from docling.datamodel.pipeline_options import PdfPipelineOptions, RapidOcrOptions
pipeline_options = PdfPipelineOptions(
accelerator_options=AcceleratorOptions(device=AcceleratorDevice.CUDA),
ocr_options=RapidOcrOptions(backend="onnxruntime", lang=["eslav"]),
)
13. Rezepte zum Kopieren (CLI + Python)
Gescanntes PDF, Vollseiten-OCR. Engine explizit wählen. OCR für digitale PDFs überspringen (schnellste). OCR auf Deutsch + Englisch, portable Tags:
Mehr ausgearbeitete Beispiele: Vollseiten-OCR erzwingen, Tesseract-Spracherkennung, RapidOCR-eigene-Modelle, lokale Beispielbibliothek und der Konfigurator.
docling convert scan.pdf --ocr-mode full_pagedocling convert scan.pdf --ocr-engine rapidocrdocling convert report.pdf --no-ocr --to mddocling convert scan.pdf --ocr-engine rapidocr --ocr-lang iso:de,iso:enfrom docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import (
OcrMode, PdfPipelineOptions, RapidOcrOptions,
)
from docling.document_converter import DocumentConverter, PdfFormatOption
pipeline_options = PdfPipelineOptions()
pipeline_options.do_ocr = True
pipeline_options.ocr_options = RapidOcrOptions(mode=OcrMode.FULL_PAGE)
# Je nach Bedarf EasyOcrOptions / TesseractOcrOptions / TesseractCliOcrOptions
# / OcrMacOptions (macOS) / NemotronOcrOptions (Linux CUDA) einsetzen.
converter = DocumentConverter(
format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)}
)
doc = converter.convert("scan.pdf").document
print(doc.export_to_markdown())
14. OCR-Fehlerbehebung
- Gescannter Text wird nicht erkannt — OCR ist aus oder der Standardmodus hat die fehlende Textebene übersehen:
--ocr-mode full_pageerzwingen, andere Engine probieren. Siehe OCR: gescanntes PDF. - OCR-Extra installiert nicht — RapidOCR/EasyOCR sind nur pip; Tesseract braucht zuerst Systembinärdatei +
TESSDATA_PREFIX. Siehe OCR-Paket-Installationsfehler. - Umwandlung ist langsam — OCR- + Anreicherungsmodelle sind die teuersten CPU-Stufen:
--no-ocrfür digitale PDFs,--table-mode fastoder eine GPU. Siehe Umwandlung ist langsam. - GPU ignoriert —
torch.cuda.is_available()/CUDAExecutionProviderbestätigen,--device cudanutzen (mpsauf Apple Silicon). Siehe GPU wird nicht genutzt. - Falsche Sprachausgabe — Shadowing prüfen (
kavs.iso:ka-Geor), EasyOCR-Listen kurz halten, mitsupported_ocr_languages()verifizieren.
15. OCR-FAQ
Welche Engine für Einsteiger?
pip install "docling[rapidocr]" und --ocr-engine rapidocr.Brauche ich überhaupt OCR?
--no-ocr ist schneller und oft genauer. Leere Ausgabe bei einem Scan ist das Zeichen für --ocr-mode full_page.Nativer Code oder iso:-Tag?
ch, deu) ist kürzest, wenn die Engine bekannt ist. Portabel (iso:de, iso:zh-Hant) überlebt Engine-Wechsel und ist für Schriften wie iso:sr-Latn Pflicht. Schatten-Codes wie nacktes ka (Kannada-Modell) vs. iso:ka-Geor (Georgisch) nie verwechseln.Warum wird EasyOCR schlechter, wenn ich eine Sprache hinzufüge?
["en","de"] fällt vom englisch-spezifischen Modell aufs allgemeine Latein-Modell zurück. Nur anfordern, was das Dokument enthält.Kann RapidOCR mehrere Sprachen zugleich?
latin, cyrillic, arabic, devanagari, eslav) decken eine Familie ab, oder Durchläufe je Sprache.Tesseract findet meine Sprache nicht?
tesseract-ocr-<lang>), per tesseract --list-langs bestätigen und TESSDATA_PREFIX mit Schrägstrich am Ende exportieren. Die Konstruktor-Fehlermeldung listet exakt das Installierte.Welche Engines nutzen die GPU?
Wie nutze ich ein eigenes OCR-Modell?
--allow-external-plugins.Verifiziert mit Docling v2.129.0 · Zuletzt geprüft 2026-09-22 · Offizielle Quelle