es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo extraer datos de un archivo PDF desordenado sin formato estándar.

Estoy trabajando en este archivo PDF para extraer los datos tabulares de él. Esperaba poder usar tabula o PyPDF2 para extraer las tablas, pero los datos en el PDF no están almacenados en tablas. Por lo tanto, elegí pdfplumber para extraer el texto. Hasta ahora, puedo leer el texto línea por línea. Pero no puedo encontrar un patrón universal que pueda usar para extraer las filas de la lista de precios, que luego puedo almacenar en un dataframe de pandas y escribir en un archivo de Excel.

¿Puedes ayudarme a determinar si debería construir una expresión regular u otra cosa que pueda usar para extraer la lista de precios de este PDF? Porque no se me ocurre ninguna expresión regular en particular que se adapte a la naturaleza desordenada de los datos dentro del PDF, ¿hay algún enfoque mejor para tomar? ¿O simplemente no es posible?

Código:

Con el siguiente código, puedo extraer todas las líneas de texto, pero el problema es que una entrada de precio se extiende en dos filas. Si considero que la fila actual es donde se enumeran la mayoría de los detalles sobre la entrada, ¿cómo puedo determinar si la fila anterior o la siguiente también tiene información relacionada con la entrada actual?

Si pudiera averiguar eso de alguna manera, ¿cuál sería el enfoque correcto para manejar los valores de las columnas? Pueden haber de 6 a 13 valores por línea, ¿cómo puedo determinar si en esta ubicación particular de la línea actual se encuentra el valor de la columna?

import pdfplumber as scrapper

text = []
with scrapper.open('./report.pdf') as pdf:
    for page in pdf.pages:
        text.append(page.extract_text())

El archivo PDF con el que estoy trabajando:
https://drive.google.com/file/d/1GtjBf9FcKJCOJVNcGA9mvAshJ6t0oFca/view?usp=sharing

Imágenes de muestra que demuestran qué datos deben ajustarse en qué campos:
Imagen 1
Imagen 2
Imagen 3

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en python, dataframe, pdf, pdf-scraping y pdfplumber, aquí tienes mi consejo para analizar datos tabulares de un archivo PDF usando pdfplumber:

    En primer lugar, extraer el texto línea por línea usando pdfplumber es un buen enfoque para obtener los datos de un archivo PDF. Como mencionaste, los datos no se almacenan en tablas, por lo que el uso de expresiones regulares puede no ser la mejor opción aquí.

    Para extraer las filas de la lista de precios, deberás identificar algunos patrones únicos que puedan distinguir entre las filas de la lista de precios y otros textos. Según las imágenes de muestra que proporcionaste, parece que las filas de la lista de precios tienen los siguientes patrones:

    • Comienzan con un nombre de producto en negrita o con un tamaño de fuente mayor que el resto del texto.
    • Tienen varias columnas por fila, que incluyen el nombre del producto, su descripción, la cantidad, el precio unitario y el costo total.
    • Las columnas están separadas por espacios, pero algunas columnas pueden estar distribuidas en dos filas.
    • La última fila de cada sección tiene un costo total.

    Teniendo en cuenta estos patrones, puedes escribir un código que reconozca las filas de la lista de precios buscando texto en negrita o con un tamaño de fuente mayor o un conjunto específico de palabras clave como “Cantidad” y “Total”. Una vez que hayas identificado las filas de la lista de precios, puedes dividir el texto en columnas basándote en los espacios y asignar los valores a la columna correcta en un dataframe de pandas.

    Para solucionar el problema de que una entrada de precio se distribuya en dos filas, puedes mantener un registro de la fila anterior y compararla con la fila actual para ver si forman parte de la misma entrada. Puedes crear una nueva fila para cada entrada única y si un valor de columna se distribuye en dos filas, puedes concatenarlos.

    Finalmente, puedes escribir el dataframe de pandas en un archivo de Excel usando la función to_excel().

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.