Motores OCR de Docling
No hay un único motor OCR «mejor»: el adecuado depende de tu plataforma, idiomas y ganas de configurar. Esta página compara cada motor, muestra instalación + CLI + Python por motor, explica el sistema portable iso:, cubre backends GPU y da recetas listas. Datos verificados contra los conceptos oficiales OCR y la referencia nativa.
1. ¿Qué motor elegir?
Los PDF digitales (texto) a menudo no necesitan OCR: prueba primero --no-ocr para máxima velocidad y añade un motor solo para páginas escaneadas.
| Situación | Elige | Por qué |
|---|---|---|
| Por defecto / dudas | RapidOCR | Instalación solo pip, amable con CPU, multilingüe, capaz en GPU. La primera opción más segura. |
| 100+ idiomas o traineddata propios | Tesseract (CLI o tesserocr) | Motor maduro, modelos de escritura (script/Latin), japonés vertical (jpn_vert), ficheros entrenados propios. |
| En un Mac, cero configuración | OcrMac | Usa Apple Vision en el dispositivo; sin binarios ni descargas de modelos. |
| CJK + latín simple, fácil instalación | EasyOCR | Solo pip con modelos gen2 autodescargados; varios idiomas a la vez. |
| Granja NVIDIA, máximo rendimiento | Nemotron OCR | Acelerado por GPU; modelos inglés + multilingüe (Linux x86_64, CUDA 13.x). |
| El OCR vive en otro servicio | KServe v2 | Docling llama a tu endpoint remoto; los códigos son los de tu despliegue. |
| Necesitas un modelo de nicho | Plugin (OnnxTR, SuryaOCR) | Instalación vía sistema de plugins con --allow-external-plugins. |
2. Cómo encaja OCR en el pipeline (modos y flags)
OCR está activado por defecto (--ocr). Tres flags controlan dónde corre y qué motor lo ejecuta. Equivalente Python: PdfPipelineOptions().do_ocr = True más uno de RapidOcrOptions / EasyOcrOptions / TesseractOcrOptions / TesseractCliOcrOptions / OcrMacOptions / NemotronOcrOptions con mode=OcrMode.FULL_PAGE para página completa. Depura lo que ve OCR con --debug-visualize-ocr.
| Flag | Valores / defecto | Significado |
|---|---|---|
| --ocr / --no-ocr | defecto activado | Interruptor maestro. --no-ocr omite OCR del todo: lo más rápido en PDF digitales. |
| --ocr-mode | default, full_page, layout_regions, pdf_aware_layout_regions | Qué regiones van al motor. full_page procesa cada página entera (más lento, mejor en escaneos). --force-ocr está obsoleto: usa --ocr-mode full_page. |
| --ocr-engine | auto (defecto), rapidocr, easyocr, tesseract, tesserocr, ocrmac, nemotron-ocr, kserve_v2_ocr | Qué motor. auto elige según lo instalado en tu plataforma. |
| --ocr-lang | lista separada por comas, p. ej. ch, deu, iso:de | Idiomas, nativos o portables (ver sección 11). Vacío (--ocr-lang "") deja decidir al motor. |
| --psm | 0–13 | Page Segmentation Mode del motor OCR. |
3. Tabla comparativa de motores
| Motor | Ideal para | Plataforma | Notas | Docs |
|---|---|---|---|---|
| auto (default) | Dejar que Docling elija un motor disponible. | All | Valor por defecto de --ocr-engine. Docling elige según lo instalado y la plataforma. Python: simplemente no definir ocr_options. | Documentación |
| RapidOCR | OCR multilingüe ligero, amable con CPU; buena opción por defecto. | Cross-platform | Backend ONNX Runtime por defecto (también openvino/paddle/torch). pip install "docling[rapidocr]". Un idioma por pasada; tokens PP-OCR v4/v5/v6 incl. familias latin/cyrillic/arabic/devanagari. Python: RapidOcrOptions. | Documentación |
| Tesseract (CLI) | OCR maduro con más de 100 idiomas; traineddata propios. | Cross-platform (system binary) | Requiere binario del sistema Tesseract más datos de idioma (TESSDATA_PREFIX con / final). Para uso CLI no hace falta extra pip. Python: TesseractCliOcrOptions. lang vacío activa detección OSD (requiere fichero osd). | Documentación |
| Tesseract (tesserocr) | Misma precisión Tesseract, más rápido vía bindings Python. | Cross-platform (compiled) | Tras el binario del sistema, pip install "docling[tesserocr]". En Windows puede requerir herramientas de compilación C++. Python: TesseractOcrOptions. | Documentación |
| EasyOCR | Configuración multilingüe sencilla; escrituras CJK y latinas. | Cross-platform | pip install "docling[easyocr]". Descarga sus propios modelos gen2. Acepta varios idiomas a la vez — mantén la lista corta (solo en supera a en+de). Python: EasyOcrOptions. | Documentación |
| OcrMac | OCR nativo sin configuración en Macs (Apple Vision). | macOS only | pip install "docling[ocrmac]". Sin modelos en el paquete: la cobertura depende de la versión de macOS. Python: OcrMacOptions. | Documentación |
| Nemotron OCR | OCR acelerado por GPU a gran escala en servidores NVIDIA. | Linux x86_64 + CUDA 13.x | pip install "docling[feat-ocr-nemotron]" con índice cu130 (Python 3.12; v2.0.2 añade 3.11/3.13). english o multilingual (+ unos 170 códigos latinos best-effort). Python: NemotronOcrOptions. | Documentación |
| KServe v2 OCR | Llamar a un microservicio OCR remoto. | Service | Se conecta a un endpoint KServe v2. lang se envía tal cual (solo la primera entrada): usa los códigos de tu despliegue. Sin validación ni mapeo. | Documentación |
Ningún motor coincide con la búsqueda.
4. Instalar cada motor
Binario Tesseract según SO. Pasos completos por SO en la visión general y guías de SO. Pre-descarga modelos OCR para máquinas sin conexión o CI: docling-tools models download --all, o dirigidos --easyocr-lang de / --rapidocr-backend-lang onnxruntime:el. Ver la referencia 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| Motor | Instalación | ¿Dependencia del sistema? |
|---|---|---|
| RapidOCR | pip install "docling[rapidocr]" (o pip install rapidocr onnxruntime) | No: solo pip. |
| EasyOCR | pip install "docling[easyocr]" (o pip install easyocr) | No: descarga sus modelos al primer uso. |
| Tesseract CLI | Solo binario del sistema (abajo); sin extra pip | Sí: binario + TESSDATA_PREFIX (con / final). |
| Tesseract (tesserocr) | Primero el binario, luego pip install "docling[tesserocr]" | Sí: más compilador en Windows para el binding. |
| OcrMac | pip install "docling[ocrmac]" | Solo macOS; sin modelos: Vision viene con el SO. |
| 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 | No: sistema de plugins. |
Windows: instala la build UB Mannheim, añádela al PATH y apunta TESSDATA_PREFIX a su carpeta tessdata\. Si tesserocr no compila: pip uninstall tesserocr y pip install --no-binary :all: tesserocr.
5. RapidOCR a fondo (backends, versiones PP-OCR, idiomas)
RapidOCR envuelve modelos PP-OCR. Dos cosas varían por separado: el backend (runtime) y la versión PP-OCR (generación del modelo).
Tokens de idioma (códigos nativos): 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 + unos 45 códigos europeos (de, fr, es, it, pt, nl, pl …) con alias zh→ch, zh_cn→ch, zh_tw→chinese_cht, ja/jp→japan, ko→korean (ojo: coreano en v6 solo existe como alias). de/german y fr/french existen por duplicado.
Familias de escritura (un token cubre muchos idiomas): cyrillic (34: ruso, ucraniano, kazajo … + inglés), devanagari (14: hindi, maratí, sánscrito … + inglés), arabic (9: árabe, persa, urdu … + inglés), eslav (eslavo oriental: ruso, bielorruso, ucraniano + inglés).
Un idioma por pasada: RapidOCR usa la primera entrada de lang y avisa del resto. Python: RapidOcrOptions(lang=["eslav"], backend="onnxruntime"); admite checkpoints propios (ver ejemplo de modelos propios).
docling convert scan.pdf --ocr-engine rapidocr --ocr-mode full_page| Backend | Versiones PP-OCR | Notas |
|---|---|---|
onnxruntime (defecto) | v4, v5, v6 | Cobertura más completa: único backend con PP-OCRv5 eslav/cyrillic. |
openvino | v4, v5, v6 | Vía hardware Intel. |
paddle | v4, v5, v6 | Runtime PaddlePaddle. |
torch | v4, v5 (solo chino), v6 | PP-OCRv5 sobre torch solo sirve chino. |
6. EasyOCR a fondo (lista de idiomas corta)
EasyOCR (checkpoints gen2, detector craft_mlt_25k.pth) acepta varios idiomas a la vez, pero la resolución elige el único checkpoint que cubra todos los pedidos. Un idioma innecesario degrada el modelo en silencio: ["en"] selecciona el preciso english_g2.pth, mientras ["en","de"] cae al genérico latin_g2.pth.
docling convert scan.pdf --ocr-engine easyocr --ocr-lang en| Checkpoint | Cubre |
|---|---|
english_g2.pth | en |
latin_g2.pth | Familia europea/latina (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 a fondo (CLI frente a 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- Dos sabores, un motor:
tesseractinvoca la CLI del sistema (sin extra pip);tesserocrenlaza la librería en proceso (más rápido, requiere el binding compilado). Misma precisión, misma traineddata. - Idioma = stem traineddata:
deu, chi_sim, chi_tra, srp_latn, aze_cyrl, deu_latf, frk, jpn_vert, script/Latin, script/Cyrillic, más cualquier fichero entrenado propio. Lo instalado en.traineddataes lo usable. - Comprobación al construir: los ficheros ausentes fallan de inmediato con el conjunto instalado en el mensaje, no a mitad de conversión.
langvacío = detección de escritura:--ocr-lang ""ejecuta detección de orientación/escritura por página, que requiere la traineddataosd.- Detección automática de idioma en el ejemplo oficial.
8. OcrMac a fondo (solo macOS)
OcrMac es una capa fina sobre Apple Vision: sin binarios ni modelos descargables. Los reconocedores vienen con el SO, así que la cobertura es propiedad de tu versión de macOS, no del release ocrmac.
docling convert scan.pdf --ocr-engine ocrmac --ocr-mode full_page- Instalación:
pip install "docling[ocrmac]"; Python:OcrMacOptions. - Coincidencia por BCP-47 con regiones:
iso:deencuentrade-DE,iso:ptencuentrapt-BR,iso:zh-CNencuentrazh-Hans. - Códigos de región raros como
vi-VTdeben pasarse nativos (sin prefijo).langvacío deja elegir a Vision.
9. Nemotron OCR a fondo (Linux + CUDA)
Requiere Linux x86_64 con CUDA 13.x y el índice torch cu130 (línea de instalación en sección 4). Un idioma por pasada (gana la primera entrada). Python: NemotronOcrOptions.
| Versión Nemotron | Python | Idiomas |
|---|---|---|
| v2.0.0 | solo 3.12 | english (alias en), multilingual (alias multi: en, zh sim+trad, ja, ko, ru) + unos 170 códigos latinos best-effort (avisa, sin probar por NVIDIA) |
| v2.0.2 | 3.11, 3.12, 3.13 | como arriba |
10. KServe v2 + motores plugin (OnnxTR, SuryaOCR)
- KServe v2: para equipos cuyo OCR corre como microservicio remoto.
langno se valida ni mapea: la primera entrada sale tal cual, el resto se descarta con aviso. Usa los códigos de tu despliegue;iso:solo vale si el servidor lo habla (ninguno lo hace). - Plugin OnnxTR:
pip install "docling-ocr-onnxtr[cpu]", activa--allow-external-pluginsy elige por el nombre del plugin. Ver el repo docling-OCR-OnnxTR. - SuryaOCR con modelos propios en el ejemplo oficial; lista opciones de terceros con
--show-external-plugins.
11. Idiomas: códigos nativos frente a etiquetas iso: portables
Cada motor recibe idiomas por un solo campo, OcrOptions.lang. Cada entrada tiene exactamente dos formas:
Código nativo (sin prefijo): la grafía propia del motor, pasada tal cual: ch (chino PP-OCR), deu (alemán Tesseract), ch_sim (EasyOCR), en-US (Vision).
Etiqueta portable: BCP-47 tras iso:, mapeada al motor: iso:de, iso:en-US, iso:zh-Hant. Incluye siempre la escritura cuando no es la defecto: el serbio latino debe ser iso:sr-Latn (el serbio por defecto es cirílico).
Cada motor informa lo que sirve: supported_ocr_languages() devuelve códigos nativos + BCP-47 en grafía lista para pegar en lang. Docling nunca sustituye en silencio: un idioma inservible lanza error nombrando lo que el motor sí sirve. RapidOCR y Nemotron corren un idioma a la vez (gana la primera etiqueta, el resto avisa).
| Etiqueta | Significa | Di mejor |
|---|---|---|
mul | varios idiomas | El código multilingüe propio del motor (p. ej. Nemotron multilingual) |
und | indeterminado | Lista vacía o un idioma en la escritura deseada |
zxx | sin contenido lingüístico | Apaga OCR: --no-ocr / do_ocr=False |
from docling.datamodel.pipeline_options import TesseractCliOcrOptions
TesseractCliOcrOptions(lang=["deu", "eng"]) # nativo: tesseract -l deu+eng
TesseractCliOcrOptions(lang=["iso:de", "iso:en"]) # portable: lo mismo
Qué significa una lista vacía según el motor, y códigos que ocultan una etiqueta (desnudo = el modelo; iso: = el idioma):
| Motor | lang=[] (--ocr-lang "") |
|---|---|
| Tesseract (ambos) | Detección de orientación + escritura por página (requiere fichero osd) |
| EasyOCR | Inglés (en) |
| RapidOCR | Chino simplificado por defecto (ch) |
| Nemotron | Modelo inglés |
| OcrMac | Automático de Vision |
| KServe | Envía en |
| Código | Desnudo alcanza | iso: significa |
|---|---|---|
ch | Chino simplificado PP-OCR | ch-Latn = chamorro |
ka | Canarés PP-OCR | ka-Geor = georgiano (PP-OCR no lo sirve: error) |
ang | Angika EasyOCR | Inglés antiguo |
frk | Fraktur alemana Tesseract | Franconio |
tab | Tabasaran EasyOCR (cirílico) | Tabasaran (latino) |
mah | Magahi EasyOCR | Marshalés |
12. Aceleración GPU para OCR
- RapidOCR en CUDA: instala el ONNX Runtime GPU (
pip install "docling[onnxruntime]"), confirma queCUDAExecutionProvideresté enort.get_available_providers()y usa el backendonnxruntimecon dispositivo CUDA. El backendtorches la alternativa (ojo: PP-OCRv5 + torch = solo chino). - Nemotron es solo-GPU por diseño (CUDA 13.x, Linux x86_64).
- EasyOCR / Tesseract / OcrMac son en la práctica CPU: pon una CPU rápida y gasta el presupuesto GPU en etapas de layout/tablas. El ajuste fino (lotes, servidores VLM) está en la guía oficial GPU.
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. Recetas listas (CLI + Python)
PDF escaneado, OCR de página completa. Elegir motor explícito. Omitir OCR en PDF digitales (lo más rápido). OCR en alemán + inglés, etiquetas portables:
Más ejemplos trabajados: forzar OCR de página completa, detección de idioma Tesseract, RapidOCR con modelos propios, biblioteca local y el configurador.
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)
# Sustituye por EasyOcrOptions / TesseractOcrOptions / TesseractCliOcrOptions
# / OcrMacOptions (macOS) / NemotronOcrOptions (Linux CUDA) según necesites.
converter = DocumentConverter(
format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)}
)
doc = converter.convert("scan.pdf").document
print(doc.export_to_markdown())
14. Solución de problemas OCR
- Texto escaneado no reconocido: OCR apagado o el modo defecto no vio la capa ausente. Fuerza
--ocr-mode full_pagey prueba otro motor. Ver OCR de un PDF escaneado. - El extra OCR no instala: RapidOCR/EasyOCR son solo pip; Tesseract requiere antes binario +
TESSDATA_PREFIX. Ver error de instalación del paquete OCR. - Conversión lenta: OCR y enriquecimientos son las etapas CPU más caras.
--no-ocren digitales,--table-mode fasto GPU. Ver conversión lenta. - GPU ignorada: confirma
torch.cuda.is_available()/CUDAExecutionProvidery usa--device cuda(mpsen Apple Silicon). Ver GPU no usada. - Salida en idioma erróneo: revisa sombras (
kafrente aiso:ka-Geor), mantén cortas las listas EasyOCR y verifica consupported_ocr_languages().
15. FAQ de OCR
¿Qué motor para principiantes?
pip install "docling[rapidocr]" y --ocr-engine rapidocr.¿Necesito OCR siquiera?
--no-ocr es más rápido y a menudo más preciso. Salida vacía en un scan: señal de --ocr-mode full_page.¿Código nativo o etiqueta iso:?
ch, deu) es lo más corto si conoces el motor. Portable (iso:de, iso:zh-Hant) sobrevive cambios de motor y es obligatorio para escrituras como iso:sr-Latn. No confundas sombras como ka desnudo (modelo canarés) frente a iso:ka-Geor (georgiano).¿Por qué EasyOCR empeora al añadir un idioma?
["en","de"] baja del modelo específico inglés al latino general. Pide solo lo que el documento contenga.¿RapidOCR hace varios idiomas a la vez?
latin, cyrillic, arabic, devanagari, eslav) o pasadas por idioma.¿Tesseract no encuentra mi idioma?
tesseract-ocr-<idioma>), confírmala con tesseract --list-langs y exporta TESSDATA_PREFIX con barra final. El error del constructor lista exactamente lo instalado.¿Qué motores usan GPU?
¿Cómo uso un modelo OCR propio?
--allow-external-plugins.Verificado con Docling v2.129.0 · Última comprobación 2026-09-22 · Fuente oficial