Arbeide med PDF-filer i Python
Alle må være kjent med hva PDF-filer er. Faktisk er de et av de viktigste og mest brukte digitale mediene. PDF står for Bærbart dokumentformat . Det bruker .pdf Utvidelse. Den brukes til å presentere og utveksle dokumenter pålitelig, uavhengig av programvare, maskinvare eller operativsystem.
Oppfunnet av Adobe , PDF er nå en åpen standard vedlikeholdt av International Organization for Standardization (ISO). PDF-filer kan inneholde lenker og knapper, skjemafelt, lyd, video og forretningslogikk.
I denne artikkelen vil vi lære hvordan vi kan utføre ulike operasjoner som:
- Trekker ut tekst fra PDF
- Roterende PDF-sider
- Slå sammen PDF-er
- Deling av PDF
- Legger til vannmerke på PDF-sider
Installasjon: Bruk enkle python-skript!
Vi vil bruke en tredjepartsmodul, pypdf.
pypdf er et python-bibliotek bygget som et PDF-verktøysett. Den er i stand til:
- Trekke ut dokumentinformasjon (tittel, forfatter, ...)
- Del opp dokumenter side for side
- Slå sammen dokumenter side for side
- Beskjæring av sider
- Slå sammen flere sider til én enkelt side
- Kryptering og dekryptering av PDF-filer
- og mer!
For å installere pypdf, kjør følgende kommando fra kommandolinjen:
pip install pypdf
Dette modulnavnet skiller mellom store og små bokstaver, så sørg for at og er små bokstaver og alt annet er store bokstaver. All koden og PDF-filene som brukes i denne opplæringen/artikkelen er tilgjengelige her .
1. Trekke ut tekst fra PDF-fil
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())> |
Utdataene fra programmet ovenfor ser slik ut:
20 PythonBasics S.R.Doty August27,2008 Contents 1Preliminaries 4 1.1WhatisPython?................................... ..4 1.2Installationanddocumentation.................... .........4 [and some more lines...]
La oss prøve å forstå koden ovenfor i biter:
reader = PdfReader('example.pdf') - Her lager vi et objekt av PdfReader klasse av pypdf-modulen og gi stien til PDF-filen og få et PDF-leserobjekt.
print(len(reader.pages))
- sider egenskapen gir antall sider i PDF-filen. For eksempel, i vårt tilfelle, er det 20 (se første linje med utdata).
pageObj = reader.pages[0]
- Nå lager vi et objekt av Sideobjekt klasse av pydf-modulen. PDF-leserobjekt har funksjon sider[] som tar sidenummer (starter fra indeks 0) som argument og returnerer sideobjektet.
print(pageObj.extract_text())
- Sideobjekt har funksjon extract_text() for å trekke ut tekst fra PDF-siden.
Merk: Mens PDF-filer er flotte for å legge ut tekst på en måte som er lett for folk å skrive ut og lese, er de ikke enkle for programvare å analysere til ren tekst. Som sådan kan pydf gjøre feil når du trekker ut tekst fra en PDF og kan til og med være ute av stand til å åpne noen PDF-filer i det hele tatt. Det er ikke mye du kan gjøre med dette, dessverre. pypdf kan rett og slett ikke fungere med noen av dine spesielle PDF-filer.
2. Roterende PDF-sider
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()> |
Her kan du se hvordan den første siden av rotert_eksempel.pdf ser slik ut (høyre bilde) etter rotasjon:
Noen viktige punkter knyttet til koden ovenfor:
- For rotasjon oppretter vi først et PDF-leserobjekt av den originale PDF-en.
writer = PdfWriter()
- Roterte sider vil bli skrevet til en ny PDF. For å skrive til PDF-er bruker vi objektet til Pdf Writer klasse av pydf-modulen.
for page in range(len(pdfReader.pages)): pageObj = pdfReader.pages[page] pageObj.rotate(rotation) pdfWriter.add_page(pageObj)
- Nå gjentar vi hver side i den originale PDF-filen. Vi får sideobjekt ved .pages[] metode for PDF-leserklasse. Nå roterer vi siden etter rotere() metode for sideobjektklasse. Deretter legger vi til en side til PDF-skriverobjekt ved hjelp av addage() metode for PDF-skriverklassen ved å sende det roterte sideobjektet.
newFile = open(newFileName, 'wb') pdfWriter.write(newFile) newFile.close()
- Nå må vi skrive PDF-sidene til en ny PDF-fil. Først åpner vi det nye filobjektet og skriver PDF-sider til det ved hjelp av skrive() metode for PDF-skriverobjekt. Til slutt lukker vi det originale PDF-filobjektet og det nye filobjektet.
3. Slå sammen PDF-filer
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()> |
Utdataene fra programmet ovenfor er en kombinert PDF, kombinert_eksempel.pdf , oppnådd ved sammenslåing eksempel.pdf og rotert_eksempel.pdf .
- La oss ta en titt på viktige aspekter ved dette programmet:
pdfMerger = PdfMerger()
- For sammenslåing bruker vi en forhåndsbygd klasse, PdfMerger av pydf-modulen.
Her lager vi et objekt pdfFusjon av PDF-fusjonsklasse
for pdf in pdfs: pdfmerger.append(open(focus, 'rb'))
- Nå legger vi til filobjekt for hver PDF til PDF-fusjonsobjekt ved å bruke legge til() metode.
with open(output, 'wb') as f: pdfMerger.write(f)
- Til slutt skriver vi PDF-sidene til utdata-PDF-filen ved hjelp av skrive metode for PDF-fusjonsobjekt.
4. Deling av PDF-fil
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()> |
Utdata vil være tre nye PDF-filer med delt 1 (side 0,1), delt 2(side 2,3), delt 3(side 4-ende) .
Ingen ny funksjon eller klasse har blitt brukt i pythonprogrammet ovenfor. Ved å bruke enkel logikk og iterasjoner opprettet vi delingene av bestått PDF i henhold til den beståtte listen deler seg .
5. Legge til vannmerke på PDF-sider
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()> |
Slik ser den første siden av original (venstre) og vannmerket (høyre) PDF-fil ut:
- Hele prosessen er den samme som siderotasjonseksemplet. Eneste forskjellen er:
wmpageObj = add_watermark(mywatermark, pdfReader.pages[page])
- Sideobjekt konverteres til vannmerket sideobjekt ved hjelp av Legg til vannmerke() funksjon.
- La oss prøve å forstå Legg til vannmerke() funksjon:
reader = PdfReader(wmFile) pageObj.merge_page(reader.pages[0]) wmFileObj.close() return pageObj
- Fremst lager vi et PDF-leserobjekt av vannmerke.pdf . Til det beståtte sideobjektet bruker vi merge_page() funksjon og send sideobjektet til den første siden av PDF-leserobjektet for vannmerke. Dette vil legge vannmerket over det passerte sideobjektet.
Og her kommer vi til slutten av denne lange opplæringen om å jobbe med PDF-filer i python.
Nå kan du enkelt lage din egen PDF-behandler!
Referanser:
- https://automatetheboringstuff.com/chapter13/
- https://pypi.org/project/pypdf/
Hvis du liker techcodeview.com og ønsker å bidra, kan du også skrive en artikkel ved å bruke write.techcodeview.com eller sende artikkelen til [email protected]
Vennligst skriv kommentarer hvis du finner noe feil, eller hvis du vil dele mer informasjon om emnet diskutert ovenfor.