Treballant amb fitxers PDF a Python

Treballant amb fitxers PDF a Python

Tots heu d'estar familiaritzats amb què són els PDF. De fet, són un dels mitjans digitals més importants i utilitzats. PDF significa Format de document portàtil . S'utilitza .pdf extensió. S'utilitza per presentar i intercanviar documents de manera fiable independentment del maquinari del programari o del sistema operatiu.
Inventat per Adobe El PDF és ara un estàndard obert mantingut per l'Organització Internacional per a l'Estandardització (ISO). Els PDF poden contenir enllaços i botons de camps d'àudio, vídeo i lògica empresarial.
En aquest article aprendrem com podem fer diverses operacions com:
 

  • Extracció de text del PDF
  • Pàgines PDF rotatives
  • Fusionar PDF
  • Divisió de PDF
  • Afegeix una marca d'aigua a les pàgines PDF

Instal·lació: Utilitzant scripts Python senzills!
Utilitzarem un mòdul pypdf de tercers.
pypdf és una biblioteca de Python creada com a conjunt d'eines PDF. És capaç de:
 

  • Extracció d'informació del document (autor del títol...)
  • Divisió de documents pàgina per pàgina
  • Fusionar documents pàgina per pàgina
  • Retallar pàgines
  • Combinació de diverses pàgines en una única pàgina
  • Xifrar i desxifrar fitxers PDF
  • i més!

Per instal·lar pypdf, executeu l'ordre següent des de la línia d'ordres:

 pip install pypdf  

El nom d'aquest mòdul distingeix entre majúscules i minúscules, així que assegureu-vos que i és en minúscula i tota la resta és en majúscula. Tots els fitxers de codi i PDF utilitzats en aquest tutorial/article estan disponibles aquí .

1. Extracció de text d'un fitxer 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  ())   

La sortida del programa anterior té aquest aspecte:
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

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

Intentem entendre el codi anterior en trossos:
 

 reader = PdfReader('example.pdf')   
  • Aquí creem un objecte de PdfReader classe del mòdul pypdf i passeu el camí al fitxer PDF i obteniu un objecte lector de PDF.
     
 print(len(reader.pages))   
  • pàgines La propietat proporciona el nombre de pàgines del fitxer PDF. Per exemple, en el nostre cas és 20 (vegeu la primera línia de sortida).
     
 pageObj = reader.pages[0]   
  • Ara creem un objecte de PageObject classe del mòdul pypdf. L'objecte lector de PDF té funció pàgines[] que pren el número de pàgina (a partir de l'índex 0) com a argument i retorna l'objecte de la pàgina.
     
 print(pageObj.extract_text())   
  • L'objecte de la pàgina té funció extracte_text() per extreure text de la pàgina PDF.


Nota: Tot i que els fitxers PDF són excel·lents per dissenyar text d'una manera que sigui fàcil d'imprimir i llegir per a la gent, no són senzills per al programari per analitzar-los en text sense format. Com a tal, pypdf pot cometre errors en extreure text d'un PDF i fins i tot pot ser que no pugui obrir alguns PDF. Malauradament, no hi ha molt que puguis fer al respecte. És possible que pypdf simplement no pugui funcionar amb alguns dels vostres fitxers PDF concrets.

2. Rotació de pàgines 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  ()   

Aquí podeu veure com la primera pàgina de exemple_rotat.pdf sembla (imatge de la dreta) després de la rotació:

Girant un fitxer pdf

Alguns punts importants relacionats amb el codi anterior:
 

  • Per a la rotació, primer creem un objecte lector de PDF del PDF original.
 writer = PdfWriter()   
  • Les pàgines girades s'escriuran en un PDF nou. Per escriure en PDF utilitzem l'objecte de PdfWriter classe del mòdul pypdf.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • Ara repetim cada pàgina del PDF original. Obtenim l'objecte de la pàgina per pàgines .[] mètode de classe de lector de PDF. Ara girem la pàgina girar () mètode de classe d'objectes de pàgina. A continuació, afegim una pàgina a l'objecte d'escriptor de PDF utilitzant afegir() mètode de classe d'escriptor PDF passant l'objecte de pàgina girada.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • Ara hem d'escriure les pàgines PDF en un nou fitxer PDF. En primer lloc, obrim el nou objecte de fitxer i escrivim pàgines PDF amb ell escriure () mètode de l'objecte de l'escriptor PDF. Finalment tanquem l'objecte fitxer PDF original i l'objecte fitxer nou.

3. Fusionar fitxers 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 sortida del programa anterior és un PDF combinat exemple_combinat.pdf obtingut per fusió exemple.pdf i exemple_rotat.pdf .
 

  • Fem una ullada als aspectes importants d'aquest programa:
     
 pdfWriter = PdfWriter()  
  • Per a la fusió, utilitzem una classe preconstruïda PdfWriter del mòdul pypdf.
    Aquí creem un objecte pdfwriter de la classe d'escriptura de PDF
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • Ara afegim l'objecte de fitxer de cada PDF a l'objecte de l'escriptor de PDF utilitzant el afegir() mètode.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • Finalment escrivim les pàgines PDF al fitxer PDF de sortida utilitzant escriure mètode de l'objecte de l'escriptor PDF.

4. Divisió d'arxiu 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  ()   

La sortida serà de tres fitxers PDF nous split 1 (pàgina 01) split 2 (pàgina 23) split 3 (pàgina 4-final) .
No s'ha utilitzat cap funció o classe nova al programa Python anterior. Utilitzant una lògica i iteracions senzilles, vam crear les divisions dels PDF passats segons la llista aprovada es divideix .

5. Afegir una marca d'aigua a les pàgines 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  ()   

Així és com es veu la primera pàgina del fitxer PDF original (esquerra) i amb filigrana (dreta):
 

Marca d

  • Tot el procés és el mateix que l'exemple de rotació de pàgines. L'única diferència és:
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • L'objecte de pàgina es converteix en objecte de pàgina amb filigrana mitjançant afegir_marca d'aigua() funció.
  • Intentem entendre-ho afegir_marca d'aigua() funció:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • En primer lloc, creem un objecte lector de PDF filigrana.pdf . A l'objecte de pàgina passat que fem servir merge_page() funció i passa l'objecte de pàgina de la primera pàgina de l'objecte lector de PDF de filigrana. Això superposarà la filigrana sobre l'objecte de la pàgina passat.


I aquí arribem al final d'aquest llarg tutorial sobre com treballar amb fitxers PDF en Python.
Ara podeu crear fàcilment el vostre propi gestor de PDF!
Referències:
 

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

Si t'agrada GeeksforGeeks i vols contribuir, també pots escriure un article mitjançant write.geeksforgeeks.org o enviar el teu article a [email protected]. Vegeu el vostre article que apareix a la pàgina principal de GeeksforGeeks i ajudeu altres Geeks.
Si us plau, escriviu comentaris si trobeu alguna cosa incorrecta o si voleu compartir més informació sobre el tema tractat anteriorment.
 

Crea un qüestionari