Werken met PDF-documenten met Python

Ik bewonder echt Portable Document Format (PDF) -bestanden. Ik herinner me de dagen dat dergelijke bestanden problemen met de opmaak hebben opgelost tijdens het uitwisselen van bestanden vanwege verschillen in Word-versies of om andere redenen.

We praten hier voornamelijk over Python, nietwaar? En we zijn geïnteresseerd om dit te koppelen aan het werken met PDF-documenten. Nou, je zou kunnen zeggen dat het zo simpel is, vooral als je Python eerder hebt gebruikt met tekstbestanden (txt). Maar het is hier een beetje anders. PDF-documenten zijn binaire bestanden en complexer dan alleen gewone tekstbestanden, vooral omdat ze verschillende lettertypen, kleuren enzovoort bevatten.

Dat betekent niet dat het moeilijk is om met PDF-documenten te werken met Python, het is vrij eenvoudig en het gebruik van een externe module lost het probleem op.

PyPDF2

Zoals we hierboven al vermeldden, zou het gebruik van een externe module de sleutel zijn. De module die we zullen gebruiken in deze tutorial is PyPDF2. Omdat het een externe module is, is de eerste normale stap die we moeten nemen, om installeren die module. Daarvoor gebruiken we pip, dat is (op basis van Wikipedia):

Een pakketbeheersysteem dat wordt gebruikt voor het installeren en beheren van softwarepakketten die zijn geschreven in Python. Veel pakketten zijn te vinden in de Python Package Index (PyPI).

U kunt de stappen beschreven in de Python Packaging User Guide volgen voor installatie Pip, maar als je dat hebt gedaan Python 2.7.9 en hoger, of Python 3.4 en hoger, heb je al Pip!

PyPDF2 nu kan eenvoudig worden geïnstalleerd door het volgende commando te typen (in Mac OS X's Terminal):

pip installeer pypdf2

Super goed! Dat heb je nu PyPDF2 geïnstalleerd en u kunt beginnen met het spelen met PDF-documenten.

Een PDF-document lezen

Het voorbeeldbestand waarmee we in deze zelfstudie zullen werken is sample.pdf. Ga je gang en download het bestand om de zelfstudie te volgen, of je kunt eenvoudig elk PDF-bestand gebruiken dat je leuk vindt.

Laten we nu doorgaan en het PDF-document lezen. Omdat we zullen gebruiken PyPDF2, we moeten de module als volgt importeren:

importeer pypdf2

Na het importeren van de module zullen we de klasse PdfFileReader gebruiken. Het script voor het lezen van het PDF-document ziet er dus als volgt uit:

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

Meer bewerkingen op PDF-documenten

Na het lezen van het PDF-document kunnen we nu verschillende bewerkingen op het document uitvoeren, zoals we in dit gedeelte zullen zien.

Aantal pagina's

Laten we het aantal pagina's in sample.pdf controleren. Hiervoor kunnen we de methode getNumPages () gebruiken:

number_of_pages = read_pdf.getNumPages () print number_of_pages

In dit geval zal de geretourneerde waarde zijn 1.

Paginanummer

Laten we nu het nummer van een pagina in het PDF-document controleren. We kunnen de methode gebruiken getPageNumber (pagina), Merk op dat we een object van het type moeten passeren pagina naar de methode. Om een ​​te halen pagina, we zullen de gebruiken getPage (nummer) methode, waar aantal staat voor het paginanummer in het PDF-document. Het argument aantal begint met de waarde 0.

Wel, ik weet wanneer je gebruikt getPage (nummer) je kent het paginanummer al, maar dit is slechts om te illustreren hoe deze methoden samen gebruikt kunnen worden. Dit kan worden aangetoond in het volgende script:

page = read_pdf.getPage (0) page_number = read_pdf.getPageNumber (pagina) print page_number

Ga je gang, probeer het script. Welke output heb je gekregen?

Dat weten we in voorbeeld.pdf (het bestand waarmee we experimenteren), we hebben maar één pagina (nummer 0). Wat als we het nummer hebben doorgegeven 1 als het paginanummer naar getPage (nummer)? In dit geval krijgt u de volgende foutmelding:

Traceback (meest recente oproep laatste): bestand 'test.py', regel 6, in  page = read_pdf.getPage (1) Bestand "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", regel 1158, in getPage return self.flattenedPages [pageNumber] IndexError: lijstindex van reeks

Dit komt omdat de pagina niet beschikbaar is en we een paginanummer buiten bereik gebruiken (bestaat niet).

Paginamodus

De PDF-pagina bevat verschillende modi, die als volgt zijn:

/ UseNone Geen omtrekken of miniaturen weergeven
/ UseOutlines
Toon contouren (ook wel bladwijzers) paneel
/ UseThumbs
Toon paneel met paginaminiaturen
/Volledig scherm
Volledig scherm
/ UseOC
Optional Content Group (OCG) -paneel weergeven
/ UseAttachments
Toon bijlagen paneel

Om onze paginamodus te controleren, kunnen we het volgende script gebruiken:

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

In het geval van ons PDF-document (voorbeeld.pdf), de geretourneerde waarde is geen, wat betekent dat de paginamodus niet is opgegeven. Als u een paginamodus wilt opgeven, kunt u de methode gebruiken setPageMode (modus), waar mode is een van de modi die in de bovenstaande tabel worden vermeld.

Extract Text

We hebben tot nu toe rondgelopen door het bestand, dus laten we eens kijken wat erin zit. De methode extractText () zal onze vriend zijn in deze taak.

Laat me je het volledige script tonen om dat te doen, in tegenstelling tot wat ik hierboven deed om je alleen het vereiste script te tonen om een ​​bewerking uit te voeren. Het script om een ​​tekst uit het PDF-document te extraheren is als volgt:

import 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 () print page_content

Ik was verrast toen ik de volgende uitvoer kreeg in plaats van die in voorbeeld.pdf:

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

Dit komt waarschijnlijk door een probleem met het lettertype, zodat de tekencodes verwijzen naar andere waarden. Het is dus soms een probleem met het PDF-document zelf, omdat het PDF-document mogelijk niet de gegevens bevat die nodig zijn om de inhoud te herstellen.

Ik probeerde dus een ander bestand, dat is een papier van mij: Paper.pdf. Ga je gang en vervang voorbeeld.pdf in de code met Paper.pdf. De uitvoer was in dit geval:

Medical Imaging 2012: Image Perception, Observer Performance en Technology Assessment, uitgegeven door Craig K. Abbey, Claudia R. Mello-Thoms, Proc. van SPIE Vol. 8318, 83181I © 2012 SPIE · CCC-code: 1605-7422 / 12 / $ 18 · doi: 10.1117 / 12.912389Proc. van SPIE Vol. 8318 83181I-1Downloaded van SPIE Digital Library op 13 augustus 2012 naar 134.130.12.208. Gebruiksvoorwaarden: http://spiedl.org/terms

Maar waar is de rest van de tekst op de pagina? Nou ja, eigenlijk het extractText () methode lijkt niet perfect en sommige verbeteringen moeten worden aangebracht. Maar het doel is hier om u te laten zien hoe u met PDF-bestanden werkt met Python, en het lijkt erop dat er enkele verbeteringen moeten worden doorgevoerd in het domein.

Conclusie

Zoals we kunnen zien, maakt Python het eenvoudig om met PDF-documenten te werken. Deze zelfstudie heeft het oppervlak van dit onderwerp net bekrast en u vindt meer informatie over verschillende bewerkingen die u kunt uitvoeren op PDF-documenten op de PyPDF2-documentatiepagina.