1. Code
  2. Python

Come lavorare con i documenti PDF usando Python

Ammiro davvero tanto i file Portable Document Format (PDF). Ricordo i giorni in cui quei files risolvevano ogni problema di formattazione durante lo scambio di files, a causa di differenze nelle versioni di Word o altri problemi/ragioni
Scroll to top

Italian (Italiano) translation by Patrizio Bellan (you can also view the original English article)

Ammiro davvero tanto i file Portable Document Format (PDF). Ricordo i giorni in cui quei files risolvevano ogni problema di formattazione durante lo scambio di files, a causa di differenze  nelle versioni di Word o altri problemi/ragioni

Stiamo parlando di Python, no? Siamo interessati a come lavorare con i documenti PDF. Bene, sai benissimo quanto è semplice, specialmente se hai usato prima Python con i file di testo (txt). Ma qui è un pochino differente. I Documenti pdf sono files binari molto complessi rispetto ai file plaintext, specialmente perchè contengono differenti tipologie di fonts, colori, ecc...

Questo non vuol dire che sarà difficile lavorare con i documenti PDF usando Python; sarà semplicissimo grazie all'uso di moduli esterni.

PyPDF2

Come menzionato sopra, la chiave è usare un modulo esterno. Il modulo usato in questo tutorial sarà PyPDF2 . Dato che è un modulo esterno, il primo passo è installare il modulo. per fare ciò, useremo pip, cioè (estratto da Wikipedia):

il sistema di gestione dei pacchetti, usato per installare e gestire packages scritti in Python. Molti pacchetti si trovano nel Python Package Index (PyPI).

Puoi seguire i passi indicati nel Python Packaging User Guide per installare pip, ma se hai Python 2.7.9 ( o maggiore), o Python 3.4 (o maggiore), hai già pip installato!

PyPDF2 può essere installato semplicemente, scrivendo il seguente comando nel prompt dei comandi (o in Terminal sù Mac OS X)

pip install pypdf2

Ottimo! Adesso che hai PyPDF2 installato, sei pronto a iniziare a giocare con i documenti PDF

Leggere un documento PDF

Il file di esempio che useremo in questo tutorial è sample.pdf Puoi scaricare il file necessario per il tutorial, oppure puoi usare qualsiasi documento PDF tu voglia.

Iniziamo andando a leggere il documento PDF. Prima di usare PyPDF2, abbiamo bisogno di importare il modulo come segue:

import pypdf2

Dopo aver importato il modulo, useremo la classe PdfFileReader Lo script che leggerà il documento PDF apparirà come segue:

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

Altre operazioni sui documenti PDF

Dopo aver letto il documento PDF, possiamo effettuare differenti operazioni sul documento, come vederemo in questa sezione.

Numero di Pagine

Contiamo il numero di pagine in sample.pdf. Per fare questo usiamo il metodo getNumPages() :

1
number_of_pages = read_pdf.getNumPages()
2
print number_of_pages

In questo caso, il metodo ritornerà il valore 1

Numero di Pagina

Andiamo a leggere i numeri di pagina di alcune pagine all'interno del documento PDF. Usiamo il metodo getPageNumber(page),  notate che dobbiamo passare un oggetto di tipo page al metodo. Per ottenere un oggetto page, invocheremo il metodo getPage(number), dove number rappresenta il numero di pagina nel documento PDF. L'argomento number parte con il valore 0.

Bene, lo so che usando getPage(number) conosci già il numero di pagine, ma questo è fatto per illustrare come usare questi metodi insieme. Questo è dimostrato nel seguente script:

1
page = read_pdf.getPage(0)
2
page_number = read_pdf.getPageNumber(page)
3
print page_number

Andiamo avanti, prova lo script. Quale output hai ottenuto?

Sappiamo che in sample.pdf (il file che usiamo per effettuare le prove), ha solo una pagina (number 0). Se passassimo il numero 1 come numero di pagina a getPage(number)? In questo caso otterrai il seguente errore:

1
Traceback (most recent call last):
2
  File "test.py", line 6, in <module>
3
    page = read_pdf.getPage(1)
4
  File "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", line 1158, in getPage
5
    return self.flattenedPages[pageNumber]
6
IndexError: list index out of range

Questo perchè la pagina non è disponibile, dato che abbiamo usato un numero di pagina fuori dal range (delle pagine esistenti).

Modalità Pagina

Le pagine PDF contengono differenti modalità:

/UseNone Non mostrarere outlines o i pannelli thumbnails 
/UseOutlines
Mostra il pannello outlines (ossia i segnalibri)
/UseThumbs
Mostra il pannello thumbnails della pagina  
/FullScreen
Visualizza a tutto schermo
/UseOC
Mostra il pannello Optional Content Group (OCG) 
/UseAttachments
Mostra il pannello degli allegati

Per scoprire la modalità della nostra pagina, possiamo usare il seguente script:

1
page = read_pdf.getPage(0)
2
page_mode = read_pdf.getPageMode()
3
print page_mode

Nel caso in cui il nostro documento PDF (sample.pdf), ritorna il valore None, questo ci specifica che la modalità della pagina non è disponibile. Se vuoi specificare la modalità della pagina, puoi usare il metodo setPageMode(mode), dove mode è uno delle possibilità elencate nella tabella sopra.

Estrarre il testo

Abbiamo dato uno sguardo intorno al file, adesso andiamo a guardare al suo interno. Il metodo extractText() sarà il nostro amico per questo compito.

Permettimi di mostrarti l'intero script, all'opposto di quello che ti ho mostrato prima, mostrandoti solo la parte di script necessaria per effettuare l'operazione. Lo script per estrarre il testo da un documento PDF è il seguente:

1
import PyPDF2
2
pdf_file = open('sample.pdf')
3
read_pdf = PyPDF2.PdfFileReader(pdf_file)
4
number_of_pages = read_pdf.getNumPages()
5
page = read_pdf.getPage(0)
6
page_content = page.extractText()
7
print page_content

Sono rimasto sorpreso quando ho ottenuto il seguente output con sample.pdf :

1
!"#$%#$%&%$&'()*%+,-%./01'*23%4

2
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
3
%

Questo è un errore di codifica del font, poichè il carattere è stato mappato sotto altri valori. Qualche volta capita che ci siano problemi con i documenti PDF, può darsi che il documento PDF non contenga i dati necessari per immagazzinare il contenuto.

Ho provato con un altro file, questo era un mio file: paper.pdf Andiamo avanti e sostituiamo nel codice sample.pdf con paper.pdf. L'output ottenuto in questo caso è:

1
Medical Imaging 2012: Image Perception, Observer Performance, and Technology Assessment, edited by Craig K. Abbey, Claudia R. Mello-Thoms, Proc. of SPIE Vol. 8318, 83181I © 2012 SPIE · CCC code: 1605-7422/12/$18 · doi: 10.1117/12.912389Proc. of SPIE Vol. 8318  83181I-1Downloaded from SPIE Digital Library on 13 Aug 2012 to 134.130.12.208. Terms of Use:  http://spiedl.org/terms

Dov'è il resto del testo della pagina? Attualmente il metodo extractText () non sembra lavorare in modo perfetto, ha bisogno di alcune migliorie. Ma lo scopo di questo tutorial è di mostrarti come lavorare con i files PDF usando Python, i miglioramenti sono da apportare a livello di dominio.

Conclusioni

Come abbiamo potuto vedere, Python rende semplice lavorare con i documenti PDF. In questo tutorial abbiamo dato solo uno sguardo alla superficie di questo argomento, puoi trovare maggiori dettagli e operazioni da eseguire sui tuoi documeti PDF nella pagina di documentazione di PyPDF2.