Come lavorare con documenti PDF usando Python

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.

PyPDF2

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.

Leggere un documento 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)

Più operazioni su documenti PDF

Dopo aver letto il documento PDF, ora possiamo eseguire diverse operazioni sul documento, come vedremo in questa sezione.

Numero di pagine

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.

Numero di pagina

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, in  page = 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).

Modalità Pagina

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.

Estrai testo

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.

Conclusione

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.