【Python】PyPDF2でPDFデータのパスワードを解除(復号)する方法

python
スポンサーリンク
ピーター
ピーター

PythonでPDFデータを読み込んだらパスワードが掛かっていて読めない!

という問題に副業中に起きたため、今回はPythonでPDFデータに設定されているパスワードを解除する方法について記載します。

今回の記事では、PyPDF2を使ってPDFデータの

  • パスワードが設定されている確認する方法
  • パスワードを解除する方法

について説明します。

pdf2imageでパスワードを解除する方法は見つからなかったので、パスワードの設定を解除する場合は、こちらの方法で実装する必要があります。



PyPDF2のインストール

pipでインストールしている場合のコマンド

pip install pypdf2

PyPDF2の情報はこちらです。

https://pythonhosted.org/PyPDF2/

PythonでPDFデータのパスワードを確認するためのコード

パスワードを確認する際は、isEncrypted()を使います。パスワードが掛かっている場合は、PDFデータを開くことができません。

from PyPDF2 import PdfFileReader

input_pdf_path = 'in_pdf/sample.pdf'
pdf = PdfFileReader(str(input_pdf_path))

print(pdf.isEncrypted)
# パスワード設定されている場合:True
# パスワード設定されていない場合:False

これでパスワードの有無を確認ができるのでシンプルですね!

PythonでPDFデータのパスワードを解除するためのコード

パスワードを解除する際は、decrypt()を使います。

  • パスワードが一致していない場合:0
  • ユーザーパスワードと一致している場合:1(PDFデータを開くことが可能)
  • オーナーパスワードと一致している場合:2(PDFデータの印刷、更新、コピーが可能)
from PyPDF2 import PdfFileReader

input_pdf_path = 'in_pdf/sample.pdf'
pdf = PdfFileReader(str(input_pdf_path))

print(pdf.decrypt('password'))
# パスワードが一致していない場合;0
# ユーザーパスワードが一致している場合;1
#    ユーザーパスワードはPDFデータを開くためのパスワード
# オーナーパスワードが一致している場合;2
#    オーナーパスワードはPDFデータを印刷、更新、コピー等をするためのパスワード

これでパスワードの有無を確認ができるのでシンプルですね!

ピーター
ピーター

PDFデータを確認したり、解除するケースもあるのでコードとして実装しています!

パスワード解除時にNotImplementedErrorが出た場合の対処方法

上の実装でパスワード解除しようとした場合、以下のようなエラーコードが出る可能性があります。

NotImplementedError: only algorithm code 1 and 2 are supported

実装していない場合に、NotImplementedErrorのエラーが出るようです。。。実装されていない!?

ということで、ピーターも同じ問題に遭遇したので、調べて解決した方法を紹介します。

対応方針

  1. パスワード無視でPDFを開く(pikepdf
  2. 開いたら別名で保存する(pikepdf)
  3. 別名保存したPDFを開く(PyPDF2)

という流れで処理するといいでしょう!それにより、パスワード付きでもPyPDF2の処理を利用できます。

pikepdfのインストール

pipでインストールしている場合のコマンド

pip install pikepdf

サンプルコード

from PyPDF2 import PdfFileReader
import pikepdf

input_pdf_path = 'in_pdf/sample.pdf'
pdf = PdfFileReader(str(input_pdf_path))

if pdf.isEncrypted:
    pdf2 = pikepdf.open(input_pdf_path)
    tmp_pdf_path = "tmp.pdf"
    pdf2.save(tmp_pdf_path)
    pdf = PdfFileReader(tmp_pdf_path)

pikepdfでとりあえずPDFファイルを開く→保存→再びPDFを開くという流れが実現できます。

次に紹介する記事を見ると、PDFファイルに保存しないで、PyPDF2で処理を進める方法について紹介しています。

その他のPDF関連記事

パソコンの性能によっては、PDFのページ数が多い場合にエラーとなってしまうケースがあります。

その回避方法についてもはこの記事を参考にしてください!

参考にしたサイト

NotImplementedError問題のいい解決方法を紹介しているサイトです!

コメント

ランキング

タイトルとURLをコピーしました