Работа с PDF файлове в Python

Работа с PDF файлове в Python

Всички вие трябва да сте запознати с това какво представляват PDF файловете. Всъщност те са една от най-важните и широко използвани цифрови медии. PDF означава Преносим формат на документи . То използва .pdf разширение. Използва се за надеждно представяне и обмен на документи, независимо от софтуерния хардуер или операционната система.
Изобретен от Adobe PDF вече е отворен стандарт, поддържан от Международната организация по стандартизация (ISO). PDF файловете могат да съдържат връзки и бутони, полета, аудио, видео и бизнес логика.
В тази статия ще научим как можем да извършваме различни операции като:
 

  • Извличане на текст от PDF
  • Завъртане на PDF страници
  • Обединяване на PDF файлове
  • Разделяне на PDF
  • Добавяне на воден знак към PDF страници

Инсталация: Използване на прости скриптове на Python!
Ще използваме модул pypdf на трета страна.
pypdf е библиотека на Python, създадена като PDF инструментариум. Способен е на:
 

  • Извличане на информация за документа (заглавие автор...)
  • Разделяне на документи страница по страница
  • Обединяване на документи страница по страница
  • Изрязване на страници
  • Обединяване на няколко страници в една страница
  • Шифроване и декриптиране на PDF файлове
  • и повече!

За да инсталирате pypdf, изпълнете следната команда от командния ред:

 pip install pypdf  

Името на този модул е ​​чувствително към малки и големи букви, така че се уверете, че и е с малки букви, а всичко останало е с главни букви. Всички кодове и PDF файлове, използвани в този урок/статия, са налични тук .

1. Извличане на текст от 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  ())   

Резултатът от горната програма изглежда така:
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

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

Нека се опитаме да разберем горния код на части:
 

 reader = PdfReader('example.pdf')   
  • Тук създаваме обект на PdfReader клас на pypdf модул и предава пътя към PDF файла и получава обект на PDF четец.
     
 print(len(reader.pages))   
  • страници дава броя на страниците в PDF файла. Например в нашия случай е 20 (вижте първия ред на изхода).
     
 pageObj = reader.pages[0]   
  • Сега създаваме обект на PageObject клас на pypdf модул. Обектът за четене на PDF има функция страници[] който приема номера на страница (започвайки от индекс 0) като аргумент и връща обекта на страницата.
     
 print(pageObj.extract_text())   
  • Обектът на страницата има функция екстракт_текст () за извличане на текст от PDF страницата.


Забележка: Въпреки че PDF файловете са страхотни за оформяне на текст по начин, който е лесен за отпечатване и четене от хората, софтуерът не ги анализира лесно в обикновен текст. Като такъв pypdf може да направи грешки при извличане на текст от PDF и дори може изобщо да не може да отвори някои PDF файлове. За съжаление не можете да направите много по въпроса. pypdf може просто да не може да работи с някои от вашите конкретни PDF файлове.

2. Завъртане на 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  ()   

Тук можете да видите как първата страница на rotated_example.pdf изглежда (дясно изображение) след завъртане:

Завъртане на pdf файл

Някои важни точки, свързани с горния код:
 

  • За ротация първо създаваме обект на PDF четец на оригиналния PDF.
 writer = PdfWriter()   
  • Завъртените страници ще бъдат записани в нов PDF файл. За писане в PDF файлове използваме обекта на PdfWriter клас на pypdf модул.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • Сега итерираме всяка страница от оригиналния PDF файл. Получаваме обект на страница от .страници[] метод на клас PDF четец. Сега завъртаме страницата с завъртане () метод на клас обект на страница. След това добавяме страница към обекта за писане на PDF с помощта на добави () метод на класа на PDF writer чрез предаване на обекта на завъртяната страница.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • Сега трябва да запишем PDF страниците в нов PDF файл. Първо отваряме новия файлов обект и записваме PDF страници в него с помощта на пиши() метод на обект за писане на PDF. Накрая затваряме оригиналния PDF файлов обект и новия файлов обект.

3. Обединяване на 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  ()   

Резултатът от горната програма е комбиниран PDF комбиниран_пример.pdf получени чрез сливане пример.pdf и rotated_example.pdf .
 

  • Нека да разгледаме важните аспекти на тази програма:
     
 pdfWriter = PdfWriter()  
  • За сливане използваме предварително изграден клас PdfWriter на pypdf модул.
    Тук създаваме обект pdfwriter от класа на PDF писател
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • Сега добавяме файлов обект на всеки PDF към PDF записващ обект, като използваме добавям () метод.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • Накрая записваме PDF страниците в изходния PDF файл с помощта на пишете метод на обект за писане на PDF.

4. Разделяне на 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  ()   

Резултатът ще бъде три нови PDF файла с раздел 1 (страница 01) раздел 2 (страница 23) раздел 3 (страница 4-край) .
В горната програма на Python не е използвана нова функция или клас. Използвайки проста логика и итерации, създадохме разделянето на преминалите PDF файлове според списъка с преминали разделя се .

5. Добавяне на воден знак към 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  ()   

Ето как изглежда първата страница на оригиналния (вляво) и водния знак (вдясно) PDF файл:
 

Воден знак на pdf файл

  • Целият процес е същият като примера за ротация на страницата. Единствената разлика е:
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • Обектът на страница се преобразува в обект на страница с воден знак с помощта на add_watermark() функция.
  • Нека се опитаме да разберем add_watermark() функция:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • Преди всичко създаваме обект на PDF четец на воден знак.pdf . Към обекта на преминалата страница, който използваме merge_page() функция и предаване на обекта на страницата на първата страница на обекта на PDF четец с воден знак. Това ще наслагва водния знак върху преминатия обект на страницата.


И тук стигнахме до края на този дълъг урок за работа с PDF файлове в Python.
Сега можете лесно да създадете свой собствен PDF мениджър!
препратки:
 

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

Ако харесвате GeeksforGeeks и искате да допринесете, можете също да напишете статия, като използвате write.geeksforgeeks.org или да изпратите статията си по пощата на [email protected]. Вижте вашата статия да се появява на главната страница на GeeksforGeeks и помогнете на други маниаци.
Моля, пишете коментари, ако откриете нещо неправилно или ако искате да споделите повече информация по темата, обсъдена по-горе.
 

Създаване на тест