Labo288

プログラミングのこと、GISのこと、パソコンのこと、趣味のこと

パスワード付きのPDFを解除して保存するPythonスクリプト


はじめに

書類データといえば皆だいすきPDF、パスワード保護が可能で、その場合開くたびにパスワードを要求されます。 セキュリティ上パスワードがかかっている方が都合が良い事もありますが、パスワード無しで保存したい場合もあるのではないでしょうか。 今回は、Pythonでパスワードロックを解除したPDFを別名保存するスクリプトを作成しました。

PythonにおけるPDFの取扱い

PDFを読み書きするライブラリは複数あるようですが、一番オーソドックスなのはPyPDF2でしょう。

www.soudegesu.com

こちらのサイトをはじめとして、様々な情報がネット上に存在しているため作成もしやすいのではないでしょうか。 しかしながら、このサイトに記載されているとおり、PyPDF2でロックを解除できるPDFファイルは、バージョンの古いPDFに限られています。その回避方法として、一般的にはqpdfというC++ライブラリが紹介されています。

PyPDF2とqpdfによるパスワードロック解除手順

実際のコードだとかは上記のサイト等を参照してください。こちらでは概要だけを説明します。 基本的にはPython上で、PyPDF2を利用してPDFを操作していきます。しかしながら、新しいバージョンのPDFファイルを読み込むと、PyPDF2はエラーを出力します。その場合に限り、qpdfにコマンドを送信してロックを解除する、という手順です。 これでも解除はできるのですが、どうせならPythonだけで完結したい(qpdfを別にインストールする必要があるから)。 という事でいろいろ調べました。

qpdfに代わるPythonライブラリpikepdf

github.com

こちらのpikepdfは、詳細はよく調べてませんが、「powered by qpdf」との記載があり、C++で書かれたqpdfをもとにしたライブラリのようです。ライセンスはMPL。このライブラリを利用すると、新しいバージョンのPDFファイルでもパスワードロックを解除して保存する事が出来ます。そんなスクリプトを書きました。ほんとはPySide2でGUIを作っているんですが、各OS用の実行ファイルのビルドがうまくいかないのでスクリプトを載せます。

PDFUnlocker

github.com ここにあるpdfunlocker.pyがそのスクリプトです。 ファイル名をパスワードと同じ文字列にして、スクリプトにドラッグドロップするか、以下の手順で変換して下さい。 なお、使用するためにはpikepdfのインストールが必要です。(pip install pikepdf)

※2/25追記 Windows32bitで(たぶん)動作する実行ファイルを作成しました。python環境などと関係なく実行出来るはずです。 パスワードロックを解除したいPDFのファイル名を「(パスワードの文字列).pdf」として、.exeにドラッグドロップしてください。 同じディレクトリに「decrypt.pdf」という名前でPDFファイルを出力します。

※ターミナルで実行する場合 python pdfunlocker.py PASSWORD.pdf pdfunlocker.pyのあるディレクトリで実行するか、絶対パスで参照してください。

おわりに

そのうちGUI作るので勘弁してください!