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
Step 1

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.

SituationChoixPourquoi
Défaut / hésitationRapidOCRInstallation pip-only, économe en CPU, multilingue, capable en GPU. Le premier choix le plus sûr.
100+ langues ou traineddata propresTesseract (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 configurationOcrMacUtilise Apple Vision sur l'appareil ; ni binaires ni téléchargements de modèles.
CJK + latin simple, install facileEasyOCRPip seul avec modèles gen2 auto-téléchargés ; plusieurs langues à la fois.
Ferme NVIDIA, débit maxNemotron OCRAccéléré par GPU ; modèles anglais + multilingue (Linux x86_64, CUDA 13.x).
L'OCR vit sur un autre serviceKServe v2Docling appelle votre endpoint distant ; les codes sont ceux de votre déploiement.
Besoin d'un modèle de nichePlugin (OnnxTR, SuryaOCR)Installation via le système de plugins avec --allow-external-plugins.
2
Step 2

2. Comment l'OCR s'insère dans le pipeline (modes & flags)

L'OCR est activé par défaut (--ocr). Trois flags contrôlent 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.

FlagValeurs / défautSignification
--ocr / --no-ocrdéfaut activéInterrupteur maître. --no-ocr saute l'OCR entièrement — le plus rapide sur PDF numériques.
--ocr-modedefault, full_page, layout_regions, pdf_aware_layout_regionsQuelles 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-engineauto (défaut), rapidocr, easyocr, tesseract, tesserocr, ocrmac, nemotron-ocr, kserve_v2_ocrQuel moteur. auto choisit parmi l'installé sur votre plateforme.
--ocr-langliste séparée par virgules, p. ex. ch, deu, iso:deLangues, natives ou portables (voir section 11). Vide (--ocr-lang "") laisse le moteur décider.
--psm0–13Page Segmentation Mode du moteur OCR.
3
Step 3

3. Tableau comparatif des moteurs

MoteurIdéal pourPlateformeRemarquesDocs
auto (default) Laisser Docling choisir un moteur disponible.AllValeur 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-platformBackend 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-platformpip 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 onlypip 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.xpip 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.ServiceSe 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
4
Step 4

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-config
sudo apt-get install -y tesseract-ocr tesseract-ocr-eng libtesseract-dev libleptonica-dev pkg-config
sudo dnf install -y tesseract tesseract-devel tesseract-langpack-eng tesseract-osd leptonica-devel
MoteurInstallationDépendance système ?
RapidOCRpip install "docling[rapidocr]" (ou pip install rapidocr onnxruntime)Non — pip seul.
EasyOCRpip install "docling[easyocr]" (ou pip install easyocr)Non — télécharge ses modèles au premier usage.
Tesseract CLIBinaire système seul (ci-dessous) ; aucun extra pip requisOui — binaire + TESSDATA_PREFIX (avec / final).
Tesseract (tesserocr)D'abord le binaire, puis pip install "docling[tesserocr]"Oui — plus compilateur sous Windows pour le binding.
OcrMacpip install "docling[ocrmac]"macOS uniquement ; aucun modèle — Vision fait partie de l'OS.
Nemotronpip install "docling[feat-ocr-nemotron]" --extra-index-url https://download.pytorch.org/whl/cu130 --index-strategy unsafe-best-matchLinux x86_64 + Python 3.12 + CUDA 13.x.
OnnxTR (plugin)pip install "docling-ocr-onnxtr[cpu]" + --allow-external-pluginsNon — 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
Step 5

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
BackendVersions PP-OCRRemarques
onnxruntime (défaut)v4, v5, v6Couverture la plus complète — seul backend avec PP-OCRv5 eslav/cyrillic.
openvinov4, v5, v6Chemin matériel Intel.
paddlev4, v5, v6Runtime PaddlePaddle.
torchv4, v5 (chinois seul), v6PP-OCRv5 sur torch ne sert que le chinois.
6
Step 6

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
CheckpointCouvre
english_g2.pthen
latin_g2.pthFamille européenne/latine (de, fr, es, it, pt, nl, pl …)
zh_sim_g2.pthch_sim + en
japanese_g2.pth / korean_g2.pthja / ko + en
telugu.pth / kannada.pthte / kn + en
cyrillic_g2.pthru, be, bg, uk, mn … + en
7
Step 7

7. Tesseract en profondeur (CLI vs tesserocr, traineddata)

docling convert scan.pdf --ocr-engine tesseract --ocr-lang deu+eng
TESSDATA_PREFIX=/opt/homebrew/share/tessdata/ docling convert scan.pdf --ocr-engine tesserocr
  • Deux saveurs, un moteur : tesseract appelle la CLI système (aucun extra pip) ; tesserocr lie 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 .traineddata est utilisable.
  • Vérification à la construction : les fichiers manquants échouent aussitôt avec le jeu installé dans le message — pas en pleine conversion.
  • lang vide = détection d'écriture : --ocr-lang "" lance la détection orientation/écriture par page, qui exige la traineddata osd.
  • Détection auto de langue dans l'exemple officiel.
8
Step 8

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:de trouve de-DE, iso:pt trouve pt-BR, iso:zh-CN trouve zh-Hans.
  • Les codes de région bizarres comme vi-VT doivent passer natifs (sans préfixe). lang vide laisse Vision choisir.
9
Step 9

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 NemotronPythonLangues
v2.0.03.12 uniquementenglish (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.23.11, 3.12, 3.13comme ci-dessus
10
Step 10

10. KServe v2 + moteurs plugins (OnnxTR, SuryaOCR)

  • KServe v2 : pour les équipes dont l'OCR tourne en microservice distant. lang n'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-plugins et 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
Step 11

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).

ÉtiquetteSignifieDites plutôt
mulplusieurs languesLe code multilingue propre du moteur (p. ex. Nemotron multilingual)
undindéterminéListe vide, ou une langue dans l'écriture voulue
zxxaucun contenu linguistiqueCoupez 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) :

Moteurlang=[] (--ocr-lang "")
Tesseract (les deux)Détection orientation + écriture par page (fichier osd requis)
EasyOCRAnglais (en)
RapidOCRChinois simplifié par défaut (ch)
NemotronModèle anglais
OcrMacAutomatique de Vision
KServeEnvoie en
CodeNu atteintiso: signifie
chChinois simplifié PP-OCRch-Latn = chamorro
kaKannada PP-OCRka-Geor = géorgien (PP-OCR ne peut pas — erreur)
angAngika EasyOCRVieil anglais
frkFraktur allemande TesseractFrancique
tabTabasaran EasyOCR (cyrillique)Tabasaran (latin)
mahMagahi EasyOCRMarshallais
12
Step 12

12. Accélération GPU pour l'OCR

  • RapidOCR sur CUDA : installez l'ONNX Runtime GPU — pip install "docling[onnxruntime]" — vérifiez que CUDAExecutionProvider figure dans ort.get_available_providers(), puis utilisez le backend onnxruntime avec périphérique CUDA. Le backend torch est 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
Step 13

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_page
docling convert scan.pdf --ocr-engine rapidocr
docling convert report.pdf --no-ocr --to md
docling convert scan.pdf --ocr-engine rapidocr --ocr-lang iso:de,iso:en
from 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
Step 14

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-ocr pour les PDF numériques, --table-mode fast ou un GPU. Voir conversion lente.
  • GPU ignoré — confirmez torch.cuda.is_available() / CUDAExecutionProvider, utilisez --device cuda (mps sur Apple Silicon). Voir GPU non utilisé.
  • Sortie dans la mauvaise langue — vérifiez les éclipses (ka vs iso:ka-Geor), gardez les listes EasyOCR courtes, vérifiez avec supported_ocr_languages().
15
Step 15

15. FAQ OCR

Quel moteur pour débuter ?
RapidOCR : un extra pip, aucun paquet système, économe en CPU, multilingue et plus tard capable en GPU. Démarrez avec pip install "docling[rapidocr]" et --ocr-engine rapidocr.
Ai-je seulement besoin d'OCR ?
Uniquement pour les PDF scannés/image. Les PDF numériques portent déjà du texte — --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: ?
Natif (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 ?
Par conception : EasyOCR choisit un checkpoint couvrant toutes les langues demandées — ["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 ?
Non — une langue par passe (la première entrée gagne). Utilisez un token de famille (latin, cyrillic, arabic, devanagari, eslav) ou des passes par langue.
Tesseract ne trouve pas ma langue ?
Installez la traineddata (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 ?
RapidOCR (backends onnxruntime/torch avec CUDA) et Nemotron (CUDA uniquement). EasyOCR, Tesseract et OcrMac sont CPU en pratique.
Comment utiliser un modèle OCR propre ?
RapidOCR et SuryaOCR acceptent des checkpoints propres — suivez l'exemple RapidOCR propre et l'exemple SuryaOCR ; les moteurs tiers chargent via --allow-external-plugins.

Vérifié avec Docling v2.129.0 · Dernière vérification 2026-09-22 · Source officielle