Mis a jour le 2025-04-14, 12:10

Lecture de pdf

On peut utiliser le package pdfplumber, surtout intéressant pour récupérer des tableaux à partir d'un pdf.
Pour ouvrir un fichier :
  • import pdfplumber pour utiliser le package
  • puis :
    with pdfplumber.open(myFile) as pdf:
      pages = pdf.pages
        
  • pdf.pages renvoie une liste d'objets pdfplumber.page.Page
  • pdf.metadata : renvoie un dictionnaire de propriétés du pdf
Propriété des objets Page :
  • myPage.page_number : le numéro de page
  • myPage.extract_text() : extrait tout le texte brut de la page.
  • myPage.chars, myPage.lines, myPage.rects, myPage.curves, myPage.images, myPage.figures, myPage.annos, myPage.hyperlinks : renvoie à chaque fois une liste d'objets qui sont en fait des dictionnaires avec des propriétés dépendant du type.
myPage.chars :
  • chaque élément correspond à un caractère unique de la page.
  • myChar['text'] : le caractère (comme "A")
  • fontname, size, height, width : caractéristique du caractère.
  • x0, x1, y0, y1, top, bottom, doctop : positionnement du caractère dans la page.
  • adv, upright, object_type : autres propriétés.
myPage.lines :
  • ce sont les lignes dessinées.
  • height, width, linewidth : propriétés de la ligne.
  • x0, x1, y0, y1, top, bottom, doctop : positionnement de la ligne
myPage.rects :
  • ce sont les rectangles dessinés.
  • height, width, linewidth : propriétés du rectangle.
  • x0, x1, y0, y1, top, bottom, doctop : positionnement du rectangle
myPage.curves :
  • ce sont les courbes dessinés.
  • points : les points sous forme d'une liste (x, top)
  • height, width, linewidth : dimensions de la courbe.
  • x0, x1, y0, y1, top, bottom, doctop : positionnement de la courbe
Transformer une page en image :
  • myImage = myPage.to_image(resolution = 400) : génère un objet pdfplumber.display.PageImage
  • on peut sauver cet objet dans un fichier : myImage.save('myFile.png')
On peut ainsi extraire les images :
  • récupération des propriétés d'une image : myImage = myPage.images[0]
  • récupération de la zone de cette image : bbox = (myImage['x0'], myPage.height - myImage['y1'], myImage['x1'], myPage.height - myImage['y0'])
  • cropping de la zone et sauvegarde comme image : myPage.crop(bbox).to_image(resolution = 400).save(myFile.png')
Extraction des tables (par analyse des lignes de séparation et aussi de l'alignment des mots :
  • myPage.extract_tables() : renvoie une liste de tables, chaque table étant une liste (row) de listes (cellules).
  • attention, quand une case est vide, c'est None qui est présent (c'est le cas si par exemple dusion de cellules ou de colonnes)
  • myPage.extract_table() : renvoie la plus grande table de la page.
  • on peut passer à extract_tables un dictionnaire de settings qui permet d'adapter la stratégie de détermination des tables (le défaut pour vertical_strategy et horizontal_strategy est "lines", ce qui veut dire se baser uniquement sur les lignes
Dans un pdf :
  • les mesures dans un pdf sont en points, avec 1 point = 1/72 inch et 1 inch = 2.54 cm
  • le texte est sous forme de boites positionnées, chacune comportant un mot, mais pas de relation logique entre les mots (et si mot séparé sur 2 lignes, 2 boites dans relation logique).

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert