Работа с 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 страници
# 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.
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 файл:
- Целият процес е същият като примера за ротация на страницата. Единствената разлика е:
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 и помогнете на други маниаци.
Моля, пишете коментари, ако откриете нещо неправилно или ако искате да споделите повече информация по темата, обсъдена по-горе.