La mejor librería OCR de Python depende de cómo sean tus imágenes. Con texto impreso limpio, recto y de alta resolución, Tesseract, EasyOCR y PaddleOCR devolvieron un texto prácticamente perfecto en nuestra prueba, así que ahí la elección es cuestión de tamaño de instalación y de velocidad. Se diferencian cuando la entrada se complica: baja resolución, rotación, ruido o dos columnas.
El OCR, reconocimiento óptico de caracteres, convierte imágenes de texto en texto que un programa puede usar. Lo necesitas cuando las palabras que quieres son píxeles y no caracteres: un contrato escaneado, la foto de un recibo, una captura de pantalla o un PDF hecho a partir de un escaneo. Si puedes seleccionar y copiar el texto de tu PDF, ya tiene capa de texto y no necesitas OCR, porque un parser lee esa capa directamente. Se usa el OCR para hacer buscables los escaneos, para dar texto a un modelo de lenguaje o para sacar valores de facturas y formularios.
Esta página ejecuta las tres sobre las mismas imágenes sintéticas, muestra el código y dice qué medimos y qué no.
Qué necesitas
- Python 3.10 o superior.
- Unas cuantas imágenes tuyas, a ser posible ficticias o de ejemplo, porque los ejemplos imprimen el texto reconocido y el texto de documentos reales de clientes puede acabar en la terminal y en los registros de trabajo. Incluye las más feas que recibas. Las imágenes limpias hacen que cualquier librería parezca buena.
- Un entorno virtual por librería, porque EasyOCR y PaddleOCR traen cada una un framework grande (PyTorch y PaddlePaddle).
- Para Tesseract, el propio programa Tesseract y no solo el envoltorio de Python. En macOS:
brew install tesseract.
pip install pytesseract pillow # entorno 1, más el programa Tesseract
pip install easyocr # entorno 2
pip install paddlepaddle paddleocr # entorno 3Paso 1. Ejecuta cada librería sobre una imagen
Tesseract, mediante su envoltorio de Python pytesseract:
import pytesseract
from PIL import Image
print(pytesseract.image_to_string(Image.open("scan.png"), lang="eng"))EasyOCR, que descarga unos 108 MB de modelos en la primera llamada:
import easyocr
reader = easyocr.Reader(["en"], gpu=False)
print(" ".join(reader.readtext("scan.png", detail=0)))PaddleOCR, que descarga unos 133 MB en la primera llamada. Esta es la API 3.x, y desactivamos sus tres módulos opcionales de preprocesado para probar el pipeline básico de detección y reconocimiento:
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang="en", use_doc_orientation_classify=False,
use_doc_unwarping=False, use_textline_orientation=False)
for r in ocr.predict("scan.png"):
print(" ".join(r["rec_texts"]))Qué probamos
Generamos 13 imágenes con Pillow en Arial a partir de un texto conocido: un párrafo limpio a 300 DPI, el mismo texto a 100 y a 50 DPI, girado 3, 15 y 90 grados, con mucho ruido y desenfoque, con bajo contraste, en dos columnas, un párrafo en español con acentos y líneas de factura, dos tipos de letra que parecen manuscritos y una tabla pequeña. Puntuamos cada salida como uno menos la distancia de edición al texto real dividida por su longitud, de modo que 1,0 es una copia perfecta. Versiones: Tesseract 5.5.3, EasyOCR 1.7.2, PaddleOCR 3.7.0.
Son imágenes fáciles por construcción, generadas en un Mac con Apple Silicon sin GPU. Tómalo como una forma de ver cómo falla cada librería, no como un benchmark.
Qué vimos
| Imagen | Tesseract | EasyOCR | PaddleOCR |
|---|---|---|---|
| Limpia, 300 DPI | 1,000 | 1,000 | 1,000 |
| Limpia, 100 DPI | 0,995 | 0,979 | 0,989 |
| Limpia, 50 DPI | 0,505 | 0,245 | 0,957 |
| Girada 3 grados, ruido y desenfoque | 0,989 | 0,479 | 1,000 |
| Girada 15 grados | 0,000 | 0,223 | 1,000 |
| Girada 90 grados | 0,165 | 0,096 | 0,106 |
| Mucho ruido y desenfoque | 0,000 | 0,202 | 0,851 |
| Bajo contraste | 1,000 | 0,989 | 1,000 |
| Dos columnas | 0,489 | 0,489 | 0,489 |
| Español y líneas de factura | 0,993 | 0,993 | 1,000 |
| Tabla pequeña, leída como texto | 0,227 | 0,943 | 1,000 |
Con texto limpio, la elección es cuestión de peso
Las tres leyeron perfectamente el párrafo limpio a 300 DPI. Tesseract tardó de 0,1 a 0,3 segundos por imagen en nuestra máquina frente a 1 a 5 segundos de las otras, y su entorno ocupaba unos 36 MB frente a unos 800 MB de EasyOCR y PaddleOCR, además del programa Tesseract. La primera ejecución de EasyOCR y de PaddleOCR también tardó unos 52 segundos cada una, porque descargan modelos.
Tesseract es sensible a la calidad de la entrada
Con 15 grados de rotación y con mucho ruido y desenfoque, Tesseract no devolvió nada útil (0,000), y a 50 DPI obtuvo 0,505, mientras que PaddleOCR obtuvo 1,000, 0,851 y 0,957 con las mismas imágenes. La propia documentación de Tesseract dice lo mismo: funciona mejor a 300 DPI o más, y la inclinación reduce de forma significativa la calidad de la segmentación de líneas. No probamos el preprocesado, como enderezar o ampliar la imagen, que es justo lo que recomienda su documentación, así que las cifras son con la entrada sin tratar. Tesseract además detectó correctamente la rotación de 90 grados con su detección de orientación, de modo que un paso de giro resolvería ese caso.
EasyOCR pierde el orden de lectura con líneas ruidosas
EasyOCR obtuvo 0,479 en el párrafo ligeramente girado y desenfocado, sobre todo porque devolvió los fragmentos de línea en un orden equivocado y no porque los leyera mal. También obtuvo 0,245 a 50 DPI y 0,202 con mucho ruido. Su última versión es de septiembre de 2024 en el momento de escribir esto.
Ninguna resuelve el diseño de página
Las tres leyeron las dos columnas línea a línea, mezclando el texto de la izquierda y el de la derecha, así que el contenido estaba completo pero el orden era incorrecto (0,489 en las tres). Ninguna devuelve la estructura de una tabla, solo texto. El modo por defecto de Tesseract devolvió una sola fila de la tabla. Si tu trabajo son tablas o documentos de varias columnas, estas librerías te dan texto, no estructura.
El español necesita configuración
La instalación de Tesseract con Homebrew trae solo inglés. Solo con inglés obtuvo 0,967 en el párrafo en español pero perdió nueve palabras con acento, entre ellas número, Málaga y dirección, un fallo que la puntuación global esconde. Añadir el archivo de idioma español (spa.traineddata, unos 2,3 MB del repositorio tessdata_fast) lo arregló, con 0,993 y sin palabras con acento perdidas. PaddleOCR y EasyOCR perdieron ninguna y una, respectivamente.
Lo que no probamos
No probamos manuscritos reales: los dos tipos de letra que usamos solo lo parecen, así que no sacamos ninguna conclusión. La FAQ de Tesseract dice que el manuscrito no funcionará muy bien porque está diseñado para texto impreso, y el README de EasyOCR lista el manuscrito como algo futuro. No probamos escaneos reales, preprocesado, velocidad en GPU ni alfabetos no latinos.
Compruébalo con tus propias imágenes
Anota el texto que esperas y calcula la misma puntuación con tus archivos. La función informa de un número por imagen y nunca imprime el texto, así que su salida es segura para registrar.
def edit_distance(a: str, b: str) -> int:
prev = list(range(len(b) + 1))
for i, ca in enumerate(a, start=1):
cur = [i]
for j, cb in enumerate(b, start=1):
cur.append(min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (ca != cb)))
prev = cur
return prev[-1]
def accuracy(expected: str, got: str) -> float:
expected, got = " ".join(expected.split()), " ".join(got.split())
return 1 - edit_distance(expected, got) / max(len(expected), 1)Notas de instalación y licencia
Las tres tienen licencia Apache 2.0. PaddleOCR 3.7.0 se publicó en junio de 2026 y EasyOCR 1.7.2 en septiembre de 2024. EasyOCR indica más de 80 idiomas y recomienda una GPU sin exigirla, y el README de PaddleOCR indica más de 100 idiomas y compatibilidad con CPU y GPU. Tesseract admite más de 100 idiomas y no necesita GPU.
Para comparar estas librerías con las API de OCR gestionadas en coste, consulta API de OCR o código abierto. Para probar la precisión con tus propios archivos, consulta ¿Es Tesseract lo bastante preciso para producción?.
Cuándo no bastan estas librerías: anyformat
Devuelven texto. Cuando necesitas campos tipados (un número de factura, un total), estructura para las tablas o una puntuación de confianza sobre la que actuar, necesitas una capa encima: tu propio código de extracción o un servicio de procesamiento de documentos. anyformat es uno de estos últimos; devuelve campos tipados con una puntuación de confianza y el texto original y la página. No la ejecutamos en esta comparación, así que esta página no afirma nada sobre cómo puntúa con estas imágenes.
Preguntas frecuentes
¿Cuál es la mejor librería OCR de Python?
Depende de las imágenes. Con texto impreso limpio a 300 DPI, Tesseract, EasyOCR y PaddleOCR fueron igual de precisas en nuestra prueba, y Tesseract fue la más ligera y rápida. Con imágenes giradas, con ruido o de baja resolución, PaddleOCR obtuvo la puntuación más alta en nuestra prueba sin preprocesado.
¿Es Tesseract mejor que EasyOCR?
Con texto limpio empataron. Tesseract fue más rápida y ligera, y EasyOCR lo hizo mejor con la tabla pequeña leída como texto, pero perdió el orden de lectura con el párrafo girado y desenfocado. Ninguna devuelve la estructura de la tabla.
¿Necesito una GPU para hacer OCR en Python?
No. Ejecutamos las tres en CPU. EasyOCR dice que se recomienda una GPU pero no es obligatoria, y PaddleOCR admite las dos. No medimos la velocidad en GPU.
¿Por qué Tesseract se salta los acentos en español?
La instalación por defecto de Homebrew incluye solo inglés. Añade el archivo de idioma español y pasa lang="spa".
¿Pueden estas librerías leer manuscritos?
No probamos manuscritos reales. La FAQ de Tesseract dice que está diseñada para texto impreso.







