1
votes

Est-il possible d'extraire un tableau spécifique au format à partir d'un PDF?

J'essaie d'extraire un tableau spécifique d'un pdf, le pdf ressemble à l'image ci-dessous

 entrez la description de l'image ici

J'ai essayé avec différentes bibliothèques sur python,

Avec tabula-py

pdf_file = open("./tmp/pdf/Food Calories List.pdf", 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
        
data = page_content
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
        
aux = page_content
df = pd.DataFrame([x.split(';') for x in aux.split('\n')])

Avec PyPDF2

from tabula import read_pdf
from tabulate import tabulate 
df = read_pdf("./tmp/pdf/Food Calories List.pdf")
df

Même avec textract et belle soupe, le problème auquel je suis confronté est que le format de sortie est un gâchis, y a-t-il un moyen d'extraire cette table avec un meilleur format?

p>


0 commentaires

3 Réponses :


3
votes

Je soupçonne que les problèmes proviennent du fait que le tableau a fusionné des cellules (à gauche) et que la lecture des données d'un tableau ne fonctionne que lorsque les lignes et les cellules sont cohérentes plutôt que certaines fusionnées et d'autres non.

Je sauterais les deux premières colonnes, puis les recréerais / les remplirais sur le côté gauche une fois que la table est chargée (en tant que dataframe pandas par exemple).

Ensuite, vous pouvez avoir une étiquette par ligne et travailler avec les données de manière cohérente, sinon vos cellules par colonne seront numérotées de manière incohérente.


0 commentaires

0
votes

Je souhaiterais utiliser des modèles de tabula que vous pouvez générer dynamiquement en fonction de l'emplacement des mots sur la page. Cela donnera au tableau plus de conseils sur la zone à considérer et conduira à une extraction plus précise. Voir tabula.read_pdf_with_template comme documenté ici: https://tabula-py.readthedocs.io/en/latest/tabula.html#tabula.io.read_pdf_with_template .


0 commentaires

0
votes

Camelot peut être une autre bibliothèque Python à essayer. Ses paramètres avancés semblent apparaître qu'il peut gérer les cellules fusionnées. Cependant, cela nécessitera probablement quelques ajustements de certains paramètres tels que copy_text et shift_text.

Remarque : Camelot ne peut lire que les tableaux textuels. Si le tableau se trouve à l'intérieur d'une image, il ne pourra pas l'extraire.

Si ce qui précède ne pose pas de problème, essayez l'exemple de code ci-dessous:

import camelot
tables = camelot.read_pdf('./tmp/pdf/Food Calories List.pdf', pages='1', copy_text=['v'])
print(tables[0].df)


0 commentaires