Trabajando en tablas en pdf usando python.

Estoy trabajando en un archivo pdf. Hay un número de tablas en ese pdf.
De acuerdo con los nombres de las tablas que figuran en el pdf, quise obtener los datos de esa tabla usando python.

He trabajado en html, xlm parsing pero nunca con pdf.
¿Alguien puede decirme cómo obtener tablas de pdf usando python?

Creo que necesitas una biblioteca de analizador de python. El más famoso es el PDFMiner .

Según la documentación:

PDFMiner es una herramienta para extraer información de documentos PDF. A diferencia de otras herramientas relacionadas con PDF, se enfoca completamente en obtener y analizar datos de texto. PDFMiner le permite a uno obtener la ubicación exacta del texto en una página, así como también otra información como fonts o líneas. Incluye un conversor de PDF que puede transformar archivos PDF en otros formatos de texto (como HTML). Tiene un analizador de PDF extensible que se puede usar para otros fines que no sean el análisis de texto.

Recientemente tuve un problema similar y escribí una biblioteca para ayudar a resolverlo: pdfquery .

PDFQuery crea un árbol de elementos desde el PDF (usando pdfminer, con algo de azúcar adicional) y le permite obtener elementos de la página utilizando los selectores JQuery o XPath, basados ​​principalmente en el contenido del texto o la ubicación de los elementos. Entonces, para analizar una tabla, primero debe encontrar dónde está en el documento buscando la etiqueta:

label = pdf.pq(':contains("Name of your table")') left_corner = float(label.attr('x0')) bottom_corner = float(label.attr('y0')) 

Luego seguirías buscando líneas debajo de la tabla, hasta que la búsqueda no arrojara resultados:

 page = label.closest('LTPage') while 1: row = pdf.extract( [ ('column_1', ':in_bbox("%s,%s,%s,%s")' % (left_corner+10, bottom_corner+40, left_corner+50, bottom_corner+20)), ('column_2', ':in_bbox("%s,%s,%s,%s")' % (left_corner+50, bottom_corner+40, left_corner+80, bottom_corner+20)) ], page) if not row['column_1'] or row['column_2']: break print "Got row:", matches bottom_corner -= 20 

Esto supone que sus filas tienen 20 pts de altura, la primera comienza 20 pts por debajo de la etiqueta, la primera columna se extiende de 10 a 50 puntos desde el borde izquierdo de la etiqueta y la segunda columna se extiende de 50 a 80 pts desde la izquierda borde de la etiqueta.

Si tiene líneas en blanco o líneas con alturas variables, esto se volverá más molesto. También es posible que necesite usar la opción merge_tags = Ninguna para seleccionar caracteres individuales en lugar de palabras, si las entradas en la tabla son lo suficientemente cercanas para que el analizador piense que es solo una línea. Pero espero que esto te acerque más …

Este es un problema muy complejo y no solucionable en general.

La razón de esto es simplemente que el formato PDF es demasiado flexible. Algunos archivos PDF son solo mapas de bits (tendría que hacer su propio OCR en ese momento, obviamente no es nuestro tema aquí), algunos son un montón de cartas que se reparten literalmente en las páginas; esto significa que al analizar la información de texto en el PDF puede obtener caracteres individuales en algunas coordenadas. En algunos casos, estos vienen de manera ordenada (línea por línea, de izquierda a derecha), pero en algunos casos obtendrás distribuciones bastante aleatorias, más comúnmente con y cosas, pero también caracteres especiales, caracteres de una fuente diferente, etc. Puede salir de la línea.

El único enfoque adecuado es colocar todos los caracteres según sus coordenadas en un modelo de página y luego usar heurísticas para averiguar cuáles son las líneas.

Propongo echar un vistazo a sus archivos PDF y las tablas que desea analizar antes de comenzar. Tal vez sean iguales todo el tiempo y sean fáciles de analizar.

¡Buena suerte!

Puede usar Camelot para extraer datos tabulares de su PDF y exportarlos a su formato favorito. Actualmente; CSV, Excel, JSON y HTML son compatibles. Puede consultar la documentación en: http://camelot-py.readthedocs.io . Sería útil si pudiera publicar un enlace a su PDF. Aquí hay un ejemplo de código genérico:

 >>> import camelot >>> tables = camelot.read_pdf('file.pdf') >>> type(tables[0].df)  >>> tables[0].to_csv('file.csv') 

Descargo de responsabilidad: Soy el autor de la biblioteca.