プログラムでPDFファイルにパスワードを設定する方法->ExcelVBA,Python, ほか

ガラパゴスタディーの小川です。

プログラムでPDFファイルにパスワードを設定する方法について問い合わせを受けました。
そのときに調査して得られたノウハウなどなどについて書きます。

最初に相談いただいたのは、年明け早々。
受講生の方からの、こんな内容のメッセージからでした。

PDFにパスワードをつけるコードがわからなくて困ってます。
フリーソフト(QPDF)を ... こちらの講座で対応している講座があればと思いご連絡しました。
既にできあがっているpdfにパスワードを付けるぐらいの対応ですがなにか講義で対応されていますでしょうか。

以下、こんな流れでお話します。

[1] 「QPDF」でのやり方
[2] Pythonでのやり方
[3] Excel VBA でのやり方

なお、[3]については、正攻法(?)は紹介しません。([1], [2] に比して面倒すぎるので)

なお、以下では、パスワードをかける対象のファイルを sample.pdf とします。

[1] 「QPDF」でのやり方

フリーソフトですが、インストール不要で使えます。
コマンドラインから実行します。(なので他のプログラムから呼び出して使うこともできます[後述])

GitHub の以下のページから QPDF をダウンロードします。
https://github.com/qpdf/qpdf/releases/tag/v11.2.0

どれをダウンロードするかは、環境に応じて。

64bit 環境の windows であれば、「qpdf-11.2.0-msvc64.zip」を選択してください。

zip を解凍して、"bin", "include", "lib", "share" というフォルダが見えるフォルダに任意のpdfファイルを置きます。

この場合の PowerShell でのコマンド実行例は以下のとおり。

.\bin\qpdf.exe --encrypt hoge hoge 256 --print=full -- sample.pdf output.pdf

1つ目のhogeは、ユーザパスワード。
これは、文書を開くときのパスワードです。

2つ目のhogeは、オーナーパスワード。
これは、印刷、更新、コピー等の許可を設定するときのパスワードです。

256 は、固定で 256 と書くものと覚えてください。

--print=full はなくても良いのですが、印刷許可をする場合の例です。

-- sample.pdf output.pdf は、 input file, output file を指定しているところです。
ハイフン2つのあと半角スペースが必要です。

[2] Pythonでのやり方

Pythonでは、以下のようなシンプルなコードになります。

PyPDF2 をインストールします。

pip install PyPDF2

そして、以下のコードになります。

from PyPDF2 import PdfReader, PdfWriter

with open("sample.pdf", "rb") as in_file:
    input_pdf = PdfReader(in_file)

    output_pdf = PdfWriter()
    output_pdf.append_pages_from_reader(input_pdf)
    output_pdf.encrypt("hoge")

    with open("output.pdf", "wb") as out_file:
        output_pdf.write(out_file)

これが、いちばん難しくないですね。

[3] Excel VBA でのやり方

エクセルVBAのコードだけでベタにやろうとするとぐちゃぐちゃなコードになります。
「ぐちゃぐちゃ」は適切な表現ではないかもしれませんが...要は、読むのにかなりの力量を必要とします。

以下の記事など見かけますが...大変です。

Office文書をパスワード付きPDFに変換するVBAマクロ
https://www.ka-net.org/blog/?p=12120

それよりも、[1]の延長でエクセルVBAからコマンドを実行するほうが簡単です。

一例を示します。
[1] のときと同じフォルダにエクセルマクロの入ったプログラムを置いて、以下のコードを実行します。

Sub Encrypt_PDF()  
    Dim ShellObj  
    Set ShellObj = CreateObject("WScript.Shell")  
    ShellObj.Run ".\bin\qpdf.exe --encrypt hoge hoge 256 --print=full -- sample.pdf output.pdf"  
End Sub  

上記 [1], [2], [3] を見比べると...というか、 Python の場合と、リンク先のエクセルVBAの場合とを比べると明らかなのですが、 Python のほうがシンプルです。

エクセルVBAは、エクセルには強いです。オフィスソフトとの連携も、かなりできます。
ただ、このあたりを離れるとちょっとしんどい言語です。
テキストファイルの扱いとかになると、文字コードの扱いが大変です。
データベースへの接続も大変です。
ウェブからのデータ取得/データ送信ともなるとかなり大変です。

その点、Pythonだと、エクセルについては、ほぼ問題なし。職人的な見栄えの追求をしないならばそんなに大変ではないです。
むしろ、大量データを扱うならばPythonのほうがやりやすいです。
テキストファイルとかデータベースとかウェブからのデータ取得/データ送信とかは、完全にPythonのほうがおすすめです。

「現業が事務職のプログラミング初心者にはエクセルVBAのほうがPythonよりおすすめ」というのは間違いありません。
ただ、そこそこ書けるようになってきた方には、Pythonもかなりおすすめです。

ガラパゴスタディー 小川

公開日時: 2023/01/10 12:30