2015-01-28 10 views
8

In Python sto usando pdfminer per leggere il testo da un pdf con il codice sotto questo messaggio. Io ora ottenere un messaggio di errore che dice:Come sbloccare un PDF "protetto" (protetto da lettura) in Python?

File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfpage.py", line 124, in get_pages 
    raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) 
PDFTextExtractionNotAllowed: Text extraction is not allowed: <cStringIO.StringO object at 0x7f79137a1 
ab0> 

Quando apro questo PDF con Acrobat Pro si scopre che è fissato (o "lettura protetta"). Da this link però, ho letto che c'è una moltitudine di servizi che possono disattivare questa protezione read-facilmente (ad esempio pdfunlock.com. Quando ci si immerge nella fonte di pdfminer, vedo che l'errore precedente viene generato sul these lines.

if check_extractable and not doc.is_extractable: 
    raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) 

Dato che c'è una moltitudine di servizi che possono disabilitare questa protezione di lettura entro un secondo, presumo sia molto facile da fare. Sembra che lo .is_extractable sia un semplice attributo dello doc, ma non penso sia semplice come modifica di .is_extractable in True.

Qualcuno sa come posso disabilitare la lettura pro tection su un pdf usando Python? Tutti i suggerimenti sono ben accetti!

========================================= ==

Di seguito è riportato il codice con cui attualmente estraggo il testo da non protetto protetto.

def getTextFromPDF(rawFile): 
    resourceManager = PDFResourceManager(caching=True) 
    outfp = StringIO() 
    device = TextConverter(resourceManager, outfp, codec='utf-8', laparams=LAParams(), imagewriter=None) 
    interpreter = PDFPageInterpreter(resourceManager, device) 

    fileData = StringIO() 
    fileData.write(rawFile) 
    for page in PDFPage.get_pages(fileData, set(), maxpages=0, caching=True, check_extractable=True): 
     interpreter.process_page(page) 
    fileData.close() 
    device.close() 

    result = outfp.getvalue() 

    outfp.close() 
    return result 
+0

Hai provato a cambiare .is_extractable su True? C'è in realtà una ragionevole possibilità che funzioni. – user3757614

risposta

9

Per quanto ne so, nella maggior parte dei casi l'intero contenuto del PDF è in realtà criptato, utilizzando la password come chiave di crittografia, e così semplicemente impostando .is_extractable-True non sta andando per aiutarvi.

Per questa discussione:

Does a library exist to remove passwords from PDFs programmatically?

consiglierei di rimuovere la lettura di protezione con uno strumento da riga di comando come qpdf (facilmente installabile, per esempio su Ubuntu utilizzare apt-get install qpdf se non ce l'hai già):

qpdf --password=PASSWORD --decrypt SECURED.pdf UNSECURED.pdf 

quindi aprire il file sbloccato con pdfminer e fare le tue cose.

Per una soluzione pura-Python, è possibile provare a utilizzare PyPDF2 e il suo metodo .decrypt(), ma non funziona con tutti i tipi di crittografia, in modo davvero, è meglio usando solo qpdf - vedi:

https://github.com/mstamy2/PyPDF2/issues/53

1

nel mio caso non c'era alcuna password, ma semplicemente impostando check_extractable=False aggirato l'eccezione PDFTextExtractionNotAllowed per un file problematico (che ha aperto bene in altri spettatori).

+0

Risposta migliore quando l'errore viene generato mentre il file non è crittografato né protetto da password. – Doug713705