💡 Si quieres ver el código de este proyecto, consulta mi repositorio: https://github.com/sasha-korovkina/pdfUnderlinedExtractor
La extracción de datos PDF puede ser un verdadero dolor de cabeza, y se vuelve aún más complicado cuando intentas capturar texto subrayado; lo creas o no, no existen soluciones ni bibliotecas que manejen esto de manera inmediata. Pero no te preocupes, estoy aquí para mostrarte cómo abordar esto.
La teoría
La extracción de texto subrayado de archivos PDF puede seguir diferentes caminos. Podría considerar usar OCR para detectar componentes de texto con líneas inferiores o profundizar en las capacidades de marcado de PyMuPDF. Sin embargo, descubrí que el OCR tiende a fallar y sufre de inconsistencia y baja precisión. PyMuPDF tampoco es mi favorito: exige un delicado ajuste de parámetros, lo que requiere mucho tiempo. Además, una configuración incorrecta podría perder una gran cantidad de datos.
Es importante recordar que los PDF son:
- Datos no estructurados: Los elementos del PDF a menudo carecen de agrupación o categorización, lo que complica los esfuerzos de búsqueda sistemática en el contenido.
- Reconocimiento de formato de texto: Detectar formatos de texto específicos, como negrita o subrayado, es muy difícil en archivos PDF, ya que la mayoría de las bibliotecas de Python no admiten esta capacidad de manera efectiva.
Pero no temas, ya que tenemos una estrategia para resolver esto.
La estrategia
- Convierta el PDF a XML estructurado: comience transformando el documento PDF a un formato XML estructurado para facilitar la manipulación de datos.
- Extraer componentes deseados: Identificar y aislar los componentes específicos del XML que sean relevantes para nuestras necesidades.
- Utilice OCR (reconocimiento óptico de caracteres) en las coordenadas extraídas para obtener los datos del texto subrayado como una matriz.
- Extraer y generar texto subrayado: finalmente, extraiga el texto subrayado del documento y muestre o imprima los resultados.
El código
- PDF a XML
Usaremos el consulta pdf Library, el conversor de PDF a XML más completo que he encontrado.
2. Estudiando el XML
El XML tiene algunos componentes clave que nos interesan:
- LTRect — A veces, la biblioteca analiza el texto subrayado como un rectángulo de ancho mínimo debajo del texto.
- Línea LT — otras veces, reconocería el contorno como un componente de línea independiente.
Ejemplo de componente LTrect:
<LTRect y0="563.787" y1="629.964" x0="367.942" x1="473.826" width="105.884" height="66.178" bbox="[367.942, 563.787, 473.826, 629.964]" linewidth="0" pts="[[367.942, 629.964], [473.826, 629.964], [473.826, 563.787], [367.942, 563.787]]">
Por lo tanto, al convertir todo el documento al formato XML, podemos replicar su estructura como componentes XML. ¡Hagamos precisamente eso!
Replicación de estructuras
Ahora, recrearemos la estructura de nuestro documento como coordenadas del cuadro delimitador. Para hacer esto, analizaremos el XML para definir la página, los cuadros de componentes, las líneas y los rectángulos, y luego los dibujaremos todos en nuestro lienzo en 3 colores diferentes.
Aquí está nuestro PDF inicial, ha sido generado en Microsoft Word, exportando un documento con algunos subrayados al formato de archivo PDF:
Después de aplicar el algoritmo anterior, aquí está la representación visual que obtenemos:
Esta imagen representa la estructura de nuestro documento, donde el cuadro negro se usa para describir todos los componentes de la página y el azul se usa para describir los elementos LTRect, de ahí el texto subrayado.
Superposición de texto
Ahora, visualicemos todo el texto dentro del PDF en sus respectivas posiciones, con la siguiente línea de código:
can.drawString(text_x, text_y, text)
Aquí está el resultado:
Tenga en cuenta que el texto no está exactamente donde estaba en el documento original, debido a la diferencia de tamaño y fuente del lenguaje de marcado en la biblioteca pdfquery.
Extracción coordinada
Como resultado de nuestro XML, tendremos una matriz de coordenadas de regiones subrayadas, en mi caso lo he llamado texto_subrayado.
Extracción de texto
Aquí está el proceso:
- Identificamos los rectángulos de coordenadas como se determinó previamente.
- Extraemos estos apartados del PDF.
- Aplicamos Tesseract OCR para extraer texto de cada sección extraída.
Este método de extraer texto de archivos PDF utilizando rectángulos de coordenadas y Tesseract OCR es eficaz por varias razones:
- Precisión en la extracción de texto: Al identificar rectángulos de coordenadas específicos, el proceso se dirige solo a áreas relevantes del PDF. Este enfoque centrado evita el procesamiento innecesario de todo el documento y reduce los errores relacionados con la extracción de texto no deseado.
- Eficiencia: Extraer secciones predefinidas directamente del PDF es mucho más rápido que procesar el documento completo. Este método ahorra tiempo y recursos computacionales, lo que es particularmente útil cuando se trata de documentos grandes.
- Precisión con OCR: Tesseract OCR es una sólida herramienta de reconocimiento óptico de caracteres que puede convertir imágenes de texto en texto legible por máquina. Al alimentarlo con secciones precisas de texto, puede funcionar con mayor precisión, ya que se ocupa de menos ruido de fondo y problemas de formato que podrían confundir el proceso de OCR en documentos más grandes y no segmentados.
Y este es el código:
Asegúrese de tener Tesseract instalado en su sistema antes de ejecutar esta función. Para obtener instrucciones detalladas, consulte su guía de instalación oficial aquí: https://github.com/tesseract-ocr/tessdoc/blob/main/Installation.md o en mi repositorio de GitHub aquí: https://github.com/sasha-korovkina/pdfUnderlinedExtractor.
Poniendolo todo junto…
Ahora, si tomamos cualquier archivo PDF, como este archivo de ejemplo:
Tenemos algunas palabras subrayadas en este archivo:
Después de ejecutar el código descrito anteriormente, esto es lo que obtenemos:
¡Después de obtener esta matriz, puede usar estas palabras para su posterior procesamiento!
¡Disfruta usando este script! Me encantaría conocer cualquier aplicación creativa que se te ocurra o si te gustaría contribuir. ¡Hágamelo saber! ❤️