PyPDF 2 Расшифровать Не Работает
В настоящее время я использую PyPDF 2 в качестве зависимости.
я столкнулся с некоторыми зашифрованными файлами и обработал их как обычно (в следующем коде):
PDF = PdfFileReader(file(pdf_filepath, 'rb'))
if PDF.isEncrypted:
PDF.decrypt("")
print PDF.getNumPages()
мой путь к файлу выглядит примерно так: "~ / blah / FDJKL492019 21490 ,LFS.документ pdf" ДОКУМЕНТ PDF.расшифровка("") возвращает 1, Что означает, что он был успешным. Но когда он попадает в печать PDF.getNumPages(), все еще возникает ошибка, "PyPDF2.а utils.PdfReadError: файл не был расшифрован".
Как мне избавиться об этой ошибке? Я могу открыть файл PDF просто отлично двойным щелчком мыши (который по умолчанию открывается с помощью Adobe Reader).
4 ответов
эта ошибка может возникнуть из-за 128-битного шифрования AES в pdf, см. https://github.com/mstamy2/PyPDF2/issues/53
один обходной путь-расшифровать все зашифрованные PDF-файлы с помощью "qpdf"
qpdf --password='' --decrypt input.pdf output.pdf
даже если ваш PDF-файл не защищен паролем, он все равно может быть зашифрован без пароля. Приведенный выше фрагмент предполагает, что это так.
Чтобы Ответить На Мой Собственный Вопрос: Если у вас есть пробелы в имени файла, то функция дешифрования pypdf 2 в конечном итоге завершится неудачей, несмотря на возврат кода успеха. Попробуйте придерживаться подчеркивания при именовании ваших PDF-файлов, прежде чем запускать их через PyPDF2.
например,
вместо " FDJKL492019 21490, LFS.pdf " сделайте что-то вроде "FDJKL492019_21490_,LFS.документ PDF."
следующий код может решить эту проблему:
import os
import PyPDF2
from PyPDF2 import PdfFileReader
fp = open(filename)
pdfFile = PdfFileReader(fp)
if pdfFile.isEncrypted:
try:
pdfFile.decrypt('')
print('File Decrypted (PyPDF2)')
except:
command = ("cp "+ filename +
" temp.pdf; qpdf --password='' --decrypt temp.pdf " + filename
+ "; rm temp.pdf")
os.system(command)
print('File Decrypted (qpdf)')
fp = open(filename)
pdfFile = PdfFileReader(fp)
else:
print('File Not Encrypted')
это не имеет ничего общего с Ли файл был расшифрован или нет при использовании метода getNumPages()
.
если мы посмотрим на исходный код getNumPages()
:
def getNumPages(self):
"""
Calculates the number of pages in this PDF file.
:return: number of pages
:rtype: int
:raises PdfReadError: if file is encrypted and restrictions prevent
this action.
"""
# Flattened pages will not work on an Encrypted PDF;
# the PDF file's page count is used in this case. Otherwise,
# the original method (flattened page count) is used.
if self.isEncrypted:
try:
self._override_encryption = True
self.decrypt('')
return self.trailer["/Root"]["/Pages"]["/Count"]
except:
raise utils.PdfReadError("File has not been decrypted")
finally:
self._override_encryption = False
else:
if self.flattenedPages == None:
self._flatten()
return len(self.flattenedPages)
заметим, что это self.isEncrypted
свойство, управляющее потоком. И как мы все знаем isEncrypted
свойство доступно только для чтения и не изменяется даже при расшифровке pdf.
таким образом, простой способ справиться с ситуацией - просто добавить пароль в качестве аргумента ключевого слова с пустым строка в качестве значения по умолчанию и передать пароль при использовании getNumPages()
метод и любой другой метод строят за его пределами