web-dev-qa-db-fra.com

Comment convertir PDF en CSV avec tabula-py?

En Python 3, j'ai un PDF "Ativos_Fevereiro_2018_servidores_rj.pdf" avec 6 041 pages. Je suis sur une machine avec Ubuntu

Sur chaque page, il y a du texte en haut de la page, deux lignes. Et sous un tableau, avec en-tête et deux colonnes. Chaque tableau en 36 lignes, moins sur la dernière page

À la fin de chaque page, après les tableaux, il y a aussi une ligne de texte

Je veux créer un CSV à partir de ce PDF, en ne considérant que les tableaux des pages. Et ignorer les textes avant et après les tableaux

Au départ, j'ai testé le tabula-py. Mais il génère un fichier vide:

from tabula import convert_into

convert_into("Ativos_Fevereiro_2018_servidores_rj.pdf", "test_s.csv", output_format="csv")

S'il vous plaît, quelqu'un connaît-il une autre méthode pour utiliser tabula-py pour ce type de demande?

Ou une autre façon de convertir PDF en CSV dans ce type de fichier?

7
Reinaldo Chaves

Ok, j'ai trouvé le problème: vous devez définir spreadsheet=True et conserver le codage utf-8:

df = tabula.read_pdf("Ativos_Fevereiro_2018_servidores_rj.pdf", encoding='utf-8', spreadsheet=True, pages='1-6041')

Dans l'image ci-dessous, je l'ai testé avec seulement la première page (car votre fichier est énorme):

enter image description here

Vous pouvez ensuite enregistrer le DataFrame au format csv:

df.to_csv('otuput.csv', encoding='utf-8')

Modifier:

Ok, l'erreur pourrait être un problème de mémoire Java. Pour le rendre plus rapide, j'ai ajouté l'option pages. Et il y avait aussi un problème d'encodage, donc encoding='utf-8' ajouté à l'export csv. Si vous continuez à rencontrer l'erreur Java, essayez de l'analyser en morceaux, par ex. pages='1-300'. Je viens de faire tous les 6041 (sur une machine de 64 Go RAM), cela a bien fonctionné.

6
ilja