Sono un neolaureato in matematica pura che ha frequentato solo pochi corsi di programmazione di base. Sto facendo uno stage e ho un progetto interno di analisi dei dati. Devo analizzare i PDF interni degli ultimi anni. I PDF sono "protetti". In altre parole, sono crittografati. Non abbiamo password PDF, ancora di più, non siamo sicuri che esistano password. Ma abbiamo tutti questi documenti e possiamo leggerli manualmente. Possiamo anche stamparli. L'obiettivo è leggerli con Python perché è il linguaggio che abbiamo qualche idea.
Innanzitutto, ho provato a leggere i PDF con alcune librerie Python. Tuttavia, le librerie Python che ho trovato non leggono PDF crittografati. A quel tempo, non potevo nemmeno esportare le informazioni usando Adobe Reader.
In secondo luogo, ho deciso di decrittografare i PDF. Ho avuto successo usando la libreria Python pykepdf. Pykepdf funziona molto bene! Tuttavia, i PDF decrittografati non possono essere letti anche con le librerie Python del punto precedente ( PyPDF2 e Tabula ). In questo momento, abbiamo apportato alcuni miglioramenti perché utilizzando Adobe Reader posso esportare le informazioni dai PDF decrittografati, ma l'obiettivo è fare tutto con Python.
Il codice che sto mostrando funziona perfettamente con i PDF non crittografati, ma non con i PDF crittografati. Non funziona anche con i PDF decrittografati ottenuti con pykepdf.
Non ho scritto il codice. L'ho trovato nella documentazione delle librerie Python Pykepdf e Tabula . La soluzione PyPDF2 è stata scritta da Al Sweigart nel suo libro " Automate the Boring Stuff with Python ", che consiglio vivamente. Ho anche verificato che il codice funzioni correttamente, con i limiti che ho spiegato prima.
Prima domanda, perché non riesco a leggere i file decifrati, se i programmi funzionano con file che non sono mai stati crittografati?
Seconda domanda, possiamo leggere in qualche modo con Python i file decifrati? Quale libreria può farlo o è impossibile? Tutti i PDF decrittografati sono estraibili?
Grazie per il tuo tempo e aiuto !!!
Ho trovato questi risultati usando Python 3.7, Windows 10, Jupiter Notebooks e Anaconda 2019.07.
Python
import pikepdf
with pikepdf.open("encrypted.pdf") as pdf:
num_pages = len(pdf.pages)
del pdf.pages[-1]
pdf.save("decrypted.pdf")
import tabula
tabula.read_pdf("decrypted.pdf", stream=True)
import PyPDF2
pdfFileObj=open("decrypted.pdf", "rb")
pdfReader=PyPDF2.PdfFileReader(pdfFileObj)
pdfReader.numPages
pageObj=pdfReader.getPage(0)
pageObj.extractText()
Con Tabula, ricevo il messaggio "il file di output è vuoto".
Con PyPDF2, ottengo solo '/ n'
AGGIORNAMENTO 03/10/2019 Pdfminer.six (Versione novembre 2018)
Ho ottenuto risultati migliori usando la soluzione pubblicata da DuckPuncher . Per il file decrittografato, ho ottenuto le etichette, ma non i dati. Lo stesso succede con il file crittografato. Per il file che non è mai stato crittografato funziona perfettamente. Poiché ho bisogno dei dati e delle etichette dei file crittografati o decrittografati, questo codice non funziona per me. Per tale analisi, ho usato pdfminer.six che è la libreria Python che è stata rilasciata a novembre 2018. Pdfminer.six include una libreria pycryptodome. Secondo la loro documentazione " PyCryptodome è un pacchetto Python autonomo di primitive crittografiche di basso livello .."
Il codice è nella domanda di scambio di stack: estrarre testo da un file PDF usando PDFMiner in Python?
Mi piacerebbe se volessi ripetere il mio esperimento. Ecco la descrizione:
1) Esegui i codici menzionati in questa domanda con qualsiasi PDF che non sia mai stato crittografato.
2) Fai lo stesso con un PDF "Sicuro" (questo è un termine usato da Adobe), lo chiamo PDF crittografato. Utilizza un modulo generico che puoi trovare utilizzando Google. Dopo averlo scaricato, è necessario compilare i campi. Altrimenti, verifichi le etichette, ma non i campi. I dati sono nei campi.
3) Decifrare il PDF crittografato utilizzando Pykepdf. Questo sarà il PDF decrittografato.
4) Eseguire nuovamente i codici utilizzando il PDF decrittografato.
AGGIORNAMENTO 04/10/2019 Camelot (Versione luglio 2019)
Ho trovato la libreria Python Camelot. Fai attenzione che hai bisogno di Camelot-Py 0.7.3.
È molto potente e funziona con Python 3.7. Inoltre, è molto facile da usare. Innanzitutto, devi anche installare Ghostscript . Altrimenti, non funzionerà. Devi anche installare Panda . Non utilizzare pip install camelot-py . Invece usa pip install camelot-py [cv]
L'autore del programma è Vinayak Mehta. Frank Du condivide questo codice in un video di YouTube "Estrai dati tabulari da PDF con Camelot utilizzando Python."
Ho controllato il codice e funziona con file non crittografati. Tuttavia, non funziona con file crittografati e decrittografati, e questo è il mio obiettivo .
Camelot è orientato per ottenere tabelle da PDF.
Ecco il codice:
Python
import camelot
import pandas
name_table = camelot.read_pdf("uncrypted.pdf")
type(name_table)
#This is a Pandas dataframe
name_table[0]
first_table = name_table[0]
#Translate camelot table object to a pandas dataframe
first_table.df
first_table.to_excel("unencrypted.xlsx")
#This creates an excel file.
#Same can be done with csv, json, html, or sqlite.
#To get all the tables of the pdf you need to use this code.
for table in name_table:
print(table.df)
AGGIORNAMENTO 07/10/2019 Ho trovato un trucco. Se apro il pdf protetto con Adobe Reader e lo stampo utilizzando Microsoft in PDF e lo salvo in formato PDF, posso estrarre i dati utilizzando quella copia. Posso anche convertire il file PDF in JSON, Excel, SQLite, CSV, HTML e altri formati. Questa è una possibile soluzione alla mia domanda. Tuttavia, sto ancora cercando un'opzione per farlo senza quel trucco perché l'obiettivo è farlo al 100% con Python. Sono anche preoccupato che se si utilizza un metodo di crittografia migliore, il trucco potrebbe non funzionare. A volte è necessario utilizzare più volte Adobe Reader per ottenere una copia estraibile.
AGGIORNAMENTO 10/8/2019. Terza domanda Ora ho una terza domanda. Tutti i pdf protetti / crittografati sono protetti da password? Perché pikepdf non funziona? La mia ipotesi è che l'attuale versione di pikepdf possa rompere qualche tipo di crittografia, ma non tutte. @constt ha affermato che PyPDF2 può rompere qualche tipo di protezione. Tuttavia, gli ho risposto che ho trovato un articolo che PyPDF2 può violare le crittografie fatte con Adobe Acrobat Pro 6.0, ma no con le versioni posteriori.
qpdf
per decrittografare i tuoi file? Nel caso in cui farà il trucco, puoi chiamarlo dal tuo script usando il subprocess
modulo per decrittografare i file prima di analizzarli.
PyPDF2
, tutto funziona bene. Ho usatopdftk
così come i servizi online per crittografare i file. Puoi pubblicare collegamenti a file pdf "fastidiosi"?