Saltar al contenido principal
Guía para desarrolladores

Tesseract OCR en Python
con pytesseract.

Guía completa y probada de pytesseract: instalación, API principal, preprocesado de imágenes, PDF, puntuaciones de confianza, configuración PSM/OEM, rendimiento y los errores más habituales.

Inicio rápido (tres líneas)

Instala primero el motor y ejecuta esto. La configuración completa viene después.

ocr.py
import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open("image.png"))
print(text)

Instalar pytesseract

pytesseract es solo un wrapper: llama al binario de Tesseract, así que primero debes instalar el motor.

bash
pip install pytesseract pillow
# opcional, para preprocesado:
pip install opencv-python numpy
# opcional, para entrada PDF:
pip install pdf2image

Si el motor no está en tu PATH (habitual en Windows), indícalo explícitamente:

python
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

¿Nuevo con el motor? Consulta la guía de instalación para Windows, macOS, Linux, Docker y WSL.

API principal

pytesseract expone una función por tipo de salida. Elige la que corresponda a lo que necesitas.

FunciónDevuelveÚsala cuando
image_to_stringTexto planoSolo necesitas el texto reconocido
image_to_dataCajas por palabra + confianzaResaltar texto, filtrar palabras de baja confianza
image_to_boxesCajas por carácterGeometría a nivel de carácter
image_to_pdf_or_hocrPDF con texto o hOCRCrear PDF buscables u overlays web
image_to_osdDetección de orientación y escrituraDetectar rotación o escritura antes del OCR
image_to_alto_xmlALTO XMLPipelines de archivo o bibliotecas

Configuración: PSM, OEM, idiomas y lista de caracteres

Pasa las opciones como una cadena separada por espacios a config=.

config.py
# Un solo bloque de texto, motor LSTM, español
text = pytesseract.image_to_string(img, lang="spa", config="--oem 3 --psm 6")

# Solo dígitos (totales de recibos, lecturas de contadores)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")

# Idiomas combinados
text = pytesseract.image_to_string(img, lang="eng+spa")
PSMModoIdeal para
3Totalmente automático (predeterminado)Documentos estándar
4Una columna de tamaños variablesArtículos, páginas a una columna
6Un bloque uniforme de textoPárrafos, etiquetas
7Una sola línea de textoTitulares de una línea, campos sueltos
8Una sola palabraPalabras individuales
11Texto dispersoRecibos, texto de interfaz disperso
13Línea sin procesarUna línea sin trucos específicos

Modos OEM: --oem 1 (solo LSTM, predeterminado en v5), --oem 0 (heredado), --oem 3 (automático). Referencia completa en la documentación.

Preprocesado de imágenes

Una entrada limpia es el mayor factor de precisión. Estos son los pasos que más importan.

preprocesado.py
import cv2, numpy as np, pytesseract
from PIL import Image

image = cv2.imread("recibo.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Escala el texto pequeño a un equivalente de ~300 DPI
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

# Elimina ruido y aplica umbral Otsu a blanco y negro puro
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

text = pytesseract.image_to_string(Image.fromarray(binary))

Posiciones y puntuaciones de confianza

Usa image_to_data para obtener cajas por palabra y una confianza de 0 a 100, y filtra el ruido.

confianza.py
from pytesseract import Output

data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
    if text.strip() and float(conf) > 60:   # descarta ruido de baja confianza
        print(round(float(conf)), text)

Aplicar OCR a un PDF en Python

Tesseract trabaja con imágenes, así que primero rasteriza las páginas del PDF con pdf2image (que necesita las herramientas poppler).

pdf.py
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader

pages = convert_from_path("escaneo.pdf", dpi=300)   # requiere poppler
writer = PdfWriter()
for page in pages:
    pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
    writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("escaneo_buscable.pdf", "wb") as f:
    writer.write(f)

En Windows, pasa la carpeta bin de poppler con poppler_path=. Para un flujo más completo, consulta la documentación sobre formatos de salida.

Rendimiento

pytesseract invoca la CLI en cada llamada, así que el rendimiento depende de cómo estructures el proceso.

EnfoqueCuándoCompromiso
pytesseract por llamadaScripts y trabajos puntualesLanza un proceso por llamada — lento en bucles
Agrupar en TIFF multipáginaMuchas páginas con la misma configuraciónUn proceso para muchas páginas
multiprocessingMuchas imágenes independientesUsa todos los núcleos; más memoria
tesserocrAlto volumen, en procesoBinding nativo, más configuración

Catálogo de errores

Estos errores cubren la mayoría de problemas con pytesseract.

ErrorCausaSolución
TesseractNotFoundErrorBinario no instalado o fuera del PATHInstala el motor o define pytesseract.pytesseract.tesseract_cmd.
(-215:Assertion failed) src.type() == CV_8UC1Umbral sobre una imagen de 3 canalesConvierte con cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) primero.
Error opening data file ...fra.traineddataFalta el paquete de idiomaInstala el idioma o define TESSDATA_PREFIX.
Salida vacíaDPI bajo, PSM incorrecto o sin textoEscala, prueba --psm 6/7/11 y preprocesa.
Muy lento en bucleUn proceso por llamadaAgrupa, usa multiprocessing o tesserocr.

Medir la precisión

Mide la tasa de error de caracteres y palabras en lugar de juzgar la salida a ojo.

eval.py
import pytesseract, jiwer
from PIL import Image

hypothesis = pytesseract.image_to_string(Image.open("muestra.png"))
reference  = open("muestra.gt.txt").read()

print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))

Guarda un conjunto pequeño de imágenes representativas con su texto de referencia como pruebas de regresión y vuelve a ejecutarlas cuando cambies el preprocesado o la configuración.

Preguntas frecuentes de Python

¿Cómo uso Tesseract OCR en Python?

Instala primero el motor Tesseract y luego pip install pytesseract pillow. Abre la imagen con Pillow y llama a pytesseract.image_to_string(img).

¿Por qué aparece TesseractNotFoundError?

pytesseract no encuentra el binario. Instala el motor, ponlo en el PATH o define pytesseract.pytesseract.tesseract_cmd con la ruta completa.

¿Cómo mejoro la precisión?

Escala a ~300 DPI, escala de grises, umbral, reducción de ruido, enderezado y el --psm correcto. Usa el lang= adecuado y, para campos fijos, una lista de caracteres permitidos.

¿Cómo aplico OCR a un PDF?

Usa pdf2image (con poppler) para convertir las páginas en imágenes, ejecuta pytesseract en cada una y combínalas con image_to_pdf_or_hocr(..., extension="pdf").

¿Cómo obtengo puntuaciones de confianza?

Usa image_to_data(..., output_type=Output.DICT) y filtra por la lista conf.

¿pytesseract es lento?

Cada llamada lanza un proceso. Agrupa, usa multiprocessing o cambia al binding en proceso tesserocr para alto rendimiento.

Profundiza en el motor y el ecosistema.