2015-01-28 11 views
8

In Python verwende ich pdfminer, um den Text aus einer PDF mit dem Code unter dieser Nachricht zu lesen. Ich bekomme jetzt eine Fehlermeldung sagend:Wie entsperren Sie ein "gesichertes" (lesegeschütztes) PDF 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> 

Als ich dieses pdf mit Acrobat Pro öffnen es stellt sich heraus, dass es gesichert ist (oder „schreibgeschützt“). jedoch von this link, las ich, dass eine Vielzahl von Diensten gibt es die leicht diesen Leseschutz deaktivieren kann (zB pdfunlock.com. Beim Tauchen in die Quelle des pdfminer, sehe ich, dass der Fehler, der oben auf these lines erzeugt wird.

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

Da es eine Vielzahl von Diensten gibt, die diesen Leseschutz innerhalb einer Sekunde deaktivieren können, nehme ich an, dass es wirklich einfach ist.Es scheint, dass .is_extractable ein einfaches Attribut der doc ist, aber ich glaube nicht, dass es so einfach ist Ändern .is_extractable zu True ..

Weiß jemand, wie ich den Read Pro deaktivieren kann auf einem Pdf mit Python? Alle Tipps sind willkommen!

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

Unten finden Sie den Code, mit dem ich derzeit den Text von nicht lesen geschützt extrahieren.

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

Haben Sie versucht, .is_extractable auf True zu ändern? Es gibt tatsächlich eine vernünftige Chance, dass es funktionieren würde. – user3757614

Antwort

9

Soweit ich weiß, in den meisten Fällen kann der gesamte Inhalt des PDF ist tatsächlich verschlüsselt, das Passwort als Schlüssel-Verschlüsselung, und so einfach einstellen .is_extractable-True nicht Sie gehen zu helfen.

Per diesem Thema:

Does a library exist to remove passwords from PDFs programmatically?

ich empfehlen würde den Lese-Schutz mit einem Kommandozeilen-Tool zu entfernen, wie qpdf (leicht installierbar, zB auf Ubuntu apt-get install qpdf verwenden, wenn Sie es nicht haben bereits):

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

dann mit pdfminer die entriegelte Datei öffnen und Ihre Sachen tun.

Für eine reine Python-Lösung, können Sie versuchen PyPDF2 und seine .decrypt() Methode verwendet, aber es mit allen Arten von Verschlüsselung nicht, arbeitet so wirklich, sie ist besser dran qpdf nur - siehe:

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

1

in meinem Fall gibt es kein Passwort, sondern einfach check_extractable=False Einstellung umgangen die PDFTextExtractionNotAllowed Ausnahme für eine problematische Datei (die in anderen Zuschauern fein geöffnet).

+0

Beste Antwort, wenn der Fehler ausgelöst wird, während die Datei nicht verschlüsselt oder passwortgeschützt ist. – Doug713705

Verwandte Themen