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 norint patikimai pateikti ir keistis dokumentais, nepriklausomai nuo programinės įrangos, aparatinė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ų, formos laukų, garso, vaizdo įrašų ir verslo logikos.
Šiame straipsnyje mes sužinosime, kaip galime atlikti įvairias operacijas, tokias kaip:
- 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:
- Dokumento informacijos ištraukimas (pavadinimas, 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!
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 August27,2008 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 puslapių skaičių PDF faile. 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ą. Taigi, 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)):> > > # creating rotated page object> > pageObj> => reader.pages[page]> > pageObj.rotate(rotation)> > > # adding rotated page object to pdf writer> > pdfWriter.add_page(pageObj)> > > # new pdf file object> > newFile> => open> (newFileName,> 'wb'> )> > > # writing rotated pages to new file> > pdfWriter.write(newFile)> > > # closing the new pdf file object> > newFile.close()> > > 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:
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) pdfWriter.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 papildymas () PDF rašytojų klasės metodas, perduodamas pasukto puslapio objektą.
newFile = open(newFileName, 'wb') pdfWriter.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> PdfMerger> > > def> PDFmerge(pdfs, output):> > # creating pdf file merger object> > pdfMerger> => PdfMerger()> > > # appending pdfs one by one> > for> pdf> in> pdfs:> > pdfMerger.append(pdf)> > > # writing combined pdf to output pdf file> > with> open> (output,> 'wb'> ) as f:> > pdfMerger.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:
pdfMerger = PdfMerger()
- Sujungimui naudojame iš anksto sukurtą klasę, PdfMerger pypdf modulis.
Čia mes sukuriame objektą pdf sujungimas PDF sujungimo klasės
for pdf in pdfs: pdfmerger.append(open(focus, 'rb'))
- Dabar kiekvieno PDF failo objektą pridedame prie PDF sujungimo objekto naudodami pridėti () metodas.
with open(output, 'wb') as f: pdfMerger.write(f)
- Galiausiai PDF puslapius įrašome į išvesties PDF failą naudodami rašyti PDF sujungimo 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 (0,1 puslapis), 2 padalijimas (2, 3 puslapis), 3 padalijimas (4 puslapio pabaiga) .
Aukščiau pateiktoje python programoje nebuvo naudojama jokia nauja funkcija ar klasė. Naudodami paprastą logiką ir iteracijas, mes sukūrėme priimto PDF skaidymus pagal pateiktų sąrašą suskyla .
5. Vandenženklio pridėjimas prie PDF puslapių
Python
# importing the required modules> from> pypdf> import> PdfReader> > def> add_watermark(wmFile, pageObj):> > # creating pdf reader object of watermark pdf file> > reader> => PdfReader(wmFileObj)> > > # 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)> > > # new pdf file object> > newFile> => open> (newFileName,> 'wb'> )> > > # writing watermarked pages to new file> > writer.write(newFile)> > > # closing the new pdf file object> > newFile.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:
- 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]) wmFileObj.close() 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 uždengs vandens ženklą ant perduoto 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 techcodeview.com ir norėtumėte prisidėti, taip pat galite parašyti straipsnį naudodami write.techcodeview.com arba išsiųsti savo straipsnį el. paštu [email protected]
Rašykite komentarus, jei radote ką nors neteisingo arba norite pasidalinti daugiau informacijos aukščiau aptarta tema.