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

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ónEligePor qué
Por defecto / dudasRapidOCRInstalación solo pip, amable con CPU, multilingüe, capaz en GPU. La primera opción más segura.
100+ idiomas o traineddata propiosTesseract (CLI o tesserocr)Motor maduro, modelos de escritura (script/Latin), japonés vertical (jpn_vert), ficheros entrenados propios.
En un Mac, cero configuraciónOcrMacUsa Apple Vision en el dispositivo; sin binarios ni descargas de modelos.
CJK + latín simple, fácil instalaciónEasyOCRSolo pip con modelos gen2 autodescargados; varios idiomas a la vez.
Granja NVIDIA, máximo rendimientoNemotron OCRAcelerado por GPU; modelos inglés + multilingüe (Linux x86_64, CUDA 13.x).
El OCR vive en otro servicioKServe v2Docling llama a tu endpoint remoto; los códigos son los de tu despliegue.
Necesitas un modelo de nichoPlugin (OnnxTR, SuryaOCR)Instalación vía sistema de plugins con --allow-external-plugins.
2
Step 2

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.

FlagValores / defectoSignificado
--ocr / --no-ocrdefecto activadoInterruptor maestro. --no-ocr omite OCR del todo: lo más rápido en PDF digitales.
--ocr-modedefault, full_page, layout_regions, pdf_aware_layout_regionsQué 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-engineauto (defecto), rapidocr, easyocr, tesseract, tesserocr, ocrmac, nemotron-ocr, kserve_v2_ocrQué motor. auto elige según lo instalado en tu plataforma.
--ocr-langlista separada por comas, p. ej. ch, deu, iso:deIdiomas, nativos o portables (ver sección 11). Vacío (--ocr-lang "") deja decidir al motor.
--psm0–13Page Segmentation Mode del motor OCR.
3
Step 3

3. Tabla comparativa de motores

MotorIdeal paraPlataformaNotasDocs
auto (default) Dejar que Docling elija un motor disponible.AllValor 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-platformBackend 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-platformpip 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 onlypip 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.xpip 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.ServiceSe 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
4
Step 4

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-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
MotorInstalación¿Dependencia del sistema?
RapidOCRpip install "docling[rapidocr]" (o pip install rapidocr onnxruntime)No: solo pip.
EasyOCRpip install "docling[easyocr]" (o pip install easyocr)No: descarga sus modelos al primer uso.
Tesseract CLISolo binario del sistema (abajo); sin extra pipSí: binario + TESSDATA_PREFIX (con / final).
Tesseract (tesserocr)Primero el binario, luego pip install "docling[tesserocr]"Sí: más compilador en Windows para el binding.
OcrMacpip install "docling[ocrmac]"Solo macOS; sin modelos: Vision viene con el SO.
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-pluginsNo: 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
Step 5

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
BackendVersiones PP-OCRNotas
onnxruntime (defecto)v4, v5, v6Cobertura más completa: único backend con PP-OCRv5 eslav/cyrillic.
openvinov4, v5, v6Vía hardware Intel.
paddlev4, v5, v6Runtime PaddlePaddle.
torchv4, v5 (solo chino), v6PP-OCRv5 sobre torch solo sirve chino.
6
Step 6

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
CheckpointCubre
english_g2.pthen
latin_g2.pthFamilia europea/latina (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 a fondo (CLI frente a 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
  • Dos sabores, un motor: tesseract invoca la CLI del sistema (sin extra pip); tesserocr enlaza 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 .traineddata es 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.
  • lang vacío = detección de escritura: --ocr-lang "" ejecuta detección de orientación/escritura por página, que requiere la traineddata osd.
  • Detección automática de idioma en el ejemplo oficial.
8
Step 8

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:de encuentra de-DE, iso:pt encuentra pt-BR, iso:zh-CN encuentra zh-Hans.
  • Códigos de región raros como vi-VT deben pasarse nativos (sin prefijo). lang vacío deja elegir a Vision.
9
Step 9

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 NemotronPythonIdiomas
v2.0.0solo 3.12english (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.23.11, 3.12, 3.13como arriba
10
Step 10

10. KServe v2 + motores plugin (OnnxTR, SuryaOCR)

  • KServe v2: para equipos cuyo OCR corre como microservicio remoto. lang no 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-plugins y 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
Step 11

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 sirve. RapidOCR y Nemotron corren un idioma a la vez (gana la primera etiqueta, el resto avisa).

EtiquetaSignificaDi mejor
mulvarios idiomasEl código multilingüe propio del motor (p. ej. Nemotron multilingual)
undindeterminadoLista vacía o un idioma en la escritura deseada
zxxsin contenido lingüísticoApaga 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):

Motorlang=[] (--ocr-lang "")
Tesseract (ambos)Detección de orientación + escritura por página (requiere fichero osd)
EasyOCRInglés (en)
RapidOCRChino simplificado por defecto (ch)
NemotronModelo inglés
OcrMacAutomático de Vision
KServeEnvía en
CódigoDesnudo alcanzaiso: significa
chChino simplificado PP-OCRch-Latn = chamorro
kaCanarés PP-OCRka-Geor = georgiano (PP-OCR no lo sirve: error)
angAngika EasyOCRInglés antiguo
frkFraktur alemana TesseractFranconio
tabTabasaran EasyOCR (cirílico)Tabasaran (latino)
mahMagahi EasyOCRMarshalés
12
Step 12

12. Aceleración GPU para OCR

  • RapidOCR en CUDA: instala el ONNX Runtime GPU (pip install "docling[onnxruntime]"), confirma que CUDAExecutionProvider esté en ort.get_available_providers() y usa el backend onnxruntime con dispositivo CUDA. El backend torch es 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
Step 13

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_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)
# 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
Step 14

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_page y 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-ocr en digitales, --table-mode fast o GPU. Ver conversión lenta.
  • GPU ignorada: confirma torch.cuda.is_available() / CUDAExecutionProvider y usa --device cuda (mps en Apple Silicon). Ver GPU no usada.
  • Salida en idioma erróneo: revisa sombras (ka frente a iso:ka-Geor), mantén cortas las listas EasyOCR y verifica con supported_ocr_languages().
15
Step 15

15. FAQ de OCR

¿Qué motor para principiantes?
RapidOCR: un extra pip, sin paquetes de sistema, amable con CPU, multilingüe y luego capaz en GPU. Empieza con pip install "docling[rapidocr]" y --ocr-engine rapidocr.
¿Necesito OCR siquiera?
Solo para PDF escaneados/imagen. Los digitales ya traen texto: --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:?
Nativo (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?
Por diseño: EasyOCR elige un checkpoint que cubra todos los idiomas pedidos, así que ["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?
No: un idioma por pasada (gana la primera entrada). Usa un token de familia (latin, cyrillic, arabic, devanagari, eslav) o pasadas por idioma.
¿Tesseract no encuentra mi idioma?
Instala la traineddata (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?
RapidOCR (backends onnxruntime/torch con CUDA) y Nemotron (solo CUDA). EasyOCR, Tesseract y OcrMac son CPU en la práctica.
¿Cómo uso un modelo OCR propio?
RapidOCR y SuryaOCR admiten checkpoints propios: sigue el ejemplo RapidOCR propio y el ejemplo SuryaOCR; motores de terceros cargan vía --allow-external-plugins.

Verificado con Docling v2.129.0 · Última comprobación 2026-09-22 · Fuente oficial