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