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() метод и любой другой метод строят за его пределами