Práce se soubory PDF v Pythonu
Všichni musíte být obeznámeni s tím, co jsou soubory PDF. Ve skutečnosti jsou jedním z nejdůležitějších a nejrozšířenějších digitálních médií. PDF znamená Přenosný formát dokumentu . Používá .pdf rozšíření. Slouží k prezentaci a výměně dokumentů spolehlivě nezávisle na softwarovém hardwaru nebo operačním systému.
Vynalezl Adobe PDF je nyní otevřený standard spravovaný Mezinárodní organizací pro standardizaci (ISO). Soubory PDF mohou obsahovat odkazy a tlačítka z polí zvuku, videa a obchodní logiky.
V tomto článku se naučíme, jak můžeme provádět různé operace jako:
- Extrahování textu z PDF
- Otáčení stránek PDF
- Sloučení souborů PDF
- Rozdělení PDF
- Přidání vodoznaku na stránky PDF
Instalace: Pomocí jednoduchých pythonových skriptů!
Budeme používat modul třetí strany pypdf.
pypdf je knihovna pythonu vytvořená jako sada nástrojů PDF. Je schopen:
- Extrahování informací o dokumentu (autor názvu …)
- Rozdělení dokumentů stránku po stránce
- Slučování dokumentů stránku po stránce
- Oříznutí stránek
- Sloučení více stránek do jedné stránky
- Šifrování a dešifrování souborů PDF
- a další!
Chcete-li nainstalovat pypdf, spusťte z příkazového řádku následující příkaz:
pip install pypdfTento název modulu rozlišuje velká a malá písmena, takže se ujistěte, že a je malá písmena a vše ostatní je velká písmena. Všechny kódy a soubory PDF použité v tomto tutoriálu/článku jsou k dispozici zde .
1. Extrahování textu ze souboru 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 ())Výstup výše uvedeného programu vypadá takto:
20
PythonBasics
S.R.Doty
August272008
Contents
1Preliminaries
4
1.1WhatisPython?...................................
..4
1.2Installationanddocumentation....................
.........4 [and some more lines...]
Pokusme se porozumět výše uvedenému kódu po částech:
reader = PdfReader('example.pdf')
- Zde vytvoříme objekt PdfReader třídy modulu pypdf a předejte cestu k souboru PDF a získejte objekt čtečky PDF.
print(len(reader.pages))
- stránky vlastnost udává počet stránek v souboru PDF. Například v našem případě je to 20 (viz první řádek výstupu).
pageObj = reader.pages[0]
- Nyní vytvoříme objekt PageObject třída modulu pypdf. Objekt čtečky PDF má funkci stránky[] který převezme číslo stránky (počínaje indexem 0) jako argument a vrátí objekt stránky.
print(pageObj.extract_text())
- Objekt stránky má funkci extrakt_text() extrahovat text ze stránky PDF.
Poznámka: Zatímco soubory PDF jsou skvělé pro uspořádání textu způsobem, který si lidé snadno vytisknou a přečtou, není snadné je softwarem analyzovat do prostého textu. Jako takový může pypdf dělat chyby při extrahování textu z PDF a dokonce nemusí být možné některé soubory PDF vůbec otevřít. S tím se bohužel moc dělat nedá. pypdf může jednoduše být neschopný pracovat s některými vašimi konkrétními soubory PDF.
2. Otáčení stránek 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 ()
Zde se můžete podívat, jak na první stránce otočený_příklad.pdf vypadá po otočení jako (pravý obrázek):
Některé důležité body související s výše uvedeným kódem:
- Pro otočení nejprve vytvoříme objekt čtečky PDF původního PDF.
writer = PdfWriter()
- Otočené stránky budou zapsány do nového PDF. Pro zápis do PDF používáme objekt PdfWriter třída modulu pypdf.
for page in range(len(pdfReader.pages)):
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
- Nyní iterujeme každou stránku původního PDF. Získáme objekt stránky pomocí .stránky[] metoda třídy PDF reader. Nyní otočíme stránku o střídat() metoda třídy objektu stránky. Potom přidáme stránku do objektu PDF Writer pomocí přidat() metoda třídy PDF Writer předáním objektu otočené stránky.
newFile = open(newFileName 'wb')
writer.write(newFile)
newFile.close()
- Nyní musíme zapsat stránky PDF do nového souboru PDF. Nejprve otevřeme nový objekt souboru a zapíšeme do něj stránky PDF pomocí napsat() metoda objektu PDF Writer. Nakonec zavřeme původní objekt souboru PDF a nový objekt souboru.
3. Slučování souborů 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 ()
Výstupem výše uvedeného programu je kombinované PDF kombinovaný_příklad.pdf získané sloučením example.pdf a otočený_příklad.pdf .
- Pojďme se podívat na důležité aspekty tohoto programu:
pdfWriter = PdfWriter() - Pro sloučení používáme předpřipravenou třídu PdfWriter modulu pypdf.
Zde vytvoříme objekt pdfwriter třídy PDF Writer
# appending pdfs one by one
for pdf in pdfs:
pdfWriter.append(pdf)
- Nyní připojíme objekt souboru každého PDF k objektu PDF Writer pomocí připojit() metoda.
# writing combined pdf to output pdf file
with open(output 'wb') as f:
pdfWriter.write(f)
- Nakonec zapíšeme stránky PDF do výstupního souboru PDF pomocí napsat metoda objektu PDF Writer.
4. Rozdělení souboru 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 ()
Výstupem budou tři nové soubory PDF s rozdělení 1 (strana 01) rozdělení 2 (strana 23) rozdělení 3 (strana 4-konec) .
Ve výše uvedeném programu python nebyla použita žádná nová funkce nebo třída. Pomocí jednoduché logiky a iterací jsme vytvořili rozdělení předaného PDF podle předaného seznamu rozdělí .
5. Přidání vodoznaku na stránky 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 ()
Takto vypadá první stránka původního (vlevo) a vodoznaku (vpravo) souboru PDF:
- Celý proces je stejný jako v příkladu rotace stránky. Jediný rozdíl je:
wmpageObj = add_watermark(mywatermark pdfReader.pages[page])
- Objekt stránky se převede na objekt stránky s vodoznakem pomocí add_watermark() funkce.
- Pokusme se pochopit add_watermark() funkce:
reader = PdfReader(wmFile)
pageObj.merge_page(reader.pages[0])
return pageObj
- Nejprve vytvoříme objekt čtečky PDF vodoznak.pdf . K předanému objektu stránky, který používáme merge_page() a předat objekt stránky první stránky objektu čtečky PDF vodoznaku. Tím se překryje vodoznak přes předaný objekt stránky.
A tady se dostáváme na konec tohoto dlouhého tutoriálu o práci se soubory PDF v pythonu.
Nyní si můžete snadno vytvořit svého vlastního správce PDF!
Reference:
- https://automatetheboringstuff.com/chapter13/
- https://pypi.org/project/pypdf/
Pokud máte rádi GeeksforGeeks a chtěli byste přispět, můžete také napsat článek pomocí write.geeksforgeeks.org nebo poslat svůj článek na [email protected]. Podívejte se, jak se váš článek objeví na hlavní stránce GeeksforGeeks a pomozte ostatním Geekům.
Pokud najdete něco nesprávného nebo pokud chcete sdílet více informací o výše uvedeném tématu, napište prosím komentáře.