Hur man arbetar med PDF-dokument med Python

Jag beundrar verkligen Portable Document Format (PDF) -filer. Jag kommer ihåg de dagar då sådana filer löste några formateringsproblem medan du bytte filer på grund av vissa skillnader i Word-versioner eller av andra skäl.

Vi talar främst om Python här, är vi inte? Och vi är intresserade av att koppla det till att arbeta med PDF-dokument. Tja, du kanske säger att det är så enkelt, speciellt om du har använt Python med textfiler (txt) innan. Men det är lite annorlunda här. PDF-dokument är binära filer och mer komplexa än bara rentextfiler, särskilt eftersom de innehåller olika typsnitt, färger etc..

Det betyder inte att det är svårt att arbeta med PDF-dokument med Python, det är ganska enkelt, och med en extern modul löser problemet.

PyPDF2

Som vi nämnde ovan skulle det vara nyckeln att använda en extern modul. Modulen vi ska använda i denna handledning är PyPDF2. Eftersom det är en extern modul, är det första normala steget vi måste ta är att Installera den modulen. För det ska vi använda pip, vilket är (baserat på Wikipedia):

Ett pakethanteringssystem som används för att installera och hantera mjukvarupaket som är skrivna i Python. Många paket finns i Python Package Index (PyPI).

Du kan följa stegen som nämns i Python Packaging User Guide för installation pip, men om du har det python 2.7.9 och högre, eller python 3,4 och högre har du redan pip!

PyPDF2 Nu kan du enkelt installera genom att skriva följande kommando (i Mac OS X: s terminal):

pip installera pypdf2

Bra! Du har nu PyPDF2 installerat, och du är redo att börja spela med PDF-dokument.

Läser ett PDF-dokument

Den provfil vi ska arbeta med i denna handledning är sample.pdf. Gå vidare och ladda ner filen för att följa handledningen, eller du kan helt enkelt använda en PDF-fil du vill ha.

Låt oss nu gå vidare och läsa PDF-dokumentet. Eftersom vi kommer att använda PyPDF2, vi måste importera modulen enligt följande:

importera pypdf2

Efter att ha importerat modulen använder vi PdfFileReader-klassen. Så ser skriptet för att läsa PDF-dokumentet som följer:

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

Fler operationer på PDF-dokument

Efter att ha läst PDF-dokumentet kan vi nu utföra olika operationer på dokumentet, som vi kommer att se i det här avsnittet.

Antal sidor

Låt oss kolla antalet sidor i sample.pdf. För detta kan vi använda metoden getNumPages ():

number_of_pages = read_pdf.getNumPages () print number_of_pages

I det här fallet kommer det returnerade värdet att vara 1.

Sidonummer

Låt oss nu kolla numret på en viss sida i PDF-dokumentet. Vi kan använda metoden getPageNumber (sida), Observera att vi måste vidarebefordra ett objekt av typen sida till metoden. För att hämta a sida, vi kommer att använda getPage (antal) metod, var siffra representerar sidnumret i PDF-dokumentet. Argumentet siffra börjar med värdet 0.

Tja, jag vet när du använder getPage (antal) du vet redan sidnummer, men det här är bara för att illustrera hur man använder dessa metoder tillsammans. Detta kan visas i följande skript:

page = read_pdf.getPage (0) page_number = read_pdf.getPageNumber (sida) skriv ut sidan_number

Fortsätt, prova manuset. Vilken produkt fick du?

Vi vet att i exempel.pdf (filen vi experimenterar med), vi har bara en sida (nummer 0). Vad händer om vi passerade numret 1 som sidnummer till getPage (antal)? I det här fallet får du följande fel:

Traceback (senaste samtal senast): Fil "test.py", rad 6, in  sida = read_pdf.getPage (1) Fil "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", rad 1158, i getPage return self.flattenedPages [pageNumber] IndexError: listindex ut av räckvidd

Detta beror på att sidan inte är tillgänglig, och vi använder ett sidnummer utanför intervallet (existerar inte).

Sidläge

PDF-sidan kommer med olika lägen, som är följande:

/ UseNone Visa inte konturer eller miniatyrbilder
/ UseOutlines
Visa konturer (aka bokmärken)
/ UseThumbs
Visa sidminiaturpanelen
/Fullskärm
Fullskärmsvisning
/ UseOC
Visa panel för valfri innehållsgrupp (OCG)
/ UseAttachments
Visa bilagan

För att kontrollera vårt sidläge kan vi använda följande skript:

page = read_pdf.getPage (0) page_mode = read_pdf.getPageMode () skriv ut sidan_mode

När det gäller vårt PDF-dokument (exempel.pdf) är det returnerade värdet ingen, vilket innebär att sidläget inte är angivet. Om du vill ange ett sidläge kan du använda metoden setPageMode (läge), var läge är ett av de lägen som anges i tabellen ovan.

Extrahera text

Vi har hittills vandrat runt filen, så låt oss se vad som finns inuti. Metoden extractText () kommer att vara vår vän i denna uppgift.

Låt mig visa dig det fulla skriptet för att göra det, i motsats till vad jag gjorde ovan för att visa dig bara det obligatoriska skriptet för att utföra en operation. Skriptet för att extrahera en text från PDF-dokumentet är som följer:

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

Jag blev förvånad när jag fick följande produktion istället för den där exempel.pdf:

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

Detta beror troligtvis på en typsnittsproblem, så att tecknet koderna över till andra värden. Så det är ibland ett problem med själva PDF-dokumentet, eftersom PDF-dokumentet kanske inte innehåller de data som krävs för att återställa innehållet.

Jag försökte sålunda en annan fil, som är ett av mina papper: paper.pdf. Fortsätt och byt ut exempel.pdf i koden med paper.pdf. Utgången i detta fall var:

Medicinsk bildbehandling 2012: Bilduppfattning, Observatörsprestation och Teknikbedömning, redigerad av Craig K. Abbey, Claudia R. Mello-Thoms, Proc. av SPIE Vol. 8318, 83181I © 2012 SPIE · CCC-kod: 1605-7422 / 12 / $ 18 · doi: 10.1117 / 12.912389Proc. av SPIE Vol. 8318 83181I-1Downloads från SPIE Digital Library den 13 aug 2012 till 134,130.12.208. Villkor för användning: http://spiedl.org/terms

Men var är resten av texten på sidan? Jo, faktiskt extractText () Metoden verkar inte vara perfekt, och vissa förbättringar måste göras. Men målet är att visa dig hur man arbetar med PDF-filer med Python, och det verkar som att vissa förbättringar måste göras på domänen.

Slutsats

Som vi kan se, gör Python det enkelt att arbeta med PDF-dokument. Denna handledning skrapade bara ytan på detta ämne och du kan hitta mer information om olika operationer som du kan utföra på PDF-dokument på PyPDF2-dokumentationssidan.