web-dev-qa-db-ja.com

「保護された」(読み取り保護された)ロックを解除する方法PDF Pythonで?

Python私は pdfminer を使用して、このメッセージの下のコードでPDFからテキストを読み取っています。次のようなエラーメッセージが表示されます:

File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfpage.py", line 124, in get_pages
    raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp)
PDFTextExtractionNotAllowed: Text extraction is not allowed: <cStringIO.StringO object at 0x7f79137a1
ab0>

このPDFをAcrobat Proで開くと、保護されている(または「読み取り保護」されている)ことがわかります。 this link から、ただし、この読み取り保護を簡単に無効にできるサービスが多数あると読みました(例 pdfunlock.com 。pdfminerのソースに飛び込むと、上記のエラーは these lines で生成されることがわかります。

if check_extractable and not doc.is_extractable:
    raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp)

この読み取り保護を1秒以内に無効にできるサービスは多数あるので、それは本当に簡単だと思います。 .is_extractabledocの単純な属性のようですが、.is_extractableをTrueに変更するほど単純ではないと思います。

Pythonを使用してPDFの読み取り保護を無効にする方法を誰かが知っていますか?すべてのヒントは大歓迎です!

================================================

以下に、現在読み取り禁止になっているテキストを抽出するコードを示します。

def getTextFromPDF(rawFile):
    resourceManager = PDFResourceManager(caching=True)
    outfp = StringIO()
    device = TextConverter(resourceManager, outfp, codec='utf-8', laparams=LAParams(), imagewriter=None)
    interpreter = PDFPageInterpreter(resourceManager, device)

    fileData = StringIO()
    fileData.write(rawFile)
    for page in PDFPage.get_pages(fileData, set(), maxpages=0, caching=True, check_extractable=True):
        interpreter.process_page(page)
    fileData.close()
    device.close()

    result = outfp.getvalue()

    outfp.close()
    return result
14
kramer65

私の知る限り、ほとんどの場合、PDFの完全なコンテンツは実際にはパスワードを暗号化キーとして使用して暗号化されているため、単に_.is_extractable_をTrueはあなたを助けにはなりません。

このスレッドごと:

プログラムからPDFからパスワードを削除するためのライブラリーはありますか?

qpdfなどのコマンドラインツールを使用して読み取り保護を削除することをお勧めします(たとえば、Ubuntuで_apt-get install qpdf_をまだ使用していない場合は、簡単にインストールできます)。

_qpdf --password=PASSWORD --decrypt SECURED.pdf UNSECURED.pdf
_

次に、pdfminerを使用してロック解除されたファイルを開き、作業を行います。

純粋なPythonソリューションの場合は、_PyPDF2_とその.decrypt()メソッドを使用してみることができますが、すべてのタイプの暗号化では機能しないため、実際にはqpdf-参照:

https://github.com/mstamy2/PyPDF2/issues/5

18
Jaza

私のプログラムでqpdfを動作させるためにいくつかの問題がありました。 qpdfに基づいており、pdfを自動的に抽出可能に変換する便利なライブラリ pikepdf を見つけました。

これを使用するコードは非常に簡単です。

import pikepdf

pdf = pikepdf.open('unextractable.pdf')
pdf.save('extractable.pdf')
8
IanJ

私の場合、パスワードはありませんでしたが、単にcheck_extractable=Falseは、問題のあるファイル(他のビューアで正常に開いた)のPDFTextExtractionNotAllowed例外を回避しました。

2
jtlz2

「check_extractable = True」引数は仕様です。一部のPDFはテキストの抽出を明示的に禁止しており、PDFMinerはこのディレクティブに従います。これはオーバーライドできます(check_extractable = Falseを指定)。ただし、自己責任で実行してください。

1
AlfyFaisy

名前を変更せずにフォルダー内のすべてのPDFファイルのロックを解除する場合は、次のコードを使用できます。

import glob, os, pikepdf

p = os.getcwd()
for file in glob.glob('*.pdf'):
   file_path = os.path.join(p, file).replace('\\','/')
   init_pdf = pikepdf.open(file_path)
   new_pdf = pikepdf.new()
   new_pdf.pages.extend(init_pdf.pages)
   new_pdf.save(str(file))

pikepdf ライブラリでは、同じ名前で保存して既存のファイルを上書きすることはできません。対照的に、新しく作成した空のPDFファイルにページをコピーして保存します。

0
komutohirowato

次の2行にコメントすることをお勧めします。

ファイル "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfpage.py"、124行、get_pagesでPDFTextExtractionNotAllowedをレイズ( 'テキスト抽出は許可されていません:%r'%fp)

0
mikewolfli

私も保護されたPDFを解析する同じ問題に直面しましたが、pikepdfライブラリを使用して解決されました。私はjupyter notebbokとwindows osでこのライブラリを試しましたが、エラーが発生しましたが、Ubuntuでスムーズに動作しました

0
Knoweldgeyog