Hvordan jobbe med PDF-dokumenter ved hjelp av Python

Jeg beundrer virkelig Portable Document Format (PDF) -filer. Jeg husker dagene da slike filer løste eventuelle formateringsproblemer mens du utvekslet filer på grunn av enkelte forskjeller i Word-versjoner, eller av andre grunner.

Vi snakker hovedsakelig om Python her, er vi ikke? Og vi er interessert i å knytte det til å jobbe med PDF-dokumenter. Vel, du kan si det er så enkelt, spesielt hvis du har brukt Python med tekstfiler (txt) før. Men det er litt annerledes her. PDF-dokumenter er binære filer og mer komplekse enn bare enkle tekstfiler, spesielt siden de inneholder forskjellige skrifttypetyper, farger osv.

Det betyr ikke at det er vanskelig å jobbe med PDF-dokumenter ved hjelp av Python, det er ganske enkelt, og ved hjelp av en ekstern modul løser problemet.

PyPDF2

Som vi nevnte ovenfor, ville det være nøkkelen å bruke en ekstern modul. Modulen vi skal bruke i denne opplæringen er PyPDF2. Som det er en ekstern modul, er det første normale trinnet vi må ta er å installere den modulen. For det vil vi bruke pip, som er (basert på Wikipedia):

Et pakkehåndteringssystem som brukes til å installere og administrere programvarepakker skrevet i Python. Mange pakker finnes i Python Package Index (PyPI).

Du kan følge trinnene som er nevnt i Python Packaging User Guide for installasjon pip, men hvis du har det Python 2.7.9 og høyere, eller Python 3.4 og høyere, har du allerede pip!

PyPDF2 Nå kan du enkelt installere ved å skrive følgende kommando (i Mac OS Xs terminal):

pip installere pypdf2

Flott! Du har nå PyPDF2 installert, og du er klar til å begynne å spille med PDF-dokumenter.

Leser et PDF-dokument

Eksempelfilen vi skal jobbe med i denne opplæringen er sample.pdf. Gå videre og last ned filen for å følge opplæringen, eller du kan ganske enkelt bruke en PDF-fil du liker.

La oss nå gå videre og lese PDF-dokumentet. Siden vi skal bruke PyPDF2, vi må importere modulen som følger:

importer pypdf2

Etter at du har importert modulen, bruker vi PdfFileReader-klassen. Så ser man skriptet for å lese PDF-dokumentet som følger:

importer PyPDF2 pdf_file = open ('sample.pdf') read_pdf = PyPDF2.PdfFileReader (pdf_file)

Flere operasjoner på PDF-dokumenter

Etter å ha lest PDF-dokumentet, kan vi nå utføre forskjellige operasjoner på dokumentet, slik vi vil se i denne delen.

Antall sider

La oss sjekke antall sider i sample.pdf. For dette kan vi bruke metoden getNumPages ():

number_of_pages = read_pdf.getNumPages () print number_of_pages

I dette tilfellet vil den returnerte verdien være 1.

Side nummer

La oss nå sjekke antall noen sider i PDF-dokumentet. Vi kan bruke metoden getPageNumber (side), Legg merke til at vi må passere et objekt av typen side til metoden. For å hente a side, vi vil bruke getPage (nummer) metode, hvor Nummer representerer sidetallet i PDF-dokumentet. Argumentet Nummer starter med verdien 0.

Vel, jeg vet når du bruker getPage (nummer) Du kjenner allerede sidenummeret, men dette er bare for å illustrere hvordan du bruker disse metodene sammen. Dette kan demonstreres i følgende skript:

side = read_pdf.getPage (0) page_number = read_pdf.getPageNumber (side) print page_number

Fortsett, prøv skriptet. Hvilken utgang fikk du?

Vi vet at i sample.pdf (filen vi eksperimenterer med), vi har bare en side (nummer 0). Hva om vi passerte nummeret 1 som sidenummeret til getPage (nummer)? I dette tilfellet får du følgende feil:

Traceback (siste samtalen sist): File "test.py", linje 6, i  side = read_pdf.getPage (1) Fil "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", linje 1158, i getPage return self.flattenedPages [pageNumber] IndexError: listeindeks ut av område

Dette skyldes at siden ikke er tilgjengelig, og vi bruker et sidetal uten rekkevidde (eksisterer ikke).

Sidemodus

PDF-siden kommer med forskjellige moduser, som er som følger:

/ UseNone Ikke vis konturer eller miniatyrbilder
/ UseOutlines
Vis skisser (aka bokmerker) panel
/ UseThumbs
Vis sideminiatyrpanelet
/Full skjerm
Fullskjermvisning
/ UseOC
Vis panel for valgfritt innholdsgruppe (OCG)
/ UseAttachments
Vis vedleggspanelet

For å sjekke vår sidemodus kan vi bruke følgende skript:

side = read_pdf.getPage (0) page_mode = read_pdf.getPageMode () print page_mode

I tilfelle av vårt PDF-dokument (sample.pdf), er den returnerte verdien ingen, noe som betyr at sidemodus ikke er spesifisert. Hvis du vil spesifisere en sidemodus, kan du bruke metoden setPageMode (modus), hvor modus er en av modusene som er oppført i tabellen ovenfor.

Utdrag tekst

Vi har vandret rundt filen så langt, så la oss se hva som er inni. Metoden extractText () vil være vår venn i denne oppgaven.

La meg vise deg det fulle skriptet for å gjøre det, i motsetning til det jeg gjorde over i å vise deg bare det nødvendige skriptet for å utføre en operasjon. Skriptet for å trekke ut en tekst fra PDF-dokumentet er som følger:

importere PyPDF2 pdf_file = open ('sample.pdf') read_pdf = PyPDF2.PdfFileReader (pdf_file) number_of_pages = read_pdf.getNumPages () side = read_pdf.getPage (0) page_content = page.extractText () skriv ut page_content

Jeg ble overrasket da jeg fikk følgende utgang i stedet for det i sample.pdf:

!"# $% # $% &% $ & '() *% +, -%. / 01' * 23% 4 5 '% 1 $ # 26% 3 /% 7 /)) / 8% % 8 # 3 "% 3" *% 313/9 # &)%

Dette skyldes mest sannsynligvis et skriftproblem, slik at tegnet koder kartet til andre verdier. Så det er noen ganger et problem med selve PDF-dokumentet, da PDF-dokumentet kanskje ikke inneholder dataene som kreves for å gjenopprette innholdet.

Jeg prøvde dermed en annen fil, som er et papir av meg: paper.pdf. Gå videre og erstatt sample.pdf i koden med paper.pdf. Utgangen i dette tilfellet var:

Medisinsk Imaging 2012: Image Perception, Observer Performance, og Technology Assessment, redigert av Craig K. Abbey, Claudia R. Mello-Thoms, Proc. av SPIE Vol. 8318, 83181I © 2012 SPIE · CCC-kode: 1605-7422 / 12 / $ 18 · doi: 10.1117 / 12.912389Proc. av SPIE Vol. 8318 83181I-1Downloadet fra SPIE Digital Library på 13 Aug 2012 til 134,130.12.208. Vilkår for bruk: http://spiedl.org/terms

Men hvor er resten av teksten på siden? Vel, faktisk extractText () Metoden synes ikke å være perfekt, og noen forbedringer må gjøres. Men målet her er å vise deg hvordan du arbeider med PDF-filer ved hjelp av Python, og det virker som noen forbedringer må gjøres i domenet.

Konklusjon

Som vi kan se, gjør Python det enkelt å arbeide med PDF-dokumenter. Denne opplæringen har bare riper overflaten på dette emnet, og du kan finne flere detaljer om ulike operasjoner du kan utføre på PDF-dokumenter på PyPDF2-dokumentasjonssiden.