PythonでPDFセキュリティを強化:PyPDF2でパスワード設定・解除(暗号化・復号)


 


PDF(Portable Document Format)ファイルは、ビジネス文書の配布や共有に広く利用されています。しかし、機密情報を含むPDFを扱う場合、そのセキュリティを確保することが非常に重要です。Pythonの**PyPDF2ライブラリを使えば、PDFファイルにパスワードを設定して暗号化したり、パスワードを解除して復号**したりといった操作を簡単に行うことができます。

この記事では、PyPDF2を用いたPDFのパスワード設定と解除の基本的な手順を、短いサンプルコードとともに分かりやすく解説します。Pythonを使ってPDFドキュメントのセキュリティ管理を自動化したいと考えている方にとって、必見の内容です。


 

なぜPDFにパスワードを設定するのか?

 

PDFにパスワードを設定する主な理由は、情報の機密性を保護し、不正なアクセスや改ざんを防ぐためです。

 

セキュリティの強化

 

  • 機密情報の保護: 契約書、財務諸表、個人情報など、外部に漏洩してはならない情報をPDFで共有する際に、パスワードで保護することで安全性を高めます。

  • アクセス制限: 特定の権限を持つユーザーのみがPDFを閲覧できるように制限できます。

 

ドキュメントの整合性

 

  • 改ざん防止: パスワードによって、PDFの内容が勝手に変更されるのを防ぐことができます。


 

PyPDF2とは?

 

PyPDF2は、PythonでPDFファイルを操作するための強力なライブラリです。PDFの結合、分割、ページの抽出、透かしの追加、そして今回解説するパスワードによる暗号化・復号など、多岐にわたる機能を提供します。

 

インストール方法

 

使用する前に、pipコマンドでインストールが必要です。

Bash
 
pip install PyPDF2

 

PDFにパスワードを設定する(暗号化)

 

PDFにパスワードを設定することで、ファイルの内容を暗号化し、許可されたユーザーのみがアクセスできるようにします。PyPDF2では、PdfWriterオブジェクトとencrypt()メソッドを使用します。

 

基本的な暗号化の手順

 

  1. PdfReaderで元のPDFを読み込む: 暗号化したいPDFファイルを開きます。

  2. PdfWriterオブジェクトを作成する: 新しいPDFを作成するためのオブジェクトです。

  3. ページをコピーする: PdfReaderからPdfWriterにすべてのページをコピーします。

  4. encrypt()メソッドでパスワードを設定する: ここでパスワードを指定します。

  5. 新しいPDFファイルとして保存する: パスワードが設定されたPDFファイルを書き出します。

Python
 
from PyPDF2 import PdfWriter, PdfReader
import os

# --- テスト用のPDFファイルを仮作成 (中身は空でも可) ---
# この部分はPyPDF2では直接できませんが、説明のために存在すると仮定
# 例: 'original.pdf' という空のPDFファイルが事前に用意されているとする
# または、簡単なPDFを作成する他の方法 (例: reportlab) を使う

# 実際に処理するPDFファイル名
original_pdf_file = "original.pdf"
encrypted_pdf_file = "encrypted_document.pdf"

# テスト用に簡単なPDFを準備 (既存のPDFがない場合)
# 通常は手動で作成したPDFや、他のプログラムで生成したPDFを使います
# ここではダミーとして空のPDFを作成する(もしファイルが存在しない場合のみ)
if not os.path.exists(original_pdf_file):
    temp_writer = PdfWriter()
    temp_writer.add_blank_page(500, 700) # 空白ページを追加
    with open(original_pdf_file, "wb") as f:
        temp_writer.write(f)
    print(f"テスト用に '{original_pdf_file}' を作成しました。\n")
# ----------------------------------------------------


try:
    # 1. 元のPDFを読み込む
    reader = PdfReader(original_pdf_file)
    
    # 2. 新しいPdfWriterオブジェクトを作成
    writer = PdfWriter()

    # 3. 元のPDFの全てのページを新しいWriterにコピー
    for page in reader.pages:
        writer.add_page(page)

    # 4. パスワードを設定して暗号化
    # ユーザーパスワードとオーナーパスワードを設定できる
    # ここではユーザーパスワードのみを設定
    password = "mysecretpassword"
    writer.encrypt(password) # ユーザーパスワードを設定

    # オーナーパスワードも設定する場合 (閲覧制限と別に編集制限をかけたい場合など)
    # writer.encrypt(user_pwd=password, owner_pwd="ownerpassword")

    # 5. パスワード付きPDFとして保存
    with open(encrypted_pdf_file, "wb") as f:
        writer.write(f)

    print(f"'{original_pdf_file}' をパスワード '{password}' で暗号化し、'{encrypted_pdf_file}' として保存しました。")

except FileNotFoundError:
    print(f"エラー: '{original_pdf_file}' が見つかりません。")
except Exception as e:
    print(f"処理中にエラーが発生しました: {e}")

# 出力例:
# テスト用に 'original.pdf' を作成しました。
# 'original.pdf' をパスワード 'mysecretpassword' で暗号化し、'encrypted_document.pdf' として保存しました。

 

PDFのパスワードを解除する(復号)

 

パスワードが設定されたPDFファイルからパスワードを解除(復号)し、通常のPDFファイルとして保存します。PyPDF2では、PdfReaderオブジェクトのdecrypt()メソッドを使用します。

 

基本的な復号の手順

 

  1. PdfReaderでパスワード付きPDFを読み込む: 復号したいPDFファイルを開きます。

  2. decrypt()メソッドでパスワードを入力する: 正しいパスワードを指定します。

  3. PdfWriterオブジェクトを作成し、ページをコピーする: 復号されたページを新しいPDFにコピーします。

  4. 新しいPDFファイルとして保存する: パスワードが解除されたPDFファイルを書き出します。

Python
 
from PyPDF2 import PdfWriter, PdfReader
import os

# 暗号化されたPDFファイル名(上記で作成したファイルを使用)
encrypted_pdf_file = "encrypted_document.pdf"
decrypted_pdf_file = "decrypted_document.pdf"
correct_password = "mysecretpassword"
wrong_password = "wrongpassword"

# ファイルが存在しない場合はエラー
if not os.path.exists(encrypted_pdf_file):
    print(f"エラー: '{encrypted_pdf_file}' が見つかりません。パスワード設定のステップを実行してください。")
else:
    # 正しいパスワードで復号
    try:
        reader = PdfReader(encrypted_pdf_file)

        if reader.is_encrypted:
            # 正しいパスワードで復号を試みる
            reader.decrypt(correct_password)
            
            # 新しいPdfWriterオブジェクトを作成
            writer = PdfWriter()

            # 復号されたページをWriterにコピー
            for page in reader.pages:
                writer.add_page(page)

            # パスワードが解除されたPDFとして保存
            with open(decrypted_pdf_file, "wb") as f:
                writer.write(f)
            
            print(f"'{encrypted_pdf_file}' をパスワード解除し、'{decrypted_pdf_file}' として保存しました。")
        else:
            print(f"'{encrypted_pdf_file}' は暗号化されていません。")

    except Exception as e:
        print(f"正しいパスワードでの復号中にエラーが発生しました: {e}")

    # 間違ったパスワードで復号を試みる (エラー発生の確認)
    try:
        reader_wrong = PdfReader(encrypted_pdf_file)
        if reader_wrong.is_encrypted:
            print(f"\n--- 間違ったパスワード '{wrong_password}' で試行 ---")
            reader_wrong.decrypt(wrong_password) # ここでエラーが発生するはず
            print("間違ったパスワードで復号に成功してしまいました(これは想定外です)。")
        else:
            print(f"'{encrypted_pdf_file}' は暗号化されていません。")

    except Exception as e:
        print(f"間違ったパスワードでの復号は失敗しました: {e}")
        # PyPDF2 3.xでは、IncorrectPasswordError が発生する
        # PyPDF2 2.x以前では、PdfReadError が発生することがある

# 出力例:
# 'encrypted_document.pdf' をパスワード解除し、'decrypted_document.pdf' として保存しました。
#
# --- 間違ったパスワード 'wrongpassword' で試行 ---
# 間違ったパスワードでの復号は失敗しました: IncorrectPasswordError('Incorrect password')
  • reader.is_encrypted: PDFが暗号化されているかどうかを確認できます。

  • reader.decrypt(password): 正しいパスワードを渡すことでPDFを復号します。パスワードが間違っている場合やPDFが壊れている場合はエラーが発生します。


 

まとめと活用例

 

PyPDF2ライブラリを使用することで、PythonプログラムからPDFファイルのパスワード設定(暗号化)と解除(復号)を簡単に行うことができます。

  • 機密文書の自動暗号化: サーバー上で生成されたレポートや請求書を、送信前に自動的にパスワードで保護する。

  • パスワード付きPDFの一括処理: 大量のパスワード付きPDFを受け取った際に、既知のパスワードで一括復号し、内容を抽出したり結合したりする。

  • アクセス権限の管理: 閲覧パスワードと編集パスワードを使い分けることで、ユーザーごとにPDFへのアクセス権限を細かく制御する。

PyPDF2は、PDFのセキュリティ管理を自動化し、ワークフローを効率化するための強力なツールです。ぜひ、あなたのPythonプロジェクトにPyPDF2を取り入れて、PDFドキュメントの安全性を高めましょう。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座