web-dev-qa-db-ja.com

PyPDF2復号化が機能しない

現在、依存関係としてPyPDF2を使用しています。

私はいくつかの暗号化されたファイルに遭遇し、通常どおりにそれらを処理しました(次のコードで):

    PDF = PdfFileReader(file(pdf_filepath, 'rb'))
    if PDF.isEncrypted:
        PDF.decrypt("")
        print PDF.getNumPages()

私のファイルパスは「〜/ blah/FDJKL492019 21490、LFS.pdf」のようになります。PDF.decrypt( "")は1を返します。これは、成功したことを意味します。ただし、print PDF.getNumPages()を押すと、「PyPDF2.utils.PdfReadError:ファイルが復号化されていません」というエラーが発生します。

このエラーを取り除くにはどうすればよいですか? PDFファイルをダブルクリックするだけで問題なく開くことができます(デフォルトではAdobe Readerで開きます)。

15
Jin Lee

私自身の質問に答えるには:ファイル名にスペースがある場合、PyPDF 2復号化機能は、成功コードを返しても最終的に失敗します。 PyPDF2を実行する前に、PDFに名前を付けるときはアンダースコアに固執するようにしてください。

例えば、

「FDJKL49201921490、LFS.pdf」ではなく、「FDJKL492019_21490_、LFS.pdf」のようにします。

8
Jin Lee

このエラーは、PDFの128ビットAES暗号化が原因で発生する可能性があります。 クエリ-PDFのセキュリティ制限を回避する方法はありますか? を参照してください。

1つの回避策は、「qpdf」を使用してすべてのisEncryptedpdfを復号化することです。

qpdf --password='' --decrypt input.pdf output.pdf

PDFがパスワードで保護されていないように見える場合でも、パスワードなしで暗号化されている可能性があります。上記のスニペットは、これが当てはまると想定しています。

11
Luke Rehmann

次のコードでこの問題を解決できます。

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')
4
mathsyouth

メソッド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()メソッドおよびそれを超える他のメソッドビルドを使用するときにパスワードを渡すことです。

1
Zijian He

qpdf using python with pikepdf library。

import pikepdf

pdf = pikepdf.open('unextractable.pdf')
pdf.save('extractable.pdf')
0

PyMuPDFパッケージを試すことができます。暗号化されたファイルを開いて、私の問題を解決できます。

参照: PyMuPDFドキュメント

0
marcin