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]