Я недавній випускник з чистої математики, який пройшов лише кілька базових курсів програмування. Я проходжу стажування та маю проект внутрішнього аналізу даних. Мені доводиться аналізувати внутрішні PDF-файли останніх років. PDF-файли "захищені". Іншими словами, вони зашифровані. У нас немає паролів PDF, навіть більше, ми не впевнені, чи існують паролі. Але, у нас є всі ці документи, і ми можемо їх читати вручну. Ми також можемо їх надрукувати. Мета полягає в тому, щоб прочитати їх з Python, оскільки мова, якою ми маємо певне уявлення.
По-перше, я спробував прочитати PDF-файли з деякими бібліотеками Python. Однак бібліотеки Python, які я знайшов, не читають зашифровані PDF-файли. У той час я не міг експортувати інформацію за допомогою Adobe Reader.
По-друге, я вирішив розшифрувати PDF-файли. Мені вдалося використовувати pykepdf бібліотеки Python. Pykepdf працює дуже добре! Однак розшифровані PDF-файли також не можна читати з бібліотеками Python попереднього пункту ( PyPDF2 та Tabula ). В цей час ми досягли певного вдосконалення, оскільки за допомогою Adobe Reader я можу експортувати інформацію з розшифрованих PDF-файлів, але мета - зробити все з Python.
Код, який я показую, відмінно працює з незашифрованими PDF-файлами, але не із зашифрованими PDF-файлами. Він не працює з розшифрованими PDF-файлами, отриманими також із pykepdf.
Я не писав код. Я знайшов це в документації бібліотек Python Pykepdf і Tabula . Рішення PyPDF2 було написано Аль Свейгарт у своїй книзі " Автоматизація нудних речей з Python ", яку я дуже рекомендую. Я також перевірив, що код працює нормально, з обмеженнями, які я пояснював раніше.
Перше питання, чому я не можу прочитати розшифровані файли, якщо програми працюють з файлами, які ніколи не були зашифровані?
Друге питання: Чи можемо ми з Python читати розшифровані файли якось? Яка бібліотека може це зробити чи неможливо? Чи всі розшифровані PDF-файли можна отримати?
Дякую за витрачений час та допомогу !!!
Я знайшов ці результати за допомогою Python 3.7, Windows 10, ноутбуків Юпітера та 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()
З Tabula я отримую повідомлення "вихідний файл порожній".
З PyPDF2 я отримую лише "/ n"
ОНОВЛЕННЯ 3.10.2019 Pdfminer.six (версія листопада 2018 р.)
Я отримав кращі результати, використовуючи рішення, розміщене DuckPuncher . Для розшифрованого файлу я отримав мітки, але не дані. Те саме відбувається з зашифрованим файлом. Для файлу, який ніколи не був зашифрований, працює ідеально. Оскільки мені потрібні дані та мітки зашифрованих чи розшифрованих файлів, цей код для мене не працює. Для цього аналізу я використав pdfminer.six, що є бібліотекою Python, яка була випущена в листопаді 2018 року. Pdfminer.six включає бібліотечний пікриптодом. Згідно з їх документацією, " PyCryptodome - це автономний пакет Python криптографічних примітивів низького рівня."
Код у питанні обміну стеками : Вилучення тексту з PDF-файлу за допомогою PDFMiner в python?
Я хотів би, якщо ви хочете повторити мій експеримент. Ось опис:
1) Запустіть коди, згадані в цьому питанні, з будь-яким PDF-файлом, який ніколи не був зашифрований.
2) Зробіть те саме з PDF "Безпечний" (це термін, який використовує Adobe), я називаю це зашифрованим PDF. Використовуйте загальну форму, яку ви можете знайти за допомогою Google. Після завантаження вам потрібно заповнити поля. В іншому випадку ви б перевіряли наявність міток, але не поля. Дані є в полях.
3) Розшифруйте зашифрований PDF за допомогою Pykepdf. Це буде розшифрований PDF.
4) Запустіть коди знову, використовуючи розшифрований PDF.
ОНОВЛЕННЯ 4.10.2019 Camelot (версія липня 2019)
Я знайшов бібліотеку Python Camelot. Будьте уважні, що вам знадобиться камелот-пі 0.7.3.
Він дуже потужний і працює з Python 3.7. Крім того, він дуже простий у використанні. По-перше, вам також потрібно встановити Ghostscript . Інакше це не вийде. Вам також потрібно встановити Pandas . Не використовуйте pip install camelot-py . Замість цього використовуйте pip install camelot-py [cv]
Автор програми - Віняк Мехта. Франк Ду ділиться цим кодом у відео на YouTube "Витяг табличних даних з PDF із Camelot Using Python".
Я перевірив код і він працює з незашифрованими файлами. Однак це не працює із зашифрованими та розшифрованими файлами, і це моя мета .
Camelot орієнтований на отримання таблиць з PDF-файлів.
Ось код:
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)
ОНОВЛЕННЯ 7.10.2019 Я знайшов одну хитрість. Якщо я відкрию захищений pdf за допомогою Adobe Reader і друкую його за допомогою Microsoft у PDF, і зберігаю його як PDF, я можу отримати дані за допомогою цієї копії. Я також можу конвертувати PDF-файл у формати JSON, Excel, SQLite, CSV, HTML та інші формати. Це можливе рішення мого питання. Однак я все ще шукаю варіант зробити це без цього фокусу, оскільки мета - це зробити 100% за допомогою Python. Я також стурбований тим, що якщо використовувати кращий метод шифрування, трюк, можливо, не спрацює. Іноді потрібно отримати Adobe Reader кілька разів, щоб отримати копію, яку можна отримати.
ОНОВЛЕННЯ 8.10.2019. Третє питання. У мене зараз третє питання. Чи всі захищені / зашифровані PDF захищені паролем? Чому pikepdf не працює? Думаю, що поточна версія pikepdf може порушити певний тип шифрування, але не всі. @constt зазначав, що PyPDF2 може зламати певний тип захисту. Однак я відповів йому, що знайшов статтю про те, що PyPDF2 може порушувати шифрування, зроблені за допомогою Adobe Acrobat Pro 6.0, але ні із задніми версіями.
qpdf
для розшифрування файлів? У випадку, якщо це зробить трюк, ви можете викликати його зі свого скрипту за допомогою subprocess
модуля, щоб розшифрувати файли, перш ніж їх розбирати.
PyPDF2
, все працює просто чудово. Я також використовувавpdftk
онлайн-сервіси для шифрування файлів. Чи можете ви розміщувати посилання на "проблемні" файли PDF?