Ich bin ein Absolvent der reinen Mathematik, der nur wenige grundlegende Programmierkurse belegt hat. Ich mache ein Praktikum und habe ein internes Datenanalyseprojekt. Ich muss die internen PDFs der letzten Jahre analysieren. Die PDFs sind "gesichert". Mit anderen Worten, sie sind verschlüsselt. Wir haben keine PDF-Passwörter, noch mehr, wir sind nicht sicher, ob Passwörter existieren. Wir haben jedoch alle diese Dokumente und können sie manuell lesen. Wir können sie auch drucken. Das Ziel ist es, sie mit Python zu lesen, da wir in dieser Sprache eine Idee haben.
Zuerst habe ich versucht, die PDFs mit einigen Python-Bibliotheken zu lesen. Die gefundenen Python-Bibliotheken lesen jedoch keine verschlüsselten PDFs. Zu diesem Zeitpunkt konnte ich die Informationen auch nicht mit Adobe Reader exportieren.
Zweitens habe ich beschlossen, die PDFs zu entschlüsseln. Ich war erfolgreich mit der Python-Bibliothek pykepdf. Pykepdf funktioniert sehr gut! Die entschlüsselten PDFs können jedoch nicht so gut mit den Python-Bibliotheken des vorherigen Punkts ( PyPDF2 und Tabula ) gelesen werden . Zu diesem Zeitpunkt haben wir einige Verbesserungen vorgenommen, da ich mit Adobe Reader die Informationen aus den entschlüsselten PDF-Dateien exportieren kann. Ziel ist es jedoch, alles mit Python zu erledigen.
Der Code, den ich zeige, funktioniert perfekt mit unverschlüsselten PDFs, aber nicht mit verschlüsselten PDFs. Es funktioniert nicht mit den entschlüsselten PDFs, die auch mit pykepdf erstellt wurden.
Ich habe den Code nicht geschrieben. Ich fand es in der Dokumentation der Python-Bibliotheken Pykepdf und Tabula . Die PyPDF2-Lösung wurde von Al Sweigart in seinem Buch " Automate the Boring Stuff with Python " geschrieben, das ich sehr empfehlen kann. Ich habe auch überprüft, ob der Code mit den zuvor erläuterten Einschränkungen einwandfrei funktioniert.
Erste Frage, warum ich die entschlüsselten Dateien nicht lesen kann, wenn die Programme mit Dateien arbeiten, die noch nie verschlüsselt wurden?
Zweite Frage: Können wir mit Python die entschlüsselten Dateien irgendwie lesen? Welche Bibliothek kann das oder ist es unmöglich? Sind alle entschlüsselten PDFs extrahierbar?
Vielen Dank für Ihre Zeit und Hilfe !!!
Ich habe diese Ergebnisse mit Python 3.7, Windows 10, Jupiter Notebooks und Anaconda 2019.07 gefunden.
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()
Mit Tabula erhalte ich die Meldung "Die Ausgabedatei ist leer".
Mit PyPDF2 bekomme ich nur '/ n'
UPDATE 03.10.2019 Pdfminer.six (Version November 2018)
Mit der von DuckPuncher veröffentlichten Lösung habe ich bessere Ergebnisse erzielt . Für die entschlüsselte Datei habe ich die Etiketten bekommen, aber nicht die Daten. Gleiches passiert mit der verschlüsselten Datei. Denn die noch nie verschlüsselte Datei funktioniert einwandfrei. Da ich die Daten und Beschriftungen von verschlüsselten oder entschlüsselten Dateien benötige, funktioniert dieser Code bei mir nicht. Für diese Analyse habe ich pdfminer.six verwendet , eine Python-Bibliothek, die im November 2018 veröffentlicht wurde. Pdfminer.six enthält eine Bibliothek pycryptodome. Laut ihrer Dokumentation "ist PyCryptodome ein in sich geschlossenes Python-Paket von kryptografischen Grundelementen auf niedriger Ebene."
Der Code befindet sich in der Stapelaustauschfrage : Extrahieren von Text aus einer PDF-Datei mit PDFMiner in Python?
Ich würde mich freuen, wenn Sie mein Experiment wiederholen möchten. Hier ist die Beschreibung:
1) Führen Sie die in dieser Frage genannten Codes mit allen PDF-Dateien aus, die noch nie verschlüsselt wurden.
2) Machen Sie dasselbe mit einem PDF "Sicher" (dies ist ein Begriff, den Adobe verwendet). Ich nenne es das verschlüsselte PDF. Verwenden Sie ein allgemeines Formular, das Sie mit Google finden können. Nachdem Sie es heruntergeladen haben, müssen Sie die Felder ausfüllen. Andernfalls würden Sie nach Beschriftungen suchen, aber nicht nach Feldern. Die Daten befinden sich in den Feldern.
3) Entschlüsseln Sie das verschlüsselte PDF mit Pykepdf. Dies ist das entschlüsselte PDF.
4) Führen Sie die Codes erneut mit dem entschlüsselten PDF aus.
UPDATE 04.10.2019 Camelot (Version Juli 2019)
Ich habe die Python-Bibliothek Camelot gefunden. Achten Sie darauf, dass Sie camelot-py 0.7.3 benötigen.
Es ist sehr leistungsfähig und funktioniert mit Python 3.7. Es ist auch sehr einfach zu bedienen. Zunächst müssen Sie auch Ghostscript installieren . Andernfalls funktioniert es nicht. Sie müssen auch Pandas installieren . Verwenden Sie nicht pip install camelot-py . Verwenden Sie stattdessen pip install camelot-py [cv]
Der Autor des Programms ist Vinayak Mehta. Frank Du teilt diesen Code in einem YouTube-Video "Extrahieren von Tabellendaten aus PDF mit Camelot mit Python".
Ich habe den Code überprüft und er funktioniert mit unverschlüsselten Dateien. Es funktioniert jedoch nicht mit verschlüsselten und entschlüsselten Dateien, und das ist mein Ziel .
Camelot ist darauf ausgerichtet, Tabellen aus PDFs abzurufen.
Hier ist der Code:
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)
UPDATE 07.10.2019 Ich habe einen Trick gefunden. Wenn ich das gesicherte PDF mit Adobe Reader öffne und es mit Microsoft als PDF drucke und als PDF speichere, kann ich die Daten mit dieser Kopie extrahieren. Ich kann die PDF-Datei auch in JSON, Excel, SQLite, CSV, HTML und andere Formate konvertieren. Dies ist eine mögliche Lösung für meine Frage. Ich bin jedoch immer noch auf der Suche nach einer Option, um dies ohne diesen Trick zu tun, da das Ziel darin besteht, dies zu 100% mit Python zu tun. Ich mache mir auch Sorgen, dass der Trick möglicherweise nicht funktioniert, wenn eine bessere Verschlüsselungsmethode verwendet wird. Manchmal müssen Sie Adobe Reader mehrmals verwenden, um eine extrahierbare Kopie zu erhalten.
UPDATE 08.10.2019. Dritte Frage. Ich habe jetzt eine dritte Frage. Sind alle gesicherten / verschlüsselten PDFs passwortgeschützt? Warum funktioniert pikepdf nicht? Ich vermute, dass die aktuelle Version von pikepdf einige Verschlüsselungen aufheben kann, aber nicht alle. @constt erwähnte, dass PyPDF2 irgendeine Art von Schutz aufheben kann. Ich antwortete ihm jedoch, dass ich einen Artikel gefunden habe, in dem PyPDF2 Verschlüsselungen aufheben kann, die mit Adobe Acrobat Pro 6.0 erstellt wurden, aber keine mit früheren Versionen.
quelle
PyPDF2
, alles funktioniert einwandfrei. Ich habepdftk
neben Online-Diensten auch Dateien verschlüsselt. Können Sie Links zu "problematischen" PDF-Dateien veröffentlichen?qpdf
Ihre Dateien zu entschlüsseln? In dem Fall, dass es den Trick macht, können Sie es von Ihrem Skript aus mit einemsubprocess
Modul aufrufen , um Dateien zu entschlüsseln, bevor Sie sie analysieren.Antworten:
LETZTE AKTUALISIERUNG 10-11-2019
Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe. Der folgende Code kann verfeinert werden, liest jedoch entweder eine verschlüsselte oder eine unverschlüsselte PDF-Datei ein und extrahiert den Text. Bitte lassen Sie mich wissen, wenn ich Ihre Anforderungen falsch verstanden habe.
Ich habe festgestellt, dass in Ihrem Pikepdf- Code zum Öffnen einer verschlüsselten PDF-Datei ein Kennwort fehlt, das diese Fehlermeldung hätte auslösen müssen:
Sie können tika verwenden , um den Text aus der von pikepdf erstellten entschlüsselten.pdf zu extrahieren .
Ich beschloss, ein paar Tests mit verschiedenen verschlüsselten PDF-Dateien durchzuführen.
Ich habe alle verschlüsselten Dateien "encrypted.pdf" genannt und sie haben alle dasselbe Verschlüsselungs- und Entschlüsselungskennwort verwendet.
Adobe Acrobat 9.0 und höher - Verschlüsselungsstufe 256-Bit-AES
Adobe Acrobat 6.0 und höher - Verschlüsselungsstufe 128-Bit-RC4
Adobe Acrobat 3.0 und höher - Verschlüsselungsstufe 40-Bit-RC4
Adobe Acrobat 5.0 und höher - Verschlüsselungsstufe 128-Bit-RC4
Adobe Acrobat 9.0 und höher - Verschlüsselungsstufe 256-Bit-AES
PyPDF2 kann Acrobat PDF-Dateien nicht entschlüsseln => 6.0
PyPDF4- Entschlüsselungsprobleme
UPDATE ABSCHNITT 10-11-2019
Sicherheitsstufe von Adobe PDFs
Adobe PDFs verfügen über mehrere Arten von Sicherheitskontrollen, die vom Eigentümer des Dokuments aktiviert werden können. Die Steuerelemente können entweder mit einem Kennwort oder einem Zertifikat erzwungen werden.
Dokumentenverschlüsselung (erzwungen mit einem Passwort zum Öffnen von Dokumenten)
Restriktives Bearbeiten und Drucken (erzwungen mit einem Berechtigungskennwort)
Das folgende Bild zeigt ein Adobe PDF, das mit 256-Bit-AES-Verschlüsselung verschlüsselt wird. Zum Öffnen oder Drucken dieser PDF-Datei ist ein Passwort erforderlich. Wenn Sie dieses Dokument in Adobe Reader mit dem Kennwort öffnen, lautet der Titel SECURED
Für dieses Dokument ist ein Kennwort erforderlich, um mit den in dieser Antwort genannten Python-Modulen geöffnet zu werden. Wenn Sie versuchen, eine verschlüsselte PDF-Datei mit Adobe Reader zu öffnen. Sie sollten dies sehen:
Wenn Sie diese Warnung nicht erhalten, sind für das Dokument entweder keine Sicherheitskontrollen aktiviert oder nur die restriktiven Bearbeitungs- und Druckkontrollen aktiviert.
Das Bild unten zeigt, wie die restriktive Bearbeitung mit einem Kennwort in einem PDF-Dokument aktiviert wird. Das Drucken von Notizen ist aktiviert . Zum Öffnen oder Drucken dieser PDF-Datei ist kein Passwort erforderlich . Wenn Sie dieses Dokument in Adobe Reader ohne Kennwort öffnen, lautet der Titel SECURED lautet Dies ist dieselbe Warnung wie die verschlüsselte PDF-Datei, die mit einem Kennwort geöffnet wurde.
Wenn Sie dieses Dokument in eine neue PDF-Datei drucken, wird die Warnung SECURED entfernt, da die restriktive Bearbeitung entfernt wurde.
Alle Adobe-Produkte erzwingen die durch das Berechtigungskennwort festgelegten Einschränkungen. Wenn Produkte von Drittanbietern diese Einstellungen jedoch nicht unterstützen, können Dokumentempfänger einige oder alle der festgelegten Einschränkungen umgehen .
Bezüglich der Unterbrechung der PDF-Verschlüsselung
Weder PyPDF2 noch PyPDF4 sind dafür ausgelegt, die Kennwortfunktion zum Öffnen eines Dokuments eines PDF-Dokuments zu unterbrechen . Beide Module geben den folgenden Fehler aus, wenn sie versuchen, eine verschlüsselte passwortgeschützte PDF-Datei zu öffnen.
Die Funktion zum Öffnen des Kennworts einer verschlüsselten PDF-Datei kann mit verschiedenen Methoden umgangen werden. Eine einzelne Technik funktioniert jedoch möglicherweise nicht und einige sind aufgrund verschiedener Faktoren, einschließlich der Komplexität des Kennworts, nicht akzeptabel.
Die PDF-Verschlüsselung funktioniert intern mit Verschlüsselungsschlüsseln von 40, 128 oder 256 Bit, abhängig von der PDF-Version. Der binäre Verschlüsselungsschlüssel wird von einem vom Benutzer bereitgestellten Kennwort abgeleitet. Das Passwort unterliegt Längen- und Codierungsbeschränkungen.
In PDF 1.7 Adobe Extension Level 3 (Acrobat 9 - AES-256) wurden beispielsweise Unicode-Zeichen (65.536 mögliche Zeichen) eingeführt und die maximale Länge in der UTF-8-Darstellung des Kennworts auf 127 Byte erhöht.
quelle
Sie können versuchen, den Fehler zu behandeln, den diese Dateien verursachen, wenn Sie diese Dateien ohne Kennwort öffnen.
Sie können das zurückgegebene pdf_obj für Ihre Parsing-Arbeit verwenden. Sie können das Kennwort auch angeben, falls Sie eine verschlüsselte PDF-Datei haben.
quelle
Für tabula-py können Sie die Kennwortoption mit read_pdf ausprobieren. Es hängt von der Funktion von tabula-java ab, daher bin ich mir nicht sicher, welche Verschlüsselung unterstützt wird.
quelle