Moteurs OCR de Docling
Il n'existe pas de moteur OCR unique « meilleur » — le bon dépend de votre plateforme, de vos langues et de votre appétit de configuration. Cette page compare chaque moteur, montre installation + CLI + Python par moteur, explique le système portable iso:, couvre les backends GPU et donne des recettes prêtes. Faits vérifiés contre les concepts OCR officiels et la référence native.
1. Quel moteur choisir ?
Les PDF numériques (texte) n'ont souvent pas besoin d'OCR — essayez d'abord --no-ocr pour une vitesse maximale, et n'ajoutez un moteur que pour les pages scannées.
| Situation | Choix | Pourquoi |
|---|---|---|
| Défaut / hésitation | RapidOCR | Installation pip-only, économe en CPU, multilingue, capable en GPU. Le premier choix le plus sûr. |
| 100+ langues ou traineddata propres | Tesseract (CLI ou tesserocr) | Moteur éprouvé, modèles d'écriture (script/Latin), japonais vertical (jpn_vert), fichiers entraînés maison. |
| Sur un Mac, zéro configuration | OcrMac | Utilise Apple Vision sur l'appareil ; ni binaires ni téléchargements de modèles. |
| CJK + latin simple, install facile | EasyOCR | Pip seul avec modèles gen2 auto-téléchargés ; plusieurs langues à la fois. |
| Ferme NVIDIA, débit max | Nemotron OCR | Accéléré par GPU ; modèles anglais + multilingue (Linux x86_64, CUDA 13.x). |
| L'OCR vit sur un autre service | KServe v2 | Docling appelle votre endpoint distant ; les codes sont ceux de votre déploiement. |
| Besoin d'un modèle de niche | Plugin (OnnxTR, SuryaOCR) | Installation via le système de plugins avec --allow-external-plugins. |
2. Comment l'OCR s'insère dans le pipeline (modes & flags)
L'OCR est activé par défaut (--ocr). Trois flags contrôlent où il tourne et quel moteur l'exécute. Équivalent Python : PdfPipelineOptions().do_ocr = True plus l'un de RapidOcrOptions / EasyOcrOptions / TesseractOcrOptions / TesseractCliOcrOptions / OcrMacOptions / NemotronOcrOptions avec mode=OcrMode.FULL_PAGE pour la pleine page. Déboguez ce que voit l'OCR avec --debug-visualize-ocr.
| Flag | Valeurs / défaut | Signification |
|---|---|---|
| --ocr / --no-ocr | défaut activé | Interrupteur maître. --no-ocr saute l'OCR entièrement — le plus rapide sur PDF numériques. |
| --ocr-mode | default, full_page, layout_regions, pdf_aware_layout_regions | Quelles régions vont au moteur. full_page OCRise chaque page de bout en bout (plus lent, meilleur sur scans). --force-ocr est déprécié — utilisez --ocr-mode full_page. |
| --ocr-engine | auto (défaut), rapidocr, easyocr, tesseract, tesserocr, ocrmac, nemotron-ocr, kserve_v2_ocr | Quel moteur. auto choisit parmi l'installé sur votre plateforme. |
| --ocr-lang | liste séparée par virgules, p. ex. ch, deu, iso:de | Langues, natives ou portables (voir section 11). Vide (--ocr-lang "") laisse le moteur décider. |
| --psm | 0–13 | Page Segmentation Mode du moteur OCR. |
3. Tableau comparatif des moteurs
| Moteur | Idéal pour | Plateforme | Remarques | Docs |
|---|---|---|---|---|
| auto (default) | Laisser Docling choisir un moteur disponible. | All | Valeur par défaut de --ocr-engine. Docling choisit selon l'installation et la plateforme. Python : ne pas définir ocr_options. | Documentation |
| RapidOCR | OCR multilingue léger, économe en CPU ; bon choix par défaut. | Cross-platform | Backend ONNX Runtime par défaut (aussi openvino/paddle/torch). pip install "docling[rapidocr]". Une langue par passe ; tokens PP-OCR v4/v5/v6 incl. familles latin/cyrillic/arabic/devanagari. Python : RapidOcrOptions. | Documentation |
| Tesseract (CLI) | OCR éprouvé avec 100+ langues ; traineddata personnalisés. | Cross-platform (system binary) | Exige le binaire système Tesseract plus les données de langue (TESSDATA_PREFIX avec / final). Pour un usage CLI, aucun extra pip requis. Python : TesseractCliOcrOptions. lang vide déclenche la détection OSD (fichier osd requis). | Documentation |
| Tesseract (tesserocr) | Même précision Tesseract, plus rapide via bindings Python. | Cross-platform (compiled) | Après le binaire système, pip install "docling[tesserocr]". Sous Windows, outils de compilation C++ parfois requis. Python : TesseractOcrOptions. | Documentation |
| EasyOCR | Configuration multilingue simple ; écritures CJK et latines. | Cross-platform | pip install "docling[easyocr]". Télécharge ses propres modèles gen2. Accepte plusieurs langues à la fois — garder la liste courte (en seul bat en+de). Python : EasyOcrOptions. | Documentation |
| OcrMac | OCR natif sans configuration sur Mac (Apple Vision). | macOS only | pip install "docling[ocrmac]". Aucun modèle embarqué : la couverture dépend de la version de macOS. Python : OcrMacOptions. | Documentation |
| Nemotron OCR | OCR accéléré par GPU à grande échelle sur serveurs NVIDIA. | Linux x86_64 + CUDA 13.x | pip install "docling[feat-ocr-nemotron]" avec l'index cu130 (Python 3.12 ; v2.0.2 ajoute 3.11/3.13). english ou multilingual (+ ~170 codes latins best-effort). Python : NemotronOcrOptions. | Documentation |
| KServe v2 OCR | Appeler un microservice OCR distant. | Service | Se connecte à un endpoint KServe v2. lang est envoyé tel quel (première entrée seulement) : utilisez les codes de votre déploiement. Ni validation ni mapping. | Documentation |
Aucun moteur ne correspond à la recherche.
4. Installer chaque moteur
Binaire Tesseract selon l'OS. Étapes complètes par OS dans l'aperçu d'installation et les guides OS. Pré-téléchargez les modèles OCR pour machines hors ligne ou CI : docling-tools models download --all, ou ciblés --easyocr-lang de / --rapidocr-backend-lang onnxruntime:el. Voir la référence CLI.
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| Moteur | Installation | Dépendance système ? |
|---|---|---|
| RapidOCR | pip install "docling[rapidocr]" (ou pip install rapidocr onnxruntime) | Non — pip seul. |
| EasyOCR | pip install "docling[easyocr]" (ou pip install easyocr) | Non — télécharge ses modèles au premier usage. |
| Tesseract CLI | Binaire système seul (ci-dessous) ; aucun extra pip requis | Oui — binaire + TESSDATA_PREFIX (avec / final). |
| Tesseract (tesserocr) | D'abord le binaire, puis pip install "docling[tesserocr]" | Oui — plus compilateur sous Windows pour le binding. |
| OcrMac | pip install "docling[ocrmac]" | macOS uniquement ; aucun modèle — Vision fait partie de l'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 | Non — système de plugins. |
Windows : installez le build UB Mannheim, ajoutez-le au PATH et pointez TESSDATA_PREFIX vers son dossier tessdata\. Si tesserocr ne compile pas : pip uninstall tesserocr puis pip install --no-binary :all: tesserocr.
5. RapidOCR en profondeur (backends, versions PP-OCR, langues)
RapidOCR enveloppe des modèles PP-OCR. Deux choses varient indépendamment : le backend (runtime) et la version PP-OCR (génération du modèle).
Tokens de langue (codes natifs) : 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 + ~45 codes européens (de, fr, es, it, pt, nl, pl …) avec alias zh→ch, zh_cn→ch, zh_tw→chinese_cht, ja/jp→japan, ko→korean (attention : le coréen n'existe en v6 qu'en alias). de/german et fr/french existent en double.
Familles d'écriture (un token couvre beaucoup de langues) : cyrillic (34 : russe, ukrainien, kazakh … + anglais), devanagari (14 : hindi, marathi, sanskrit … + anglais), arabic (9 : arabe, persan, ourdou … + anglais), eslav (slave oriental : russe, biélorusse, ukrainien + anglais).
Une langue par passe : RapidOCR utilise la première entrée de lang et avertit pour le reste. Python : RapidOcrOptions(lang=["eslav"], backend="onnxruntime") ; checkpoints propres supportés (voir l'exemple de modèles propres).
docling convert scan.pdf --ocr-engine rapidocr --ocr-mode full_page| Backend | Versions PP-OCR | Remarques |
|---|---|---|
onnxruntime (défaut) | v4, v5, v6 | Couverture la plus complète — seul backend avec PP-OCRv5 eslav/cyrillic. |
openvino | v4, v5, v6 | Chemin matériel Intel. |
paddle | v4, v5, v6 | Runtime PaddlePaddle. |
torch | v4, v5 (chinois seul), v6 | PP-OCRv5 sur torch ne sert que le chinois. |
6. EasyOCR en profondeur (liste de langues courte)
EasyOCR (checkpoints gen2, détecteur craft_mlt_25k.pth) accepte plusieurs langues à la fois — mais la résolution choisit l'unique checkpoint couvrant toutes les langues demandées. Une langue inutile dégrade le modèle en silence : ["en"] sélectionne le précis english_g2.pth, tandis que ["en","de"] retombe sur le générique latin_g2.pth.
docling convert scan.pdf --ocr-engine easyocr --ocr-lang en| Checkpoint | Couvre |
|---|---|
english_g2.pth | en |
latin_g2.pth | Famille européenne/latine (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 en profondeur (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- Deux saveurs, un moteur :
tesseractappelle la CLI système (aucun extra pip) ;tesserocrlie la bibliothèque en processus (plus rapide, exige le binding compilé). Même précision, même traineddata. - Langue = stem traineddata :
deu, chi_sim, chi_tra, srp_latn, aze_cyrl, deu_latf, frk, jpn_vert, script/Latin, script/Cyrillic— plus tout fichier entraîné maison. Ce qui est installé en.traineddataest utilisable. - Vérification à la construction : les fichiers manquants échouent aussitôt avec le jeu installé dans le message — pas en pleine conversion.
langvide = détection d'écriture :--ocr-lang ""lance la détection orientation/écriture par page, qui exige la traineddataosd.- Détection auto de langue dans l'exemple officiel.
8. OcrMac en profondeur (macOS uniquement)
OcrMac est une fine enveloppe autour d'Apple Vision : ni binaires ni modèles téléchargeables — les reconnaisseurs font partie de l'OS, donc la couverture est une propriété de votre version de macOS, pas du release ocrmac.
docling convert scan.pdf --ocr-engine ocrmac --ocr-mode full_page- Installation :
pip install "docling[ocrmac]"; Python :OcrMacOptions. - Correspondance en BCP-47 avec régions :
iso:detrouvede-DE,iso:pttrouvept-BR,iso:zh-CNtrouvezh-Hans. - Les codes de région bizarres comme
vi-VTdoivent passer natifs (sans préfixe).langvide laisse Vision choisir.
9. Nemotron OCR en profondeur (Linux + CUDA)
Exige Linux x86_64 avec CUDA 13.x et l'index torch cu130 (ligne d'installation en section 4). Une langue par passe (la première entrée gagne). Python : NemotronOcrOptions.
| Version Nemotron | Python | Langues |
|---|---|---|
| v2.0.0 | 3.12 uniquement | english (alias en), multilingual (alias multi : en, zh sim+trad, ja, ko, ru) + ~170 codes latins best-effort (avertit, non testés par NVIDIA) |
| v2.0.2 | 3.11, 3.12, 3.13 | comme ci-dessus |
10. KServe v2 + moteurs plugins (OnnxTR, SuryaOCR)
- KServe v2 : pour les équipes dont l'OCR tourne en microservice distant.
langn'est ni validé ni mappé — la première entrée part telle quelle, le reste est écarté avec avertissement. Utilisez les codes de votre déploiement ;iso:ne vaut que si le serveur le parle (aucun ne le fait). - Plugin OnnxTR :
pip install "docling-ocr-onnxtr[cpu]", activez--allow-external-pluginset choisissez par le nom du plugin. Voir le dépôt docling-OCR-OnnxTR. - SuryaOCR avec modèles propres dans l'exemple officiel ; listez les options tierces avec
--show-external-plugins.
11. Langues : codes natifs vs étiquettes iso: portables
Chaque moteur prend les langues via un champ unique, OcrOptions.lang. Chaque entrée a exactement deux formes :
Code natif (sans préfixe) — la graphie propre du moteur, transmise telle quelle : ch (chinois PP-OCR), deu (allemand Tesseract), ch_sim (EasyOCR), en-US (Vision).
Étiquette portable — BCP-47 derrière iso:, mappée sur le moteur : iso:de, iso:en-US, iso:zh-Hant. Incluez toujours l'écriture quand elle n'est pas celle par défaut : le serbe latin doit être iso:sr-Latn (le serbe par défaut est cyrillique).
Chaque moteur déclare ce qu'il sert : supported_ocr_languages() renvoie codes natifs + BCP-47 dans une graphie recopiable dans lang. Docling ne substitue jamais en silence — une langue non servie lève une erreur nommant ce que le moteur peut servir. RapidOCR et Nemotron tournent une langue à la fois (premier tag gagnant, reste averti).
| Étiquette | Signifie | Dites plutôt |
|---|---|---|
mul | plusieurs langues | Le code multilingue propre du moteur (p. ex. Nemotron multilingual) |
und | indéterminé | Liste vide, ou une langue dans l'écriture voulue |
zxx | aucun contenu linguistique | Coupez l'OCR : --no-ocr / do_ocr=False |
from docling.datamodel.pipeline_options import TesseractCliOcrOptions
TesseractCliOcrOptions(lang=["deu", "eng"]) # natif : tesseract -l deu+eng
TesseractCliOcrOptions(lang=["iso:de", "iso:en"]) # portable : pareil
Ce que signifie une liste vide selon le moteur — et les codes qui éclipsent une étiquette (nu = le modèle ; iso: = la langue) :
| Moteur | lang=[] (--ocr-lang "") |
|---|---|
| Tesseract (les deux) | Détection orientation + écriture par page (fichier osd requis) |
| EasyOCR | Anglais (en) |
| RapidOCR | Chinois simplifié par défaut (ch) |
| Nemotron | Modèle anglais |
| OcrMac | Automatique de Vision |
| KServe | Envoie en |
| Code | Nu atteint | iso: signifie |
|---|---|---|
ch | Chinois simplifié PP-OCR | ch-Latn = chamorro |
ka | Kannada PP-OCR | ka-Geor = géorgien (PP-OCR ne peut pas — erreur) |
ang | Angika EasyOCR | Vieil anglais |
frk | Fraktur allemande Tesseract | Francique |
tab | Tabasaran EasyOCR (cyrillique) | Tabasaran (latin) |
mah | Magahi EasyOCR | Marshallais |
12. Accélération GPU pour l'OCR
- RapidOCR sur CUDA : installez l'ONNX Runtime GPU —
pip install "docling[onnxruntime]"— vérifiez queCUDAExecutionProviderfigure dansort.get_available_providers(), puis utilisez le backendonnxruntimeavec périphérique CUDA. Le backendtorchest l'alternative (attention : PP-OCRv5 + torch = chinois seul). - Nemotron est GPU-only par conception (CUDA 13.x, Linux x86_64).
- EasyOCR / Tesseract / OcrMac sont en pratique CPU-bound — mettez un CPU rapide et dépensez le budget GPU plutôt sur les étapes layout/tableaux. Le réglage fin (batch sizes, serveurs VLM) est dans le guide GPU officiel.
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. Recettes prêtes (CLI + Python)
PDF scanné, OCR pleine page. Choisir explicitement un moteur. Sauter l'OCR sur PDF numériques (le plus rapide). OCR en allemand + anglais, étiquettes portables :
Plus d'exemples détaillés : forcer l'OCR pleine page, détection de langue Tesseract, RapidOCR avec modèles propres, bibliothèque locale et le configurateur.
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)
# Substituez EasyOcrOptions / TesseractOcrOptions / TesseractCliOcrOptions
# / OcrMacOptions (macOS) / NemotronOcrOptions (Linux CUDA) au besoin.
converter = DocumentConverter(
format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)}
)
doc = converter.convert("scan.pdf").document
print(doc.export_to_markdown())
14. Dépannage OCR
- Texte scanné non reconnu — OCR coupé ou le mode défaut a raté la couche manquante : forcez
--ocr-mode full_page, essayez un autre moteur. Voir OCR sur un PDF scanné. - L'extra OCR ne s'installe pas — RapidOCR/EasyOCR sont pip-only ; Tesseract exige d'abord binaire système +
TESSDATA_PREFIX. Voir erreur d'installation du paquet OCR. - Conversion lente — OCR + enrichissements sont les étapes CPU les plus chères :
--no-ocrpour les PDF numériques,--table-mode fastou un GPU. Voir conversion lente. - GPU ignoré — confirmez
torch.cuda.is_available()/CUDAExecutionProvider, utilisez--device cuda(mpssur Apple Silicon). Voir GPU non utilisé. - Sortie dans la mauvaise langue — vérifiez les éclipses (
kavsiso:ka-Geor), gardez les listes EasyOCR courtes, vérifiez avecsupported_ocr_languages().
15. FAQ OCR
Quel moteur pour débuter ?
pip install "docling[rapidocr]" et --ocr-engine rapidocr.Ai-je seulement besoin d'OCR ?
--no-ocr est plus rapide et souvent plus précis. Une sortie vide sur un scan signe --ocr-mode full_page.Code natif ou étiquette iso: ?
ch, deu) est le plus court quand le moteur est connu. Portable (iso:de, iso:zh-Hant) survit aux changements de moteur et est requis pour les écritures comme iso:sr-Latn. Ne confondez jamais les éclipses comme ka nu (modèle kannada) vs iso:ka-Geor (géorgien).Pourquoi EasyOCR empire quand j'ajoute une langue ?
["en","de"] chute du modèle spécifique anglais vers le modèle latin général. Ne demandez que ce que le document contient.RapidOCR fait-il plusieurs langues à la fois ?
latin, cyrillic, arabic, devanagari, eslav) ou des passes par langue.Tesseract ne trouve pas ma langue ?
tesseract-ocr-<langue>), confirmez avec tesseract --list-langs et exportez TESSDATA_PREFIX avec slash final. L'erreur du constructeur liste exactement l'installé.Quels moteurs utilisent le GPU ?
Comment utiliser un modèle OCR propre ?
--allow-external-plugins.Vérifié avec Docling v2.129.0 · Dernière vérification 2026-09-22 · Source officielle