Python PyMuPDF (Fitz) で PDFファイルにまとめてパスワード保護を設定

この記事では、Python ライブラリの PyMuPDF (Fitz) を使用して PDF ファイルにパスワード保護を設定する方法を解説します。単一のPDF ファイルへの設定と、フォルダ内の複数 PDF ファイルへまとめて設定する方法を紹介します。

環境構築

PyMuPDF (Fitz) をインストールします。ターミナルまたはコマンドプロンプトで以下を実行します。

pip install pymupdf

単一の PDF ファイルにパスワードを設定

PDF ファイルを読み込む

まず、パスワードを設定したい PDF ファイルを読み込みます。

import fitz  # PyMuPDF のモジュール

# PDF ファイルを開く
doc = fitz.open("example.pdf")

# 以降の処理...

fitz.open("example.pdf") で、example.pdf ファイルを開き、doc オブジェクトを作成します。このオブジェクトを介して PDF を操作します。

PDF にパスワードを設定する (基本)

次に、読み込んだ PDF にパスワードを設定し、新しいファイルとして保存します。ここでは、最もシンプルな形でパスワードを設定します。

# 続き...
# パスワードを設定
password = "mypassword"

# パスワード保護をかけて保存
doc.save(
    "protected_example.pdf",  # 保存するファイル名
    encryption=fitz.PDF_ENCRYPT_AES_256,  # 暗号化方式
    user_pw=password,  # ユーザーパスワード
)
doc.close()

doc.save() メソッドを使って、パスワード保護を設定し、protected_example.pdf という名前で保存します。encryption=には暗号化方式を指定します。ここでは、fitz.PDF_ENCRYPT_AES_256 で、暗号化方式を AES 256bit に設定します。これは現時点では最も強力な暗号化方式の一つです。user_pw=password にパスワードを設定します。このパスワードが PDFファイルの保護に利用するものです。

発展: PDF にパスワードと権限を設定する

PDF を開くためのパスワードに加えて、印刷やコピーなどの操作を制限する権限を設定することもできます。

# 続き...

# パスワードを設定
password = "mypassword"

# 権限を設定 (今回は印刷とコピーを許可)
permissions = fitz.PDF_PERM_PRINT | fitz.PDF_PERM_COPY

# パスワード保護と権限設定をして保存
doc.save(
    "protected_example.pdf",
    encryption=fitz.PDF_ENCRYPT_AES_256,
    owner_pw=password,  # オーナーパスワード
    user_pw=password,
    permissions=permissions,
)
doc.close()

permissions 変数で、許可する操作を設定します。fitz.PDF_PERM_PRINT (印刷許可) と fitz.PDF_PERM_COPY (コピー許可) を | (OR演算子) で組み合わせています。owner_pw にも同じパスワードを設定することで、オーナーパスワードとユーザーパスワードを同一にしています。オーナーパスワードを設定すると、権限設定を変更できるようになります。

利用可能な主な権限

定数 説明
fitz.PDF_PERM_PRINT 印刷
fitz.PDF_PERM_COPY 内容のコピー
fitz.PDF_PERM_ANNOTATE 注釈の追加・変更
fitz.PDF_PERM_FORM フォームフィールド入力
fitz.PDF_PERM_ASSEMBLE 文書の組み立て

完成形: コードのまとめ

import fitz

# PDF ファイルを開く
doc = fitz.open("example.pdf")

# パスワードを設定
password = "mypassword"

# 権限を設定 (今回は印刷とコピーを許可)
permissions = fitz.PDF_PERM_PRINT | fitz.PDF_PERM_COPY

# パスワード保護と権限設定をして保存
doc.save(
    "protected_example.pdf",
    encryption=fitz.PDF_ENCRYPT_AES_256,
    owner_pw=password,
    user_pw=password,
    permissions=permissions,
)

# ドキュメントを閉じる
doc.close()

複数の PDF ファイルに一括でパスワードを設定

上記の処理をさらに発展させて、フォルダ内のPDFファイルにまとめてパスワードを設定する方法を紹介します。

フォルダ内の PDF ファイルを検索

特定のフォルダ内の PDF ファイルをリストアップします。

import os
import fitz

# 対象フォルダのパス
folder_path = "path/to/your/folder"  # 実際のフォルダパスに置き換えてください

# PDF ファイルのパスを格納するリスト
pdf_files = []

# フォルダ内のファイルを走査
for filename in os.listdir(folder_path):
    # PDF ファイルのみを対象とする
    if filename.lower().endswith(".pdf"):
        # ファイルパスをリストに追加
        pdf_files.append(os.path.join(folder_path, filename))
#以降の処理

os.listdir(folder_path)folder_path 内のファイル名とフォルダ名を取得します。 .endswith(".pdf") でファイル名の末尾が .pdf であるかをチェックしています。(大文字小文字を区別しないように、.lower()で小文字に変換しています) os.path.join(folder_path, filename) で、フォルダパスとファイル名を結合して、完全なファイルパスを作成し、pdf_files リストに追加します。

各 PDF ファイルにパスワードを設定

リストアップした各 PDF ファイルに、シンプルなパスワード保護を設定します。

# 続き...
# パスワード設定
password = "mypassword"

for pdf_file_path in pdf_files:
    # PDFファイルを開く
    doc = fitz.open(pdf_file_path)
    # パスワード保護を設定し、元のファイルを上書き
    doc.save(
        pdf_file_path,
        encryption=fitz.PDF_ENCRYPT_AES_256,
        user_pw=password
    )
    doc.close()
    print(f"パスワード保護完了: {pdf_file_path}")

pdf_filesリスト内の各PDFファイルパスに対して、fitz.open()でファイルを開きます。 doc.save()でパスワード保護設定を行い、元のファイルパス(pdf_file_path)を指定することでファイルを上書き保存します。 処理完了後、doc.close()でファイルを閉じ、完了メッセージを表示します。

発展: 各 PDF ファイルにパスワードと権限を設定、別名で保存

各 PDF ファイルに対して、パスワードと権限 (印刷とコピーを許可) を設定し、元のファイルとは別の名前で保存します。

#続き
# パスワードを設定
password = "mypassword"

#権限を設定
permissions = fitz.PDF_PERM_PRINT | fitz.PDF_PERM_COPY

for pdf_file_path in pdf_files:
    # PDF ファイルを開く
    doc = fitz.open(pdf_file_path)

    # 新しいファイル名を生成 (元のファイル名_protected.pdf)
    base_name, ext = os.path.splitext(pdf_file_path)
    output_file_path = f"{base_name}_protected{ext}"

    # パスワード保護と権限設定をして、新しいファイル名で保存
    doc.save(
        output_file_path,
        encryption=fitz.PDF_ENCRYPT_AES_256,
        owner_pw=password,
        user_pw=password,
        permissions=permissions,
    )
    doc.close()
    print(f"パスワード保護完了: {output_file_path}")

os.path.splitext(pdf_file_path) でファイルパスをベースネームと拡張子に分割します。f-string を使って、_protected を追加した新しいファイルパス output_file_path を生成します。doc.save() で新しいファイルパスを指定して、パスワード保護と権限設定を適用した PDF を保存します。

完成形: コードのまとめ

フォルダ内の全てのPDFファイルにパスワード保護をかけ、指定したファルだに別名で保存するコードが完成しました。

import os
import fitz

# 対象フォルダのパス
folder_path = "path/to/your/folder"  # 実際のフォルダパスに置き換えてください

# PDF ファイルのパスを格納するリスト
pdf_files = []

# フォルダ内のファイルを走査
for filename in os.listdir(folder_path):
    # PDF ファイルのみを対象とする
    if filename.lower().endswith(".pdf"):
        # ファイルパスをリストに追加
        pdf_files.append(os.path.join(folder_path, filename))

# パスワードを設定
password = "mypassword"

# 権限を設定 (今回は印刷とコピーを許可)
permissions = fitz.PDF_PERM_PRINT | fitz.PDF_PERM_COPY

for pdf_file_path in pdf_files:
    # PDF ファイルを開く
    doc = fitz.open(pdf_file_path)

    # 新しいファイル名を生成 (元のファイル名_protected.pdf)
    base_name, ext = os.path.splitext(pdf_file_path)
    output_file_path = f"{base_name}_protected{ext}"

    # パスワード保護と権限設定をして、新しいファイル名で保存
    doc.save(
        output_file_path,
        encryption=fitz.PDF_ENCRYPT_AES_256,
        owner_pw=password,
        user_pw=password,
        permissions=permissions,
    )
    doc.close()
    print(f"パスワード保護完了: {output_file_path}")

まとめ

PyMuPDF (Fitz) を使うと、Python で高速かつ簡単に PDF にパスワード保護を設定できます。この記事のスクリプトは、ファイルパスやフォルダパスを適切に変更し、必要に応じて権限設定を調整して、すぐに利用できます。PyMuPDF は多機能なので、パスワード保護以外の PDF 操作にも活用できます。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com