Ammiro molto i file Portable Document Format (PDF). Ricordo i giorni in cui tali file risolvevano eventuali problemi di formattazione durante lo scambio di file a causa di alcune differenze nelle versioni di Word o per altri motivi.
Stiamo parlando principalmente di Python qui, no? E siamo interessati a legare questo a lavorare con i documenti PDF. Beh, potresti dire che è così semplice, specialmente se hai già usato Python con file di testo (txt). Ma è un po 'diverso qui. I documenti PDF sono file binari e più complessi dei semplici file di testo, soprattutto perché contengono tipi di carattere, colori e così via.
Ciò non significa che sia difficile lavorare con documenti PDF usando Python, è piuttosto semplice, e l'uso di un modulo esterno risolve il problema.
Come accennato in precedenza, l'utilizzo di un modulo esterno sarebbe la chiave. Il modulo che useremo in questo tutorial è PyPDF2
. Poiché si tratta di un modulo esterno, il primo passo normale che dobbiamo compiere è quello di installare quel modulo. Per questo, useremo pip, che è (basato su Wikipedia):
Un sistema di gestione dei pacchetti usato per installare e gestire pacchetti software scritti in Python. Molti pacchetti possono essere trovati nel Python Package Index (PyPI).
È possibile seguire i passaggi indicati nella Guida dell'utente di Python Packaging per l'installazione seme
, ma se lo hai Python 2.7.9
e più in alto, o Python 3.4
e più in alto, l'hai già fatto seme
!
PyPDF2
ora può essere semplicemente installato digitando il seguente comando (nel terminale di Mac OS X):
pip installa pypdf2
Grande! Ora hai PyPDF2
installato e sei pronto per iniziare a giocare con i documenti PDF.
Il file di esempio con cui lavoreremo in questo tutorial è sample.pdf. Vai avanti e scarica il file per seguire il tutorial, oppure puoi semplicemente utilizzare qualsiasi file PDF che ti piace.
Andiamo avanti e leggiamo il documento PDF. Dal momento che useremo PyPDF2
, dobbiamo importare il modulo, come segue:
importa pypdf2
Dopo aver importato il modulo, utilizzeremo la classe PdfFileReader. Quindi, lo script per leggere il documento PDF ha il seguente aspetto:
import PyPDF2 pdf_file = open ('sample.pdf') read_pdf = PyPDF2.PdfFileReader (pdf_file)
Dopo aver letto il documento PDF, ora possiamo eseguire diverse operazioni sul documento, come vedremo in questa sezione.
Controlliamo il numero di pagine in sample.pdf. Per questo, possiamo usare il metodo getNumPages ():
number_of_pages = read_pdf.getNumPages () stampa numero_di_pagine
In questo caso, il valore restituito sarà 1
.
Controlliamo ora il numero di alcune pagine nel documento PDF. Possiamo usare il metodo getPageNumber (Pagina)
, Si noti che dobbiamo passare un oggetto di tipo pagina
al metodo. Per recuperare a pagina
, useremo il getPage (numero)
metodo, dove numero
rappresenta il numero di pagina nel documento PDF. L'argomento numero
inizia con il valore 0
.
Bene, lo so quando lo usi getPage (numero)
conosci già il numero di pagina, ma questo è solo per illustrare come utilizzare questi metodi insieme. Questo può essere dimostrato nel seguente script:
page = read_pdf.getPage (0) page_number = read_pdf.getPageNumber (pagina) stampa numero_pagina
Vai avanti, prova la sceneggiatura. Che risultato hai ottenuto?
Lo sappiamo esempio.pdf
(il file che stiamo sperimentando), abbiamo solo una pagina (numero 0
). Cosa succede se abbiamo passato il numero 1
come il numero della pagina a getPage (numero)
? In questo caso, otterrai il seguente errore:
Traceback (ultima chiamata più recente): file "test.py", riga 6, inpage = read_pdf.getPage (1) File "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", riga 1158, in getPage return self.flattenedPages [pageNumber] IndexError: elenco indice di gamma
Questo perché la pagina non è disponibile e stiamo usando un numero di pagina fuori dall'intervallo (non esiste).
La pagina PDF ha diverse modalità, che sono le seguenti:
/ UseNone | Non mostrare profili o pannelli di miniature |
/ UseOutlines | Mostra riquadro dei profili (noti anche come segnalibri) |
/ UseThumbs | Mostra il pannello delle miniature delle pagine |
/A schermo intero | Vista a schermo intero |
/ UseOC | Mostra pannello Gruppo di contenuti opzionali (OCG) |
/ UseAttachments | Mostra il pannello degli allegati |
Per verificare la modalità della nostra pagina, possiamo usare il seguente script:
page = read_pdf.getPage (0) page_mode = read_pdf.getPageMode () stampa page_mode
Nel caso del nostro documento PDF (esempio.pdf
), il valore restituito è nessuna
, il che significa che la modalità pagina non è specificata. Se si desidera specificare una modalità pagina, è possibile utilizzare il metodo setPageMode (mode)
, dove modalità
è una delle modalità elencate nella tabella sopra.
Abbiamo girato il file fino ad ora, quindi vediamo cosa c'è dentro. Il metodo extractText ()
sarà nostro amico in questo compito.
Lascia che ti mostri la sceneggiatura completa per farlo, al contrario di ciò che stavo facendo in precedenza, mostrandoti solo lo script richiesto per eseguire un'operazione. Lo script per estrarre un testo dal documento PDF è il seguente:
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 () stampa page_content
Sono rimasto sorpreso quando ho ottenuto il seguente risultato piuttosto che in esempio.pdf
:
!"# $% # $% &% $ & '() *% +, -%. / 01' * 23% 4 5 '% 1 $ # 26% 3 /% 7 /)) / 8% &) / 26 % 8 # 3 "% 3" *% 313/9 # &)%
Ciò è probabilmente dovuto a un problema di carattere, in modo tale che i codici dei caratteri si associno ad altri valori. Quindi a volte è un problema con il documento PDF stesso, in quanto il documento PDF potrebbe non contenere i dati necessari per ripristinare il contenuto.
Ho quindi provato un altro file, che è un mio documento: Paper.pdf
. Vai avanti e sostituisci esempio.pdf
nel codice con Paper.pdf
. L'output in questo caso era:
Medical Imaging 2012: Image Perception, Observer Performance e Technology Assessment, a cura di Craig K. Abbey, Claudia R. Mello-Thoms, Proc. di SPIE Vol. 8318, 83181I © 2012 SPIE · Codice CCC: 1605-7422 / 12 / $ 18 · doi: 10.1117 / 12.912389Proc. di SPIE Vol. 8318 83181I-1 scaricato dalla Libreria digitale SPIE dal 13 agosto 2012 al 134.130.12.208. Termini d'uso: http://spiedl.org/terms
Ma dov'è il resto del testo nella pagina? Bene, in realtà il extractText ()
il metodo sembra non essere perfetto e alcuni miglioramenti devono essere apportati. Ma l'obiettivo qui è mostrarti come lavorare con i file PDF usando Python, e sembra che alcuni miglioramenti debbano essere fatti nel dominio.
Come possiamo vedere, Python semplifica il lavoro con i documenti PDF. Questo tutorial ha appena scalfito la superficie di questo argomento e puoi trovare maggiori dettagli sulle diverse operazioni che puoi eseguire sui documenti PDF sulla pagina di documentazione di PyPDF2.