【Python解説】流出対策に役立つ!PDFに薄い透かしを埋め込む方法

Python

重要な情報を含むPDFファイルを送る際、流出時のリスクを最小限に抑える方法として「透かし」を利用することがあります。特に、薄くて目立たない透かしを埋め込むことで、受信者に迷惑をかけずに情報管理を強化できます。

本記事では、Pythonを使ってPDFに「日付」と「宛名」を薄い透かしとして埋め込むコードを解説します。このコードは簡単にカスタマイズ可能で、業務やプライベートのシーンでも活用できます。

1. なぜPDFに透かしを埋め込むのか?

透かしを埋め込む目的

  • 流出リスクの軽減:万が一PDFが流出しても、誰に送付したものかが特定できます。
  • 内容の信頼性向上:機密性の高いドキュメントに透かしを入れることで、情報の取り扱いが慎重であることを示せます。

薄い透かしのメリット

  • 文書の視認性を損なわない。
  • 相手に違和感を与えにくい。
  • 自然な形で追跡情報を埋め込める。

2. どんな透かしを作れるのか?

本コードでは以下のような透かしを作成できます:

  • 日付: “Sent on 2024-11-27”
  • 宛名: “to Mr. John Doge”
  • 配置: ページ全体に薄い文字でグリッド状に埋め込む
  • 視認性: 透明度が低く、読みにくいが、注意してみると判別可能

これらを組み合わせて、受信者や送信日を特定するユニークな透かしを作成します。

3. 必要なPythonライブラリ

以下のライブラリを使用します。事前にインストールしておきましょう。

  • PyPDF2: PDFファイルの読み書き操作に使用。
  • ReportLab: PDFにカスタム透かしを生成するためのツール。
  • datetime: 現在の日付を取得。

インストールコマンド:

pip install PyPDF2 reportlab

4. コード解説:PDFに透かしを埋め込む方法

以下のコードを使用して、フォルダ内のすべてのPDFファイルに動的な透かしを追加します。

コード全体

import os
from datetime import datetime
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from PyPDF2 import PdfReader, PdfWriter
from io import BytesIO

def add_full_page_watermark(input_pdf, output_pdf, recipient_name):
    # 日付を取得
    current_date = datetime.now().strftime("%Y-%m-%d")  # 例: "2024-11-27"
    
    # 透かしの文字列
    watermark_text = f"Sent on {current_date} to {recipient_name}"
    
    # 透かしを作成
    packet = BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    
    # ページサイズ
    page_width, page_height = letter
    
    # 透かしのスタイルを設定
    can.setFont("Helvetica", 10)  # 小さめのフォント
    can.setFillColorRGB(0.5, 0.5, 0.5, alpha=0.03)  # 非常に薄いグレー
    can.saveState()
    
    # グリッド状に透かしを配置
    text_spacing_x = 100  # 水平方向の間隔
    text_spacing_y = 100  # 垂直方向の間隔
    
    for x in range(0, int(page_width), text_spacing_x):
        for y in range(0, int(page_height), text_spacing_y):
            can.saveState()
            can.translate(x, y)  # 各位置に移動
            can.rotate(45)  # 文字を斜めにする
            can.drawString(0, 0, watermark_text)
            can.restoreState()
    
    can.restoreState()
    can.save()
    
    # PDF透かしデータを取得
    packet.seek(0)
    watermark_pdf = PdfReader(packet)
    watermark_page = watermark_pdf.pages[0]

    # 元のPDFに透かしを追加
    pdf_reader = PdfReader(input_pdf)
    pdf_writer = PdfWriter()

    for page in pdf_reader.pages:
        page.merge_page(watermark_page)  # 各ページに透かしを合成
        pdf_writer.add_page(page)

    # 透かし付きPDFを保存
    with open(output_pdf, "wb") as output_file:
        pdf_writer.write(output_file)

def process_all_pdfs_in_folder(folder_path, recipient_name):
    # フォルダ内のPDFファイルを処理
    for filename in os.listdir(folder_path):
        if filename.endswith(".pdf"):  # PDFファイルのみを対象
            input_pdf = os.path.join(folder_path, filename)
            output_pdf = os.path.join(folder_path, f"watermarked_{filename}")
            print(f"Processing: {filename}")
            add_full_page_watermark(input_pdf, output_pdf, recipient_name)

# 使用例
folder_path = "./pdfs"  # PDFが保存されているフォルダ
recipient_name = "Mr. Doge"  # 宛名
process_all_pdfs_in_folder(folder_path, recipient_name)

5. コードのポイント解説

  1. 動的な透かし作成:
    • 宛名と日付を動的に生成し、各PDFにカスタム透かしを埋め込みます。
  2. グリッド状の透かし配置:
    • ページ全体に透かしが均等に配置され、透かしが目立ちにくくなります。
  3. 透明度の調整:
    • 透かしの透明度をalpha=0.03で設定することで、ほとんど見えない仕上がりに。
  4. フォルダ全体の一括処理:
    • フォルダ内のすべてのPDFに一括で透かしを適用します。

6. 実行結果例

以下のような透かしがPDF全体に埋め込まれます:

  • “Sent on 2024-11-27 to Mr. Doge”
  • 透かしは薄いグレーで、ページ全体に広がる形で表示されます。

7. 応用アイデア

  • 会社ロゴの透かしを追加:
    • ロゴ画像を背景に挿入する形で拡張可能。
  • QRコードの埋め込み:
    • 文書の真正性を確認する手段として活用。

8. 注意点

  • 透かしの削除リスク:
    • 技術を持つ人が透かしを削除できる可能性があるため、完全なセキュリティ対策ではありません。
  • PDFファイルのサイズ増加:
    • 大きなPDFファイルに透かしを追加するとファイルサイズが増える可能性があります。

このコードを活用して、安全にPDFファイルを送信しましょう!

コメント

タイトルとURLをコピーしました