Jestem niedawnym absolwentem czystej matematyki, który odbył tylko kilka podstawowych kursów programowania. Robię staż i mam wewnętrzny projekt analizy danych. Muszę przeanalizować wewnętrzne pliki PDF z ostatnich lat. Pliki PDF są „zabezpieczone”. Innymi słowy, są one szyfrowane. Nie mamy haseł PDF, co więcej, nie jesteśmy pewni, czy istnieją hasła. Ale mamy wszystkie te dokumenty i możemy je odczytać ręcznie. Możemy je również wydrukować. Celem jest przeczytanie ich w Pythonie, ponieważ jest to język, który mamy jakiś pomysł.
Najpierw próbowałem odczytać pliki PDF w niektórych bibliotekach Python. Jednak biblioteki Pythona, które znalazłem, nie czytają zaszyfrowanych plików PDF. W tym czasie nie mogłem również wyeksportować informacji za pomocą programu Adobe Reader.
Po drugie, postanowiłem odszyfrować pliki PDF. Udało mi się użyć pykepdf z biblioteki Python. Pykepdf działa bardzo dobrze! Jednak odszyfrowanych plików PDF nie można również odczytać za pomocą bibliotek Pythona z poprzedniego punktu ( PyPDF2 i Tabula ). W tej chwili wprowadziliśmy pewne ulepszenia, ponieważ za pomocą programu Adobe Reader mogę eksportować informacje z odszyfrowanych plików PDF, ale celem jest zrobienie wszystkiego za pomocą Pythona.
Kod, który pokazuję, działa idealnie z niezaszyfrowanymi plikami PDF, ale nie z zaszyfrowanymi plikami PDF. Nie działa również z odszyfrowanymi plikami PDF, które zostały uzyskane przy pomocy pykepdf.
Nie napisałem kodu. Znalazłem to w dokumentacji bibliotek Pythona Pykepdf i Tabula . Rozwiązanie PyPDF2 zostało napisane przez Al Sweigarta w jego książce „ Automate the Boring Stuff with Python ”, którą bardzo polecam. Sprawdziłem również, czy kod działa poprawnie, z ograniczeniami, które wcześniej wyjaśniłem.
Pierwsze pytanie, dlaczego nie mogę odczytać odszyfrowanych plików, jeśli programy działają z plikami, które nigdy nie zostały zaszyfrowane?
Drugie pytanie: czy możemy jakoś odczytać w Pythonie odszyfrowane pliki? Która biblioteka może to zrobić, czy jest to niemożliwe? Czy wszystkie odszyfrowane pliki PDF można wyodrębnić?
Dziękuję za twój czas i pomoc!!!
Znalazłem te wyniki przy użyciu Python 3.7, Windows 10, Jupiter Notebooks i 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()
W przypadku Tabuli pojawia się komunikat „plik wyjściowy jest pusty”.
Dzięki PyPDF2 otrzymuję tylko „/ n”
AKTUALIZACJA 10/3/2019 Pdfminer.six (wersja z listopada 2018 r.)
Lepsze wyniki uzyskałem dzięki rozwiązaniu opublikowanemu przez DuckPuncher . Dla odszyfrowanego pliku dostałem etykiety, ale nie dane. To samo dzieje się z zaszyfrowanym plikiem. Do pliku, który nigdy nie był zaszyfrowany, działa idealnie. Ponieważ potrzebuję danych i etykiet zaszyfrowanych lub odszyfrowanych plików, ten kod nie działa dla mnie. Do tej analizy wykorzystałem pdfminer.six , czyli bibliotekę Python wydaną w listopadzie 2018 roku. Pdfminer.six zawiera pycryptodome biblioteki. Według ich dokumentacji „ PyCryptodome jest samodzielnym pakietem Pythona niskopoziomowych prymitywów kryptograficznych ..”
Kod znajduje się w pytaniu dotyczącym wymiany stosów: Wyodrębnianie tekstu z pliku PDF za pomocą programu PDFMiner w pythonie?
Chciałbym, jeśli chcesz powtórzyć mój eksperyment. Oto opis:
1) Uruchom kody wymienione w tym pytaniu z dowolnym plikiem PDF, który nigdy nie został zaszyfrowany.
2) Zrób to samo z „Bezpiecznym” plikiem PDF (jest to termin, którego używa Adobe), nazywam go zaszyfrowanym plikiem PDF. Użyj ogólnego formularza, który można znaleźć za pomocą Google. Po pobraniu musisz wypełnić pola. W przeciwnym razie sprawdzane byłyby etykiety, ale nie pola. Dane są w polach.
3) Odszyfruj zaszyfrowany plik PDF za pomocą Pykepdf. To będzie odszyfrowany plik PDF.
4) Uruchom kody ponownie, używając odszyfrowanego pliku PDF.
AKTUALIZACJA 10/4/2019 Camelot (wersja lipiec 2019)
Znalazłem bibliotekę Python Camelot. Bądź ostrożny, że potrzebujesz camelot-py 0.7.3.
Jest bardzo wydajny i współpracuje z Pythonem 3.7. Jest również bardzo łatwy w użyciu. Najpierw musisz również zainstalować Ghostscript . W przeciwnym razie to nie zadziała. Musisz także zainstalować Pandy . Nie używaj pip install camelot-py . Zamiast tego użyj pip install camelot-py [cv]
Autorem programu jest Vinayak Mehta. Frank Du udostępnia ten kod w filmie na YouTube „Wyodrębnij dane tabelaryczne z pliku PDF za pomocą Camelot za pomocą Pythona”.
Sprawdziłem kod i działa on z nieszyfrowanymi plikami. Jednak nie działa z zaszyfrowanymi i odszyfrowanymi plikami i to jest mój cel .
Camelot jest zorientowany na pobieranie tabel z plików PDF.
Oto kod:
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)
AKTUALIZACJA 10/7/2019 Znalazłem jedną sztuczkę. Jeśli otworzę zabezpieczony plik PDF w programie Adobe Reader i wydrukuję go przy użyciu programu Microsoft do formatu PDF i zapiszę go jako plik PDF, mogę wyodrębnić dane przy użyciu tej kopii. Mogę również przekonwertować plik PDF na JSON, Excel, SQLite, CSV, HTML i inne formaty. To możliwe rozwiązanie mojego pytania. Jednak wciąż szukam opcji, aby to zrobić bez tej sztuczki, ponieważ celem jest zrobienie tego w 100% z Pythonem. Obawiam się również, że zastosowanie lepszej metody szyfrowania może nie zadziałać. Czasami trzeba użyć programu Adobe Reader kilka razy, aby uzyskać ekstrakt.
AKTUALIZACJA 10/8/2019. Trzecie pytanie. Mam teraz trzecie pytanie. Czy wszystkie zabezpieczone / zaszyfrowane pliki pdf są chronione hasłem? Dlaczego pikepdf nie działa? Domyślam się, że obecna wersja pikepdf może złamać jakiś rodzaj szyfrowania, ale nie wszystkie. @constt wspomniał, że PyPDF2 może złamać jakiś rodzaj ochrony. Odpowiedziałem mu jednak, że znalazłem artykuł, w którym PyPDF2 może złamać szyfrowanie wykonane za pomocą Adobe Acrobat Pro 6.0, ale nie w późniejszych wersjach.
qpdf
do odszyfrowania plików? Jeśli to zrobi, możesz wywołać go ze skryptu za pomocą subprocess
modułu do odszyfrowania plików przed ich analizą.
PyPDF2
, wszystko działa dobrze.pdftk
Do szyfrowania plików korzystałem również z usług online. Czy możesz publikować linki do „kłopotliwych” plików pdf?