Comment extraire du texte, des liens et des images de fichiers PDF à l’aide de Python

Python est un langage très polyvalent et les développeurs Python doivent souvent travailler avec une variété de fichiers et y stocker des informations pour les traiter. Un format de fichier populaire que vous rencontrerez sûrement en tant que développeur Python est le format de document portable, communément appelé PDF.

Les fichiers PDF peuvent contenir du texte, des images et des liens. Lors du traitement de données dans un programme Python, vous devrez peut-être extraire les données stockées dans un document PDF. Contrairement aux structures de données telles que les tuples, les listes et les dictionnaires, obtenir des informations stockées dans un document PDF peut sembler une tâche difficile.

Heureusement, il existe un certain nombre de bibliothèques qui facilitent l’utilisation de fichiers PDF et l’extraction des données stockées dans les fichiers PDF. Pour en savoir plus sur ces différentes bibliothèques, voyons comment extraire des textes, des liens et des images à partir de fichiers PDF. Pour suivre, téléchargez le fichier PDF suivant et enregistrez-le dans le même répertoire que votre fichier programme Python.

Pour extraire du texte de fichiers PDF à l’aide de Python, nous allons utiliser le PyPDF2 bibliothèque. PyPDF2 est une bibliothèque Python gratuite et open source qui peut être utilisée pour fusionner, recadrer et transformer les pages de fichiers PDF. Il peut ajouter des données personnalisées, des options d’affichage et des mots de passe aux fichiers PDF. Mais il est important de noter que PyPDF2 peut récupérer le texte des fichiers PDF.

Pour utiliser PyPDF2 pour extraire du texte à partir de fichiers PDF, installez-le à l’aide de pip, qui est un programme d’installation de package pour Python. pip vous permet d’installer différents packages Python sur votre machine :

1. Vérifiez si pip est déjà installé en exécutant :

pip --version

Si vous ne recevez pas de numéro de version, cela signifie que pip n’est pas installé.

2. Pour installer pip, cliquez sur obtenir un pépin pour télécharger son script d’installation.

Le lien ouvre une page avec le script pour installer pip comme indiqué ci-dessous :

Faites un clic droit sur la page et cliquez sur Enregistrer sous pour enregistrer le fichier. Par défaut, le nom du fichier est get-pip.py

Ouvrez le terminal et accédez au répertoire contenant le fichier get-pip.py que vous venez de télécharger puis exécutez la commande :

sudo python3 get-pip.py

Cela devrait installer pip comme indiqué ci-dessous :

3. Vérifiez que pip a été installé avec succès en exécutant :

pip --version

En cas de succès, vous devriez obtenir un numéro de version :

Une fois pip installé, nous pouvons maintenant commencer à travailler avec PyPDF2.

1. Installez PyPDF2 en exécutant la commande suivante dans le terminal :

pip install PyPDF2

2. Créez un fichier Python et importez PdfReader depuis PyPDF2 en utilisant la ligne suivante :

from PyPDF2 import PdfReader

La bibliothèque PyPDF2 propose une variété de classes pour travailler avec des fichiers PDF. L’une de ces classes est PdfReader, qui peut être utilisée pour ouvrir des fichiers PDF, lire le contenu et extraire du texte à partir de fichiers PDF, entre autres.

3. Pour commencer à travailler avec un fichier PDF, vous devez d’abord ouvrir le fichier. Pour ce faire, créez une instance de la classe PdfReader et transmettez le fichier PDF avec lequel vous souhaitez travailler :

reader = PdfReader('games.pdf')

La ligne ci-dessus instancie PdfReader et le prépare à accéder au contenu du fichier PDF que vous spécifiez. L’instance est stockée dans une variable appelée reader, qui devra accéder à diverses méthodes et propriétés disponibles dans la classe PdfReader.

4. Pour voir si tout fonctionne correctement, imprimez le nombre de pages du PDF que vous avez transmis en utilisant le code suivant :

print(len(reader.pages))

Sortir:

5

5. Puisque notre fichier PDF comporte 5 pages, nous pouvons accéder à chaque page disponible dans le PDF. Cependant, le comptage commence à 0, tout comme la convention d’indexation de Python. Par conséquent, la première page du fichier pdf sera la page numéro 0. Pour récupérer la première page du PDF, ajoutez la ligne suivante à votre code :

page1 = reader.pages[0]

La ligne ci-dessus récupère la première page du fichier PDF et la stocke dans une variable nommée page1.

6. Pour extraire le texte de la première page du fichier PDF, ajoutez la ligne suivante :

textPage1 = page1.extract_text()

Cela extrait le texte de la première page du PDF et stocke le contenu dans une variable nommée textPage1. Vous avez ainsi accès au texte de la première page du fichier PDF grâce à la variable textPage1.

7. Pour confirmer que le texte a été extrait avec succès, vous pouvez imprimer le contenu de la variable textPage1. L’intégralité de notre code, qui imprime également le texte sur la première page du fichier PDF, est présenté ci-dessous :

# import the PdfReader class from PyPDF2
from PyPDF2 import PdfReader

# create an instance of the PdfReader class
reader = PdfReader('games.pdf')

# get the number of pages available in the pdf file
print(len(reader.pages))

# access the first page in the pdf
page1 = reader.pages[0]

# extract the text in page 1 of the pdf file
textPage1 = page1.extract_text()

# print out the extracted text
print(textPage1)

Sortir:

Pour extraire des liens à partir de fichiers PDF, nous allons utiliser PyMuPDF qui est une bibliothèque Python permettant d’extraire, d’analyser, de convertir et de manipuler les données stockées dans des documents tels que des PDF. Pour utiliser PyMuPDF, vous devez disposer de Python 3.8 ou version ultérieure. Pour commencer:

1. Installez PyMuPDF en exécutant la ligne suivante dans le terminal :

pip install PyMuPDF

2. Importez PyMuPDF dans votre fichier Python en utilisant l’instruction suivante :

import fitz

3. Pour accéder au PDF dont vous souhaitez extraire les liens, vous devez d’abord l’ouvrir. Pour l’ouvrir, saisissez la ligne suivante :

doc = fitz.open("games.pdf")

4. Après avoir ouvert le fichier PDF, imprimez le nombre de pages du PDF en utilisant la ligne suivante :

print(doc.page_count)

Sortir:

5

4. Pour extraire les liens d’une page du fichier PDF, nous devons charger la page dont nous voulons extraire les liens. Pour charger une page, entrez la ligne suivante, où vous transmettez le numéro de page que vous souhaitez charger dans une fonction appelée load_page()

page = doc.load_page(0)

Pour extraire les liens de la première page, on passe 0(zéro). Le comptage des pages commence à zéro, tout comme dans les structures de données comme les tableaux et les dictionnaires.

5. Extrayez les liens de la page en utilisant la ligne suivante :

links = page.get_links()

Tous les liens de la page que vous avez spécifiée, dans notre cas, la page 1, seront extraits et stockés dans la variable appelée liens

6. Pour voir le contenu de la variable links, imprimez-le comme ceci :

print(links)

Sortir:

À partir de la sortie imprimée, notez que les liens de variables contiennent une liste de dictionnaires avec des paires clé-valeur. Chaque lien sur la page est représenté par un dictionnaire, le lien réel étant stocké sous la clé « uri »

7. Pour obtenir les liens de la liste des objets stockés sous les liens de nom de variable, parcourez la liste à l’aide d’une instruction for in et imprimez les liens spécifiques stockés sous la clé uri. Le code complet qui fait cela est présenté ci-dessous :

import fitz

# Open the PDF file
doc = fitz.open("games.pdf")

# Print out the number of pages
print(doc.page_count)

# load the first page from the PDF
page = doc.load_page(0)

# extract all links from the page and store it under - links
links = page.get_links()

# print the links object
#print(links) 

# print the actual links stored under the key "uri"
for obj in links:
  print(obj["uri"])

Sortir:

5
https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/

8. Pour rendre notre code plus réutilisable, nous pouvons le refactoriser en définissant une fonction pour extraire tous les liens d’un PDF et une fonction pour imprimer tous les liens trouvés dans un PDF. De cette façon, vous pouvez appeler les fonctions avec n’importe quel PDF et vous récupérerez tous les liens du PDF. Le code qui fait cela est affiché ci-dessous :

import fitz

# Extract all the links in a PDF document
def extract_link(path_to_pdf):
  links = []
  doc = fitz.open(path_to_pdf)

  for page_num in range(doc.page_count):
    page = doc.load_page(page_num)
    page_links = page.get_links()
    links.extend(page_links)
  return links

# print out all the links returned from the PDF document
def print_all_links(links):
  for link in links:
    print(link["uri"])

# Call the function to extract all the links in a pdf
# all the return links are stored under all_links
all_links = extract_link("games.pdf")

# call the function to print all links in the PDF
print_all_links(all_links)

Sortir:

https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/
https://scratch.mit.edu/
https://www.tynker.com/
https://codecombat.com/
https://lightbot.com/
https://sparkian.com

À partir du code ci-dessus, la fonction extract_link() reçoit un fichier PDF, parcourt toutes les pages du PDF, extrait tous les liens et les renvoie. Le résultat de cette fonction est stocké dans une variable nommée all_links

La fonction print_all_links() prend en compte le résultat de extract_link(), parcourt la liste et imprime tous les liens réels trouvés dans le PDF que vous avez transmis dans la fonction extract_link().

Pour extraire des images d’un PDF, nous allons toujours utiliser PyMuPDF. Pour extraire des images d’un fichier PDF :

1. Importez PyMuPDF, io et PIL. Python Imaging Library (PIL) fournit des outils qui facilitent la création et l’enregistrement d’images, entre autres fonctions. io fournit des classes pour une gestion simple et efficace des données binaires.

import fitz
from io import BytesIO
from PIL import Image

2. Ouvrez le fichier PDF dont vous souhaitez extraire les images :

doc = fitz.open("games.pdf")

3. Chargez la page à partir de laquelle vous souhaitez extraire les images :

page = doc.load_page(0)

4. PyMuPdf identifie les images d’un fichier PDF à l’aide d’un numéro de référence croisée (xref), qui est généralement un nombre entier. Chaque image d’un fichier PDF possède une xréf unique. Par conséquent, pour extraire une image d’un PDF, nous devons d’abord obtenir le numéro Xréf qui l’identifie. Pour obtenir le numéro xréf des images sur une page, on utilise la fonction get_images() comme ceci :

image_xref = page.get_images()
print(image_xref)

Sortir:

[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]

get_images() renvoie une liste de tuples contenant des informations sur l’image. Puisque nous n’avons qu’une seule image sur la première page, il n’y a qu’un seul tuple. Le premier élément du tuple représente la xréf de l’image sur la page. Par conséquent, la xréf de l’image sur la première page est 7.

5. Pour extraire la valeur xréf de l’image de la liste des tuples, nous utilisons le code ci-dessous :

# get xref value of the image
xref_value = image_xref[0][0]
print(xref_value)

Sortir:

[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
7

6. Puisque vous disposez maintenant de la xréf qui identifie une image sur le PDF, vous pouvez extraire l’image à l’aide de la fonction extract_image() comme ceci :

img_dictionary = doc.extract_image(xref_value)

Cependant, cette fonction ne renvoie pas l’image réelle. Au lieu de cela, il renvoie un dictionnaire contenant, entre autres, les données d’image binaires de l’image et les métadonnées sur l’image.

7. À partir du dictionnaire renvoyé par la fonction extract_image(), vérifiez l’extension de fichier de l’image extraite. L’extension du fichier est stockée sous la clé « ext » :

# get file extenstion
img_extension = img_dictionary["ext"]
print(img_extension)

Sortir:

png

8. Extrayez les binaires d’images du dictionnaire stocké dans img_dictionary. Les binaires des images sont stockés sous la clé « image »

# get the actual image binary data
img_binary = img_dictionary["image"]

9. Créez un objet BytesIO et initialisez-le avec les données d’image binaires qui représentent l’image. Cela crée un objet semblable à un fichier qui peut être traité par des bibliothèques Python telles que PIL afin que vous puissiez enregistrer l’image.

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

10. Ouvrez et analysez les données d’image stockées dans l’objet BytesIO nommé image_io à l’aide de la bibliothèque PIL. Ceci est important car cela permet à la bibliothèque PIL de déterminer le format d’image de l’image avec laquelle vous essayez de travailler, dans ce cas, un PNG. Après avoir détecté le format de l’image, PIL crée un objet image qui peut être manipulé avec les fonctions et méthodes PIL, telles que la méthode save(), pour enregistrer l’image sur le stockage local.

# open the image using Pillow
image = Image.open(image_io)

11. Spécifiez le chemin où vous souhaitez enregistrer l’image.

output_path = "image_1.png"

Puisque le chemin ci-dessus ne contient que le nom du fichier avec son extension, l’image extraite sera enregistrée dans le même répertoire que le fichier Python contenant ce programme. L’image sera enregistrée sous image_1.png. L’extension PNG est importante pour qu’elle corresponde à l’extension d’origine de l’image.

12. Enregistrez l’image et fermez l’objet ByteIO.

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

L’intégralité du code pour extraire une image d’un fichier PDF est présenté ci-dessous :

import fitz
from io import BytesIO
from PIL import Image

doc = fitz.open("games.pdf")
page = doc.load_page(0)

# get a cross reference(xref) to the image
image_xref = page.get_images()

# get the actual xref value of the image
xref_value = image_xref[0][0]

# extract the image
img_dictionary = doc.extract_image(xref_value)

# get file extenstion
img_extension = img_dictionary["ext"]

# get the actual image binary data
img_binary = img_dictionary["image"]

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

# open the image using PIL library 
image = Image.open(image_io)

#specify the path where you want to save the image
output_path = "image_1.png"

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

Exécutez le code et accédez au dossier contenant votre fichier Python ; vous devriez voir l’image extraite nommée image_1.png, comme indiqué ci-dessous :

Conclusion

Pour vous entraîner davantage à extraire des liens, des images et des textes à partir de PDF, essayez de refactoriser le code dans les exemples pour les rendre plus réutilisables, comme indiqué dans l’exemple de liens. De cette façon, il vous suffira de transmettre un fichier PDF et votre programme Python extraira tous les liens, images ou textes de l’intégralité du PDF. Bon codage !

Vous pouvez également explorer certaines des meilleures API PDF pour chaque besoin commercial.

x