Werken met PDF-bestanden in Python

Werken met PDF-bestanden in Python

Jullie moeten allemaal bekend zijn met wat PDF's zijn. In feite zijn ze een van de belangrijkste en meest gebruikte digitale media. PDF staat voor Draagbaar documentformaat . Het gebruikt .pdf verlenging. Het wordt gebruikt om documenten betrouwbaar te presenteren en uit te wisselen, onafhankelijk van softwarehardware of besturingssysteem.
Uitgevonden door Adobe PDF is nu een open standaard die wordt beheerd door de International Organization for Standardization (ISO). PDF's kunnen koppelingen en knoppen bevatten uit de velden audio, video en bedrijfslogica.
In dit artikel zullen we leren hoe we verschillende bewerkingen kunnen uitvoeren, zoals:
 

  • Tekst uit pdf halen
  • PDF-pagina's roteren
  • PDF's samenvoegen
  • PDF splitsen
  • Watermerk toevoegen aan PDF-pagina's

Installatie: Gebruik eenvoudige Python-scripts!
We zullen een module pypdf van derden gebruiken.
pypdf is een Python-bibliotheek gebouwd als een PDF-toolkit. Het is in staat om:
 

  • Documentinformatie extraheren (titel auteur …)
  • Documenten pagina voor pagina splitsen
  • Documenten pagina voor pagina samenvoegen
  • Pagina's bijsnijden
  • Meerdere pagina's samenvoegen tot één pagina
  • Coderen en decoderen van PDF-bestanden
  • en meer!

Om pypdf te installeren, voert u de volgende opdracht uit vanaf de opdrachtregel:

 pip install pypdf  

Deze modulenaam is hoofdlettergevoelig, dus zorg ervoor dat de En is kleine letters en al het andere is hoofdletters. Alle code en PDF-bestanden die in deze tutorial/artikel worden gebruikt, zijn beschikbaar hier .

1. Tekst extraheren uit een PDF-bestand

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  ())   

De uitvoer van het bovenstaande programma ziet er als volgt uit:
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

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

Laten we proberen de bovenstaande code in stukjes te begrijpen:
 

 reader = PdfReader('example.pdf')   
  • Hier maken we een object van PdfReader klasse van de pypdf-module en geef het pad door naar het PDF-bestand en ontvang een PDF-lezerobject.
     
 print(len(reader.pages))   
  • pagina's eigenschap geeft het aantal pagina's in het PDF-bestand aan. In ons geval is dit bijvoorbeeld 20 (zie eerste uitvoerregel).
     
 pageObj = reader.pages[0]   
  • Nu maken we een object van PaginaObject klasse van pypdf-module. PDF-lezerobject heeft functie pagina's[] die het paginanummer (beginnend bij index 0) als argument neemt en het pagina-object retourneert.
     
 print(pageObj.extract_text())   
  • Pagina-object heeft functie extract_text() om tekst uit de PDF-pagina te extraheren.


Opmerking: Hoewel PDF-bestanden uitstekend geschikt zijn voor het opmaken van tekst op een manier die mensen gemakkelijk kunnen afdrukken en lezen, zijn ze voor software niet eenvoudig te analyseren in leesbare tekst. Als zodanig kan pypdf fouten maken bij het extraheren van tekst uit een PDF en kan het zelfs zijn dat sommige PDF's helemaal niet kunnen worden geopend. Hier kun je helaas niet veel aan doen. pypdf kan mogelijk eenvoudigweg niet werken met sommige van uw specifieke PDF-bestanden.

2. PDF-pagina's roteren
 

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  ()   

Hier kunt u zien hoe de eerste pagina van geroteerd_voorbeeld.pdf ziet er na rotatie uit (rechter afbeelding):

Het roteren van een pdf-bestand

Enkele belangrijke punten met betrekking tot de bovenstaande code:
 

  • Voor rotatie maken we eerst een PDF-lezerobject van de originele PDF.
 writer = PdfWriter()   
  • Geroteerde pagina's worden naar een nieuwe PDF geschreven. Voor het schrijven naar PDF's gebruiken we het object van PdfWriter klasse van pypdf-module.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • Nu herhalen we elke pagina van de originele PDF. We krijgen een pagina-object door .pagina's[] methode van PDF-lezerklasse. Nu draaien we de pagina om draaien() methode van paginaobjectklasse. Vervolgens voegen we een pagina toe aan het PDF-schrijverobject met behulp van toevoegen() methode van de PDF-schrijverklasse door het geroteerde paginaobject door te geven.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • Nu moeten we de PDF-pagina's naar een nieuw PDF-bestand schrijven. Eerst openen we het nieuwe bestandsobject en schrijven er PDF-pagina's naar met behulp van schrijven() methode van PDF-schrijverobject. Ten slotte sluiten we het originele PDF-bestandsobject en het nieuwe bestandsobject.

3. PDF-bestanden samenvoegen

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  ()   

De uitvoer van het bovenstaande programma is een gecombineerde PDF gecombineerd_voorbeeld.pdf verkregen door samenvoeging voorbeeld.pdf En geroteerd_voorbeeld.pdf .
 

  • Laten we eens kijken naar belangrijke aspecten van dit programma:
     
 pdfWriter = PdfWriter()  
  • Voor het samenvoegen gebruiken we een vooraf gebouwde klasse PdfWriter van de pypdf-module.
    Hier maken we een object pdfschrijver van de PDF-schrijversklasse
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • Nu voegen we het bestandsobject van elke PDF toe aan het PDF-schrijverobject met behulp van de toevoegen() methode.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • Ten slotte schrijven we de PDF-pagina's naar het uitgevoerde PDF-bestand met behulp van schrijven methode van PDF-schrijverobject.

4. PDF-bestand splitsen

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  ()   

De uitvoer zal drie nieuwe PDF-bestanden zijn met split 1 (pagina 01) split 2 (pagina 23) split 3 (pagina 4-einde) .
Er is geen nieuwe functie of klasse gebruikt in het bovenstaande Python-programma. Met behulp van eenvoudige logica en iteraties hebben we de splitsingen van doorgegeven PDF's gemaakt volgens de doorgegeven lijst splitsingen .

5. Watermerk toevoegen aan PDF-pagina's

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  ()   

Zo ziet de eerste pagina van het originele (links) en watermerk (rechts) PDF-bestand eruit:
 

Het pdf-bestand van een watermerk voorzien

  • Het hele proces is hetzelfde als in het voorbeeld van paginarotatie. Het enige verschil is:
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • Pagina-object wordt geconverteerd naar een pagina-object met een watermerk met behulp van add_watermark() functie.
  • Laten we proberen het te begrijpen add_watermark() functie:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • In de eerste plaats maken we een PDF-lezerobject van watermerk.pdf . Voor het doorgegeven paginaobject gebruiken we merge_page() functie en geef het paginaobject van de eerste pagina van het watermerk PDF-lezerobject door. Hierdoor wordt het watermerk over het doorgegeven paginaobject gelegd.


En hier bereiken we het einde van deze lange tutorial over het werken met PDF-bestanden in Python.
Nu kunt u eenvoudig uw eigen PDF-manager maken!
Referenties:
 

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

Als je GeeksforGeeks leuk vindt en een bijdrage wilt leveren, kun je ook een artikel schrijven met write.geeksforgeeks.org of je artikel mailen naar [email protected]. Zie uw artikel verschijnen op de hoofdpagina van GeeksforGeeks en help andere Geeks.
Schrijf opmerkingen als u iets onjuist vindt of als u meer informatie wilt delen over het hierboven besproken onderwerp.
 

Quiz maken