J'essaie d'extraire un tableau spécifique d'un pdf, le pdf ressemble à l'image ci-dessous
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>
3 Réponses :
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.
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 .
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)