
PythonでPDFデータを読み込んだらパスワードが掛かっていて読めない!
という問題に副業中に起きたため、今回はPythonでPDFデータに設定されているパスワードを解除する方法について記載します。
今回の記事では、PyPDF2を使ってPDFデータの
- パスワードが設定されている確認する方法
- パスワードを解除する方法
について説明します。
pdf2imageでパスワードを解除する方法は見つからなかったので、パスワードの設定を解除する場合は、こちらの方法で実装する必要があります。
PyPDF2のインストール
pipでインストールしている場合のコマンド
pip install pypdf2
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のエラーが出るようです。。。実装されていない!?
ということで、ピーターも同じ問題に遭遇したので、調べて解決した方法を紹介します。
対応方針
- パスワード無視でPDFを開く(pikepdf)
- 開いたら別名で保存する(pikepdf)
- 別名保存した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問題のいい解決方法を紹介しているサイトです!
コメント