Mostrando entradas con la etiqueta pytesseract. Mostrar todas las entradas
Mostrando entradas con la etiqueta pytesseract. Mostrar todas las entradas

jueves, 16 de abril de 2026

DATOS. Limpieza de datos

Datos semi-estructurados PDF (I)

Tabla-Imagen

Con frecuencia una de las fuentes de datos estructurados son los documentos de texto, concretamente los documentos PDF. Realmente se trata de una fuente doblemente compleja: son realmente datos estructurados a nuestros ojos, pero precisan un tratamiento manual de tabulación (por ejemplo), pero están muy lejos de serlo para un ordenador, especialmente las "tablas" .pdf.

Antes de seguir y para que no queden dudas respecto al objetivo que se persigue aquí, diré que entiendo por manipulación o tratamiento de datos tabulados en documentos de texto el procedimiento cuyo objetivo último es la creación de estructuras asimilables a una tabla o base de datos que puede ser tratadamediante procedimientos de acceso y consulta a datos estructurados. Digo "objetivo último" porque realmente no siempre se puede garantizar su logro, al menos no de forma directa.

Para un tratamiento ofimático "clásico" no existe diferencia entre un documento .pdf y un documento .docx (o un documento .odt), aunque es posible manipular directamente estos últimos mediante procedimientos relativamente simples basados en los mismos servicios ofimáticos y/o en la combinación procesador-hoja de cálculo. Esta posibilidad se complica si las tablas están en un documento .pdf, pero puede ser una complicación salvable, especialmente si los datos no están sujetos a confidencialidad; si sí lo están va a depender de la suerte que tengamos en el procedo de captura de los datos: si es posible copia-pega, no vamos a tener más trabajo que si se tratara de tablas .docx (o casi), pero si no se dejan capturar de este modo no nos va a quedar más remedio que copiarlos manualmente o casi manualmente.

Pero la automatización se complica significativamente cuando la fuente radica en un documento .pdf, especialmente si estas tablas contienen información confidencial, que no es posible derivar a recursos especialidados, e incluso posiblemente las dificultades persistan en caso de optar por estos medios. De todas formas, en lo que a un SEO se refiere, ni por presupuesto ni por razones de confidencialidad podemos recurrir a ellos medios y la consecuencia es que o bien renunciamos a automatizar el acceso a estas tablas (lo más frecuente) o bien aplicamos procedimientos de automatización que sólo resuelven el problema de forma parcial y sin garantia de estar libres de error.

Deberemos, pues, estar dispuestos a realizar algún tipo de intervención ofimática complementaria como las que se explican en esta entrada. Gran parte de las dificultades se deben a la complejidad que para la digitalización tiene las tablas-pdf, las cuales que presentan diferentes comportamientos no siempre fáciles de predecir ni necesariamente invariables en el mismo documento. Es por ello que las tecnologías de automatización pueden fracasar total o parcialmente, sin que sea garantía de éxito ni la complejidad del recurso de automatización ni que sea actual.

Sobre estas cuestiones trabajaremos en posteriores entradas, pero en esta quiero presentar la opción que se viene a considerar como "el último recurso" y que resuelve parcialmente la automatización del acceso al contenido de las tablas. Me refiero a la conversión de éstas en una imagen y el posterior tratamiento de la imágen mediante técnicas OCR.

Aunque lo más ajustado a un procedimiento de automatización sería convertir automáticamente el .pdf en imagen, el coste de este procedimiento es suficientemente elevado en términos de recursos hardware y computacionales y de memoria como para que no me plantee esta opción como punto de partida, máxime cuando disponemos de un procedimiento tan sencillo como barato: crear manualmente la imagen mediante Imprimir pantalla, procedimiento este perfectamente funcional si la tarea afecta a un pequeño número de documentos. Otra cosa sería si el número de documentos fuera muy elevado y se requiera usar la fotocopiadora como scanner y replantear el trabajo como resposabilidad de equipo. En la imagen que sigue te muestro el resultado (anonimizado) de convertir en imagen la segunda tabla. De paso nos servirá para comprobar qué resulta al aplicar el procedimiento ocr

He de decir que, según IA-Gemnini existen opciones para automatizar esa captura de pantalla, pero no vamos a plantearlas ahora, optando por el procedimiento simple que presuponer un trabajo liviano sobre unos pocos documentos. De este modo nos podremos centrar en automatizar de la conversión de la tabla-imagen a texto mediante el siguiente script:


'''
Acceso a tablas convertidas en img manualmente mediante Imprimir pantalla
El script de Python usa pytesseract como OCR lo que implica tener instalado Tesseract
en el sistema.

Script desarrollado haciendo uso de IA-Gemini para mejoras de funcionamiento
implementadas a demanda específicada por el autor.

****************************************************************************************
--- FASES DEL PROCESO -------------------------
****************************************************************************************
'''

#0. Carga de bibliotecas ---------------------

import pytesseract
from PIL import Image
import os

# 1. Configuraciones y acceso a imagen -------------------------

# Configuración de Tesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Configuración de las rutas de salida
nombre_carpeta = 'tablas'
nombre_archivo_txt = 'resultado_ocr.txt'

# Obtener la ruta del directorio donde se ejecuta el script
directorio_actual = os.path.dirname(os.path.abspath(__file__))
ruta_tablas = os.path.join(directorio_actual, nombre_carpeta)

# Crear la carpeta 'tablas' si no existe
if not os.path.exists(ruta_tablas):
    os.makedirs(ruta_tablas)

# Entrada nombre o ruta de img
nombre_imagen = input("Introduce el nombre del archivo de la imagen o su ruta completa (sin comillas): ").strip()

# 2. Procesamiento de OCR -----------------------------------

# Verificamos si el archivo existe antes de continuar
if not os.path.isfile(nombre_imagen):
    print(f"Error: El archivo '{nombre_imagen}' no se encuentra en la ruta especificada.")
else:
    try:
# Iniciamos el procesamiento OCR
        img = Image.open(nombre_imagen)
        texto = pytesseract.image_to_string(img, lang='spa')

# 4. Mostrar y guardar resultado -----------------------------

# Mostrar resultado en consola
        print("\nTexto extraído con éxito:")
        print("-" * 30)
        print(texto)
        print("-" * 30)

# Guardar resultado en archivo TXT usando el nombre de la imagen original para evitar sobreescritura
        nombre_base = os.path.splitext(os.path.basename(nombre_imagen))[0]
        ruta_final_txt = os.path.join(ruta_tablas, f"{nombre_base}.txt")
        
        with open(ruta_final_txt, 'w', encoding='utf-8') as f:
            f.write(texto)
        
        print(f"Archivo guardado en: {ruta_final_txt}")

    except Exception as e:
        print(f"Ocurrió un error al procesar la imagen: {e}")

Los comentarios que acompañan al script, redactados ex-profeso, hacen innecesario su comentario, pero no lo que resulta de su aplicación.

La ventaja que tiene este (que hemos llamado) "último recurso": la conversión de la tabla-pdf en imagen, es que, si la calidad de ésta es buena (y lo debe ser al proceder directamente del texto), el OCR funciona correctamente y transforma el contenido en texto accesible desde Bloc de notas y similares, sin errores ni omisiones. La imagen que sigue muestra la captura de pantalla de ese texto en lo que respecta a la misma tabla 2 que antes mostramos en pdf-img.

Puedes observar que realmente toda la información está ahí: las etiquetas de los campos, los datos, los que sí están (y que aquí ocultamos) y los que no. Ahora bien, esta imagen también muestrar de forma clara, que el resultado se asemeja más a lo que se ve, a la apariencia de lo que se ve que a los datos que muestra: realmente lo obtenido no es una estructura etiqueta-dato, son tres líneas que contienen ciertos textos, sin diferenciar qué papel juega cada uno de ellos, ni reconocer que falta una cuarta línea. Es evidente que estamos aun lejos de haber obtenido una tabla de datos o estructura que se le parezca; llegar a ello va a requerir un tratamiento específico a posteriori.

Esto hace más necesario aun guardar lo obtenido en, por ejemplo, un archivo de texto como .txt que nos permita darle ese tratamiento, al menos de momento mediante recursos ofimáticos, ya que es la forma más básica, cierto, pero también la solución más eficiente, rápida y segura disponible por ahora. Aquí, reitero, explico cómo.

miércoles, 22 de octubre de 2025

Textos. Python.

Textos en imágenes

Obtención del texto (II)



Aunque en la entrada anterior usamos Pillow como programa de procesamiento de imágenes (con una función muy simple, por cierto: cargar la imagen), lo cierto es que lo normal es que se haga uso de OpenCV por su mayor potencia y funcionalidad, así que tendremos que incorporarlo a nuestro arsenal de recursos de automatización del acceso a textos.


Pero lo que quedó patente en la [entrada anterior] es que para lo que lo utilizamos en ese script (plenamente exitoso, por cierto), Pillow es más que suficiente, así que cuando la imagen no presente mayores dificultades y su tratamiento sea tan simple como el realizado, podemos trabajar perfectamente con esa biblioteca con total confianza. 

Otra cosa es que el tratamiento a hacer de la imagen de referencia exija actuaciones de mayor complejidad. En ese caso es posible que OpenCV ofrezca mayor rendimiento, aunque sinceramente tengo mis dudas...

En todo caso lo mejor es que también practiquemos a extraer texto de imágenes usando OpenCV. Y a ello vamos tomando como referencia esta imagen, que en principio se presenta con mayor complejidad gráfica y también con mayor utilidad (obtener el texto de páginas escaneadas de cuentos o de libros de texto o de presentaciones ppt previamente convertidas en capturas de pantalla, por ejemplo)


Este es ahora el script:

import cv2
import pytesseract

#Asociar pytesseract a Tesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Cargar imagen
img = cv2.imread("img/img3.png")

# Convertir la imagen a escala de grises
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Aplicar threshold para convertir la imagen a binario
threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Pasar la imagen al progama OCR pytesseract
text = pytesseract.image_to_string(threshold_img, lang='spa')

# Imprimir el texto extraído
print(text)

Puedes apreciar que sustituimos Pillow por OpenCV (import cv2), biblioteca que usamos para cargar la imagen (img = cv2.imread("img/img3.png")), pero también para tratarla a fin de facilitar el escaneo final...
  • Primero la convertimos a escala de grises (gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
  • Y después la convertimos a binario (threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1])
... aunque puedes comprobar que ninguna de las dos instrucciones es estrictamente necesaria y que su uso no cambia sustancialmente el resultado (que realmente es mejorable), pero lo que aquí es poco relevante, en otros contextos puede ser la diferencia entre un buen acceso al texto o un fracaso, así que bueno es saberlo, aunque ahora parezca que nos sobra.

El resto del script (no hay mucho más, pero es importante) es igual que en el script en el que usamos Pillow:
  • La conexión entre Tesseract y pytesseractpytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
  • El escaneo de la imagen (text = pytesseract.image_to_string(threshold_img, lang='spa'))
  • Y la visualización del texto en pantalla (print(text))
También en este caso obviamos el tratamiento del texto y su posible archivo como documento. Ambas tareas quedan pendientes para aplicaciones prácticas reales.

Textos. ocr de Imágenes

OCR. Textos en imágenes

Obtención de textos con Pillow

Pillow (anteriormente conocida como PIL - Python Imaging Library) es la biblioteca estándar para el procesamiento de imágenes en Python. Pillow permite realizar tareas como convertir formatos (pasar de PNG a JPEG, WebP, BMP...), manipular imágenes (cambiar tamaño, recortar, rotar y voltear imágenes) y la mejora de imágenes (ajustar brillo, contraste, color y nitidez). También permite la edición de imágenes: aplicar filtros (desenfoque, realce de bordes), añadir texto y dibujar formas geométricas.

De todo esto hablamos en la sección Medios AV (por lo que no voy a incluir aquí enlaces a la documentación de la biblioteca), pero aquí vamos a hablar de una funcionalidad tal vez marginal para esta biblioteca, pero interesante: su colaboración en script orientados a la recuperación de texto en imágenes.

Ahora te supongo dispuesto a obtener texto alguna imagen con la que te interes trabajar, pero con el software ya correctamente instalado, incluyendo tesseract.exe y las bibliotecas PyTesseract y Pillow. Con todo esto preparado vamos a practicar la extracción de texto de una imágen como la siguiente.

Como ves se trata de una imágen que reproduce un documento de la que pretendemos obtener el texto que contiene para visualizarlo por pantalla, para lo que vamos a emplear este script Python



import pytesseract
from PIL import Image
#Es necesario incluir la ruta a Tesseract para trabajar con pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# Cargar la imagen con Pillow
img = Image.open('img/img_txt.jpg')
# Extraer texto
texto = pytesseract.image_to_string(img, lang ='spa')
#Escribir el texto en pantalla
print(texto)


Como ves es un script muy simple en el que, además del módulo pytesseract también usa la bibioteca Pillow, concretamente su módulo básico (from PIL import Image), necesario para cargar la imagen (img = Image.open('img/img_txt.jpg')). Pero fíjate (y es muy importante) que previamente deberemos incluir una instrucción que comunique pytesseract con Tesseract (existen otras opciones, pero esta es la más sencilla). De no hacerlo no funcionará el script y no obtendremos el texto.

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

Te recomiendo que identifiques la ubicación de Tesseract en tu ordenador (será una dirección muy similar a la mía) y la copies al inicio de tus script.

Esta instrucción texto = pytesseract.image_to_string(img, lang ='spa') es clave en este script, ya que emplea la función pytesseract image_to_string() que requiere dos parámetros, la imagen sobre la que trabajar y el idioma a aplicar (recuerda que en la instalación de Tesseract seleccionaste una serie de idiomas para aplicar OCR), que en nuestro caso es el español (lang ='spa'). Ahora resta visualizar el texto print(texto), aunque en una situación real podríamos necesitar alguna mejora de su legibilidad y posteriormente archivarlo en un documento (txt,por ejemplo).

DATOS. OCR

Textos en imágenes

Obtención de textos mediante OCR

El desafío actual consiste en extraer el texto que contiene una imagén, con independencia de la naturalez de esa imagen, aunque lo más común será un documento fotocopiado y convertido a formato digital, generalmente en formato .pdf. En este caso, aparentemente estamos en la misma situación que ya afrontamos al trabajar con tablas y párrafos de texto .pdf, pero en realidad nos encontramos en la misma situación que ya provocamos como "último recurso" para la extracción de datos de tablas-pdf: lo que tenemos delante no es un texto, es una imagen, por lo que deberemos aplicar técnicas OCR.

Esta situación es bastante frecuente en el manejo de documentos por parte del SEO y afortunadamente el tratamiento mediante OCR es hoy muchos más eficiente que en los principios de la generalización de los medios informáticos, siempre y cuando, claro está, la imagen sea de calidad y el texto legible.

Una de las soluciones Python incorpora un software OCR llamado Tesseract mediante una biblioteca específica de ese lenguaje llamada pytesseract, cuya web oficial tienes en este enlace.

Te recomiendo que te tomes las cosas con calma y que consultes ambas webs antes de proceder a la instalación del software; esto es especialmente necesario para el OCR, ya que su instalación requiere cierto cuidado y debe ser previa a la de la biblioteca de Python. Pero merece la pena el esfuerzo: los resultados son muy satisfactorio y a coste 0.