Darbas su PDF failais Python

Darbas su PDF failais Python

Visi turite žinoti, kas yra PDF. Tiesą sakant, jie yra viena iš svarbiausių ir plačiausiai naudojamų skaitmeninių laikmenų. PDF reiškia Nešiojamojo dokumento formatas . Tai naudoja .pdf pratęsimas. Jis naudojamas dokumentams pateikti ir keistis patikimai nepriklausomai nuo programinės įrangos ar operacinės sistemos.
Išrado Adobe PDF dabar yra atviras standartas, prižiūrimas Tarptautinės standartizacijos organizacijos (ISO). PDF failuose gali būti nuorodų ir mygtukų, sudarytų iš garso vaizdo ir verslo logikos laukų.
Šiame straipsnyje sužinosime, kaip galime atlikti įvairias operacijas, pavyzdžiui:
 

  • Teksto ištraukimas iš pdf
  • Besisukantys PDF puslapiai
  • PDF sujungimas
  • Pdf skaidymas
  • Vandenženklio pridėjimas prie PDF puslapių

Montavimas: Naudojant paprastus python scenarijus!
Mes naudosime trečiosios šalies modulį pypdf.
pypdf yra python biblioteka, sukurta kaip PDF įrankių rinkinys. Jis gali:
 

  • Ištraukiama dokumento informacija (pavadinimo autorius…)
  • Dokumentų skaidymas po puslapius
  • Dokumentų sujungimas puslapis po puslapio
  • Puslapių apkarpymas
  • Kelių puslapių sujungimas į vieną puslapį
  • PDF failų šifravimas ir iššifravimas
  • ir dar daugiau!

Norėdami įdiegti pypdf, komandinėje eilutėje paleiskite šią komandą:

 pip install pypdf  

Šiame modulio pavadinime skiriamos didžiosios ir mažosios raidės, todėl įsitikinkite, kad ir yra mažosios, o visa kita – didžiosios. Galimas visas šioje pamokoje/straipsnyje naudojamas kodas ir PDF failai čia .

1. Teksto ištraukimas iš PDF failo

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

Aukščiau pateiktos programos išvestis atrodo taip:
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

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

Pabandykime suprasti aukščiau pateiktą kodą dalimis:
 

 reader = PdfReader('example.pdf')   
  • Čia mes sukuriame objektą PdfReader pypdf modulio klasė ir perduokite kelią į PDF failą ir gaukite PDF skaitytuvo objektą.
     
 print(len(reader.pages))   
  • puslapių ypatybė nurodo PDF failo puslapių skaičių. Pavyzdžiui, mūsų atveju tai yra 20 (žr. pirmąją išvesties eilutę).
     
 pageObj = reader.pages[0]   
  • Dabar sukuriame objektą Puslapio objektas pypdf modulio klasė. PDF skaitytuvo objektas turi funkciją puslapiai[] kuris paima puslapio numerį (pradedant nuo indekso 0) kaip argumentą ir grąžina puslapio objektą.
     
 print(pageObj.extract_text())   
  • Puslapio objektas turi funkciją ekstrakto_tekstas() norėdami ištraukti tekstą iš PDF puslapio.


Pastaba: Nors PDF failai puikiai tinka teksto išdėstymui taip, kad žmonėms būtų lengva spausdinti ir skaityti, programinei įrangai nėra paprasta juos išanalizuoti į paprastą tekstą. Dėl to pypdf gali padaryti klaidų ištraukdamas tekstą iš PDF ir net negalėti atidaryti kai kurių PDF failų. Deja, šiuo klausimu nelabai ką galite padaryti. pypdf gali tiesiog neveikti su kai kuriais konkrečiais jūsų PDF failais.

2. Besisukantys PDF puslapiai
 

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

Čia galite pamatyti, kaip pirmasis puslapis pasuktas_pavyzdys.pdf atrodo taip (paveikslėlis dešinėje) po pasukimo:

Pdf failo pasukimas

Keletas svarbių punktų, susijusių su aukščiau nurodytu kodu:
 

  • Norėdami pasukti, pirmiausia sukuriame originalaus PDF PDF skaitytuvo objektą.
 writer = PdfWriter()   
  • Pasukti puslapiai bus įrašyti į naują PDF. Norėdami rašyti į PDF, naudojame objektą PdfWriter pypdf modulio klasė.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • Dabar kartojame kiekvieną originalaus PDF puslapį. Mes gauname puslapio objektą .puslapiai[] PDF skaitytuvo klasės metodas. Dabar pasukame puslapį pasukti () puslapio objektų klasės metodas. Tada mes pridedame puslapį prie PDF rašymo objekto naudodami pridėti () PDF rašytojų klasės metodas, perduodamas pasukto puslapio objektą.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • Dabar turime įrašyti PDF puslapius į naują PDF failą. Pirmiausia atidarome naują failo objektą ir naudodamiesi į jį įrašome PDF puslapius rašyti () PDF rašymo objekto metodas. Galiausiai uždarome originalų PDF failo objektą ir naują failo objektą.

3. PDF failų sujungimas

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

Aukščiau pateiktos programos išvestis yra kombinuotas PDF failas kombinuotas_pavyzdys.pdf gautas sujungus pavyzdys.pdf ir pasuktas_pavyzdys.pdf .
 

  • Pažvelkime į svarbius šios programos aspektus:
     
 pdfWriter = PdfWriter()  
  • Sujungimui naudojame iš anksto sukurtą klasę PdfWriter pypdf modulis.
    Čia mes sukuriame objektą pdfwriter PDF rašytojų klasėje
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • Dabar kiekvieno PDF failo objektą pridedame prie PDF rašymo objekto naudodami pridėti () metodas.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • Galiausiai mes rašome PDF puslapius į išvesties PDF failą naudodami rašyti PDF rašymo objekto metodas.

4. PDF failo skaidymas

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

Išvestis bus trys nauji PDF failai su 1 padalijimas (01 puslapis) 2 padalijimas (23 puslapis) 3 padalijimas (4 puslapis) .
Aukščiau pateiktoje python programoje nebuvo naudojama jokia nauja funkcija ar klasė. Naudodami paprastą logiką ir iteracijas sukūrėme priimto PDF padalijimus pagal pateiktų sąrašą suskyla .

5. Vandenženklio pridėjimas prie PDF puslapių

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

Štai kaip atrodo pirmasis originalaus (kairėje) ir vandenženklio (dešinėje) PDF failo puslapis:
 

Vandenženklis pdf failą

  • Visas procesas yra toks pat kaip puslapio pasukimo pavyzdyje. Vienintelis skirtumas yra:
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • Puslapio objektas konvertuojamas į vandens ženklu pažymėtą puslapio objektą naudojant add_watermark() funkcija.
  • Pabandykime suprasti add_watermark() funkcija:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • Pirmiausia sukuriame PDF skaitytuvo objektą vandens ženklas.pdf . Perduotam puslapio objektui naudojame merge_page() funkcija ir perduoti vandens ženklo PDF skaitytuvo objekto pirmojo puslapio puslapio objektą. Tai perdengs vandens ženklą ant praleisto puslapio objekto.


Ir čia pasiekiame šios ilgos pamokos apie darbą su PDF failais python pabaigoje.
Dabar galite lengvai sukurti savo PDF tvarkyklę!
Nuorodos:
 

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

Jei jums patinka „GeeksforGeeks“ ir norėtumėte prisidėti, taip pat galite parašyti straipsnį naudodami write.geeksforgeeks.org arba išsiųsti savo straipsnį el. paštu [email protected]. Peržiūrėkite savo straipsnį „GeeksforGeeks“ pagrindiniame puslapyje ir padėkite kitiems „Geeks“.
Rašykite komentarus, jei radote ką nors neteisingo arba norite pasidalinti daugiau informacijos aukščiau aptarta tema.
 

Sukurti viktoriną