Tesseract OCR para PDF
y PDF buscables.
La guía completa y probada para aplicar OCR a PDF con Tesseract: rasterizar páginas, crear PDF buscables, usar OCRmyPDF y pdfsandwich, ejecutarlo de principio a fin en Python y resolver los errores más habituales.
Resumen (un comando)
Para un PDF multipágina real, OCRmyPDF es la vía más rápida.
pip install ocrmypdf # o: apt install ocrmypdf
ocrmypdf entrada.pdf salida.pdf¿Sin OCRmyPDF? Rasteriza y usa la CLI de Tesseract directamente, como se explica abajo.
Por qué hay que rasterizar los PDF
Tesseract reconoce imágenes, no contenedores PDF.
Un PDF es un contenedor: puede incluir texto vectorial, fuentes incrustadas o imágenes de páginas escaneadas. Tesseract lee imágenes ráster (TIFF, PNG, JPEG, WebP…), así que las páginas deben convertirse a imágenes primero. Elige el rasterizador según lo que tengas instalado:
| Herramienta | Instalación | Notas |
|---|---|---|
pdftoppm (poppler) | apt install poppler-utils | Rápido, scriptable, la opción clásica |
pdftocairo (poppler) | poppler-utils | Similar a pdftoppm, salida Cairo |
| ImageMagick | apt install imagemagick | convert -density 300 in.pdf out.tif |
| PyMuPDF | pip install pymupdf | Python puro, sin binarios externos |
| pdf2image | pip install pdf2image | Wrapper de Python sobre poppler |
# PDF -> un PNG por página a 300 DPI
pdftoppm -png -r 300 entrada.pdf paginaEl DPI es lo más importante: 300 DPI es el equilibrio estándar; 600 DPI para fuentes pequeñas o archivo; evita por debajo de 200 DPI.
Crear un PDF buscable con la CLI de Tesseract
Una imagen se convierte en una página de PDF buscable con la configuración de salida pdf.
# Imagen -> PDF buscable
tesseract pagina-1.png salida pdf
# Solo capa de texto (sin imagen visible)
tesseract escaneo.png salida textonly_pdf
# Varias páginas en un PDF: pasa una lista de imágenes
tesseract listaimagenes.txt salida pdfPara un PDF multipágina, pon cada ruta de imagen en su propia línea en listaimagenes.txt. Referencia completa de formatos: documentación.
Método B — OCRmyPDF (recomendado para PDF reales)
OCRmyPDF se encarga de rasterizar, OCR, enderezar, rotar y la capa de texto invisible en un solo comando.
ocrmypdf entrada.pdf salida.pdf # básico
ocrmypdf -l eng+spa entrada.pdf salida.pdf # idiomas
ocrmypdf --deskew --rotate-pages entrada.pdf salida.pdf
ocrmypdf --optimize 2 entrada.pdf salida.pdf # reduce el archivo
ocrmypdf --skip-text entrada.pdf salida.pdf # conserva páginas con textoOCRmyPDF usa Tesseract por debajo y requiere Ghostscript y las herramientas de poppler. Opciones útiles: --force-ocr, --redo-ocr, --pages 1-10.
Método C — pdfsandwich
Un wrapper más ligero que añade una capa de texto y aplica preprocesado como el enderezado.
pdfsandwich escaneo.pdf # genera escaneo_ocr.pdf
pdfsandwich -lang eng+spa escaneo.pdfMétodo D — Python de principio a fin
Usa pdf2image para rasterizar y pytesseract para construir el PDF buscable, y combina con pypdf.
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader
pages = convert_from_path("entrada.pdf", dpi=300) # necesita poppler
writer = PdfWriter()
for page in pages:
pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf", lang="spa")
writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("salida.pdf", "wb") as f:
writer.write(f)En Windows, pasa la carpeta bin de poppler con poppler_path=. Más detalle en la guía de pytesseract.
¿Qué método debo usar?
| Método | Ideal para | Configuración | Multipágina |
|---|---|---|---|
| OCRmyPDF | PDF reales, automatización | Ghostscript + poppler | Sí, en un comando |
| pdfsandwich | Capa de texto rápida con preprocesado | poppler + ImageMagick | Sí |
| CLI de Tesseract | Imágenes o listas de imágenes | Solo Tesseract | Con una lista de imágenes |
| Python (pdf2image) | Pipelines y lógica personalizada | poppler + pytesseract | Bucle y combinación |
Fidelidad de diseño y superposición de texto
Por qué los PDF buscables a veces se ven desalineados y cómo mantener la geometría.
- La capa de texto invisible se coloca usando las cajas de palabras del OCR; si el DPI es incorrecto, la superposición puede desviarse.
- Usa salida
hOCRoALTOcuando necesites coordenadas exactas para resaltado o archivo. pdftoppm -r 300y coincidir con el tamaño original mantiene la superposición alineada.- Para diseños complejos, prefiere OCRmyPDF, que conserva la imagen original y añade la capa encima.
Calidad y rendimiento
- DPI: 300 estándar, 600 para texto pequeño o archivo.
- Rangos de páginas: procesa solo lo necesario (
--pagesen OCRmyPDF o recorta la lista). - Paralelismo: aplica OCR a las páginas en paralelo y luego combínalas.
- Tamaño: usa
--optimize/ compresión JPEG o reduce el DPI tras el OCR. - Preprocesado: endereza y elimina ruido antes del OCR.
Solución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
Unable to get page count. Is poppler installed? | pdf2image no encuentra poppler | Instala poppler-utils o define poppler_path en Windows. |
| El PDF de salida no tiene texto buscable | El OCR no se ejecutó o el idioma es incorrecto | Confirma el éxito y define -l/--language al idioma del documento. |
| La superposición de texto está desalineada | DPI o tamaño de página incorrectos | Rasteriza a 300 DPI con el tamaño original. |
| El archivo de salida es enorme | Imágenes sin pérdida a 600 DPI | Usa --optimize / JPEG, o reduce el DPI. |
| Falla un PDF protegido con contraseña | Entrada cifrada | Descífralo primero o pasa la contraseña si tu herramienta lo admite. |
Preguntas frecuentes de PDF
¿Cómo hago que un PDF sea buscable?
Usa ocrmypdf entrada.pdf salida.pdf, o rasteriza las páginas y ejecuta tesseract pagina.tif salida pdf.
¿Por qué Tesseract no lee un PDF directamente?
Tesseract reconoce imágenes ráster, así que las páginas del PDF deben convertirse a imágenes primero.
¿Qué DPI debo usar?
300 DPI para la mayoría de documentos; 600 DPI para fuentes pequeñas o archivo.
¿Puedo aplicar OCR a un PDF en Python?
Sí: usa pdf2image con poppler y pytesseract.image_to_pdf_or_hocr, y combina las páginas con pypdf.
¿Cómo mantengo el diseño preciso?
Coincide el tamaño y el DPI originales, y prefiere OCRmyPDF, que conserva la imagen y añade la capa de texto encima.