Travailler avec des fichiers PDF en Python

Travailler avec des fichiers PDF en Python

Vous devez tous savoir ce que sont les PDF. En fait, ils constituent l’un des médias numériques les plus importants et les plus utilisés. PDF signifie Format de document portable . Il utilise .pdf extension. Il permet de présenter et d'échanger des documents de manière fiable, indépendamment du matériel logiciel ou du système d'exploitation.
Inventé par Adobe PDF est désormais un standard ouvert maintenu par l'Organisation internationale de normalisation (ISO). Les PDF peuvent contenir des liens et des boutons, des champs de formulaire, de la vidéo audio et une logique métier.
Dans cet article, nous apprendrons comment effectuer diverses opérations telles que :
 

  • Extraire du texte d'un PDF
  • Rotation des pages PDF
  • Fusionner des PDF
  • Fractionner un PDF
  • Ajout d'un filigrane aux pages PDF

Installation: Utiliser des scripts Python simples !
Nous utiliserons un module tiers pypdf.
pypdf est une bibliothèque Python construite comme une boîte à outils PDF. Il est capable de :
 

  • Extraction des informations du document (titre auteur…)
  • Fractionner les documents page par page
  • Fusionner des documents page par page
  • Recadrage des pages
  • Fusionner plusieurs pages en une seule page
  • Cryptage et décryptage de fichiers PDF
  • et plus encore !

Pour installer pypdf, exécutez la commande suivante à partir de la ligne de commande :

 pip install pypdf  

Ce nom de module est sensible à la casse, alors assurez-vous que le et est en minuscule et tout le reste est en majuscule. Tous les codes et fichiers PDF utilisés dans ce tutoriel/article sont disponibles ici .

1. Extraire le texte d'un fichier PDF

Python
   # importing required classes   from   pypdf   import   PdfReader   # creating a pdf reader object   reader   =   PdfReader  (  'example.pdf'  )   # printing number of pages in pdf file   print  (  len  (  reader  .  pages  ))   # creating a page object   page   =   reader  .  pages  [  0  ]   # extracting text from page   print  (  page  .  extract_text  ())   

Le résultat du programme ci-dessus ressemble à ceci :
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

1Preliminaries
4
1.1WhatisPython?...................................
..4
1.2Installationanddocumentation....................
.........4 [and some more lines...]

Essayons de comprendre le code ci-dessus en morceaux :
 

 reader = PdfReader('example.pdf')   
  • Ici, nous créons un objet de Lecteur PDF classe du module pypdf et transmettez le chemin d'accès au fichier PDF et obtenez un objet lecteur PDF.
     
 print(len(reader.pages))   
  • pages La propriété donne le nombre de pages dans le fichier PDF. Par exemple, dans notre cas, il s'agit de 20 (voir la première ligne de sortie).
     
 pageObj = reader.pages[0]   
  • Maintenant, nous créons un objet de ObjetPage classe du module pypdf. L'objet lecteur PDF a une fonction pages[] qui prend le numéro de page (à partir de l'index 0) comme argument et renvoie l'objet page.
     
 print(pageObj.extract_text())   
  • L'objet Page a une fonction extrait_text() pour extraire le texte de la page PDF.


Note: Bien que les fichiers PDF soient parfaits pour présenter du texte de manière à ce qu’il soit facile à imprimer et à lire, ils ne sont pas faciles à analyser par un logiciel en texte brut. En tant que tel, pypdf peut commettre des erreurs lors de l'extraction du texte d'un PDF et peut même être incapable d'ouvrir certains PDF. Vous ne pouvez malheureusement pas faire grand-chose à ce sujet. pypdf peut tout simplement ne pas être en mesure de fonctionner avec certains de vos fichiers PDF particuliers.

2. Rotation des pages PDF
 

Python
   # importing the required classes   from   pypdf   import   PdfReader     PdfWriter   def   PDFrotate  (  origFileName     newFileName     rotation  ):   # creating a pdf Reader object   reader   =   PdfReader  (  origFileName  )   # creating a pdf writer object for new pdf   writer   =   PdfWriter  ()   # rotating each page   for   page   in   range  (  len  (  reader  .  pages  )):   pageObj   =   reader  .  pages  [  page  ]   pageObj  .  rotate  (  rotation  )   # Add the rotated page object to the PDF writer   writer  .  add_page  (  pageObj  )   # Write the rotated pages to the new PDF file   with   open  (  newFileName     'wb'  )   as   newFile  :   writer  .  write  (  newFile  )   def   main  ():   # original pdf file name   origFileName   =   'example.pdf'   # new pdf file name   newFileName   =   'rotated_example.pdf'   # rotation angle   rotation   =   270   # calling the PDFrotate function   PDFrotate  (  origFileName     newFileName     rotation  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

Ici vous pouvez voir comment la première page de rotation_exemple.pdf ressemble à (image de droite) après rotation :

Rotation d

Quelques points importants liés au code ci-dessus :
 

  • Pour la rotation, nous créons d’abord un objet lecteur PDF du PDF original.
 writer = PdfWriter()   
  • Les pages pivotées seront écrites dans un nouveau PDF. Pour écrire dans des PDF, nous utilisons l'objet de PdfWriter classe du module pypdf.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • Maintenant, nous parcourons chaque page du PDF original. Nous obtenons l'objet de page par .pages[] méthode de classe de lecteur PDF. Maintenant, nous faisons pivoter la page de tourner() méthode de classe d’objet de page. Ensuite, nous ajoutons une page à l'objet PDF Writer en utilisant ajouter() méthode de la classe PDF Writer en passant l’objet page pivotée.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • Nous devons maintenant écrire les pages PDF dans un nouveau fichier PDF. Tout d'abord, nous ouvrons le nouvel objet fichier et y écrivons des pages PDF en utilisant écrire() méthode d’objet écrivain PDF. Enfin, nous fermons l'objet fichier PDF d'origine et le nouvel objet fichier.

3. Fusion de fichiers PDF

Python
   # importing required modules   from   pypdf   import   PdfWriter   def   PDFmerge  (  pdfs     output  ):   # creating pdf file writer object   pdfWriter   =   PdfWriter  ()   # appending pdfs one by one   for   pdf   in   pdfs  :   pdfWriter  .  append  (  pdf  )   # writing combined pdf to output pdf file   with   open  (  output     'wb'  )   as   f  :   pdfWriter  .  write  (  f  )   def   main  ():   # pdf files to merge   pdfs   =   [  'example.pdf'     'rotated_example.pdf'  ]   # output pdf file name   output   =   'combined_example.pdf'   # calling pdf merge function   PDFmerge  (  pdfs  =  pdfs     output  =  output  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

La sortie du programme ci-dessus est un PDF combiné exemple_combiné.pdf obtenu en fusionnant exemple.pdf et rotation_exemple.pdf .
 

  • Jetons un coup d'œil aux aspects importants de ce programme :
     
 pdfWriter = PdfWriter()  
  • Pour la fusion, nous utilisons une classe prédéfinie PdfWriter du module pypdf.
    Ici, nous créons un objet rédacteur pdf du cours de rédaction de PDF
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • Maintenant, nous ajoutons l'objet fichier de chaque PDF à l'objet Writer PDF en utilisant le ajouter() méthode.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • Enfin, nous écrivons les pages PDF dans le fichier PDF de sortie en utilisant écrire méthode d’objet écrivain PDF.

4. Fractionner le fichier PDF

Python
   # importing the required modules   from   pypdf   import   PdfReader     PdfWriter   def   PDFsplit  (  pdf     splits  ):   # creating pdf reader object   reader   =   PdfReader  (  pdf  )   # starting index of first slice   start   =   0   # starting index of last slice   end   =   splits  [  0  ]   for   i   in   range  (  len  (  splits  )  +  1  ):   # creating pdf writer object for (i+1)th split   writer   =   PdfWriter  ()   # output pdf file name   outputpdf   =   pdf  .  split  (  '.pdf'  )[  0  ]   +   str  (  i  )   +   '.pdf'   # adding pages to pdf writer object   for   page   in   range  (  start    end  ):   writer  .  add_page  (  reader  .  pages  [  page  ])   # writing split pdf pages to pdf file   with   open  (  outputpdf     'wb'  )   as   f  :   writer  .  write  (  f  )   # interchanging page split start position for next split   start   =   end   try  :   # setting split end position for next split   end   =   splits  [  i  +  1  ]   except   IndexError  :   # setting split end position for last split   end   =   len  (  reader  .  pages  )   def   main  ():   # pdf file to split   pdf   =   'example.pdf'   # split page positions   splits   =   [  2    4  ]   # calling PDFsplit function to split pdf   PDFsplit  (  pdf     splits  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

Le résultat sera trois nouveaux fichiers PDF avec split 1 (page 01) split 2 (page 23) split 3 (page 4-fin) .
Aucune nouvelle fonction ou classe n'a été utilisée dans le programme Python ci-dessus. En utilisant une logique et des itérations simples, nous avons créé les fractionnements du PDF transmis en fonction de la liste transmise. se divise .

5. Ajout d'un filigrane aux pages PDF

Python
   # importing the required modules   from   pypdf   import   PdfReader     PdfWriter   def   add_watermark  (  wmFile     pageObj  ):   # creating pdf reader object of watermark pdf file   reader   =   PdfReader  (  wmFile  )   # merging watermark pdf's first page with passed page object.   pageObj  .  merge_page  (  reader  .  pages  [  0  ])   # returning watermarked page object   return   pageObj   def   main  ():   # watermark pdf file name   mywatermark   =   'watermark.pdf'   # original pdf file name   origFileName   =   'example.pdf'   # new pdf file name   newFileName   =   'watermarked_example.pdf'   # creating pdf File object of original pdf   pdfFileObj   =   open  (  origFileName     'rb'  )   # creating a pdf Reader object   reader   =   PdfReader  (  pdfFileObj  )   # creating a pdf writer object for new pdf   writer   =   PdfWriter  ()   # adding watermark to each page   for   page   in   range  (  len  (  reader  .  pages  )):   # creating watermarked page object   wmpageObj   =   add_watermark  (  mywatermark     reader  .  pages  [  page  ])   # adding watermarked page object to pdf writer   writer  .  add_page  (  wmpageObj  )   # writing watermarked pages to new file   with   open  (  newFileName     'wb'  )   as   newFile  :   writer  .  write  (  newFile  )   # closing the original pdf file object   pdfFileObj  .  close  ()   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

Voici à quoi ressemble la première page du fichier PDF original (à gauche) et filigrané (à droite) :
 

Filigraner le fichier pdf

  • Tout le processus est le même que dans l’exemple de rotation de page. La seule différence est :
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • L'objet de page est converti en objet de page filigrané à l'aide de add_watermark() fonction.
  • Essayons de comprendre add_watermark() fonction:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • Tout d'abord, nous créons un objet lecteur PDF de filigrane.pdf . Vers l'objet de page transmis que nous utilisons fusion_page() et transmettez l'objet page de la première page de l'objet lecteur PDF en filigrane. Cela superposera le filigrane sur l'objet de page transmis.


Et nous arrivons ici à la fin de ce long tutoriel sur l'utilisation de fichiers PDF en python.
Vous pouvez désormais créer facilement votre propre gestionnaire PDF !
Références :
 

  • https://automatetheboringstuff.com/chapter13/
  • https://pypi.org/project/pypdf/

Si vous aimez GeeksforGeeks et souhaitez contribuer, vous pouvez également écrire un article en utilisant write.geeksforgeeks.org ou envoyer votre article à [email protected]. Consultez votre article apparaissant sur la page principale de GeeksforGeeks et aidez les autres Geeks.
Veuillez écrire des commentaires si vous trouvez quelque chose d'incorrect ou si vous souhaitez partager plus d'informations sur le sujet abordé ci-dessus.
 

Créer un quiz