【Python業務効率化】PDF自動処理マスター講座 第3回 PDFにテキストや画像・透かしを自動挿入する方法

Python自動化

※本記事にはPR(アフィリエイト広告)が含まれています。

こんにちは!「Python業務効率化」シリーズ第3回へようこそ。前回・前々回ではPDFの読み込みや分割・結合など、基本的な操作を学んできました。今回はさらに一歩進んで、PDFにテキストや画像、透かし(ウォーターマーク)を自動で挿入する方法を解説していきます。

「請求書に会社ロゴを自動で貼り付けたい」「契約書に『社外秘』の透かしを入れたい」「大量のPDFにページ番号や日付を一括で挿入したい」——こうした業務は、Pythonを使えばほんの数行のコードで自動化できます。プログラミング初心者の方でも理解できるように、仕組みから丁寧に解説していきますので、ぜひ最後までお付き合いください。

1. 今回使用するライブラリと準備

PDFにテキストや画像を「上から重ねる」ような加工を行う場合、1つのライブラリだけでは完結しないことが多く、以下の2つを組み合わせて使うのが一般的です。

必要なライブラリのインストール

  • pypdf:既存のPDFの読み込み、ページの合成(重ね合わせ)、保存を担当します。
  • reportlab:テキストや画像、図形を描画した新しいPDFを作成するために使用します。

以下のコマンドでインストールしておきましょう。

pip install pypdf reportlab

PDF加工の基本的な考え方

PDFに文字や画像を「挿入」する場合、実は元のPDFに直接書き込んでいるわけではありません。多くの場合、次のような手順で処理が行われます。

  1. reportlabで「透明な背景に文字や画像だけを描いた」新しいPDFページを作成する
  2. pypdfでそのページを元のPDFのページに重ね合わせる(マージする)
  3. 合成結果を新しいPDFファイルとして保存する

この「重ね合わせ」という考え方さえ理解してしまえば、テキスト挿入も画像挿入も透かし挿入も、ほぼ同じ仕組みで実現できます。それでは、実際にコードを見ながら進めていきましょう。

2. PDFにテキストを自動挿入する方法

まずは最も使用頻度の高い「テキストの自動挿入」から解説します。日付やページ番号、担当者名などを自動で書き込みたい場合に便利です。

reportlabでテキストレイヤーを作成する

from reportlab.pdfgen import canvas
from pypdf import PdfReader, PdfWriter
import io

def create_text_layer(text, page_width, page_height):
    buffer = io.BytesIO()
    c = canvas.Canvas(buffer, pagesize=(page_width, page_height))
    c.setFont("Helvetica", 14)
    # 左下から座標(x=50, y=50)の位置に文字を描画
    c.drawString(50, 50, text)
    c.save()
    buffer.seek(0)
    return PdfReader(buffer)

ポイントは、PDFの座標系が「左下が原点(0,0)」であることです。画像編集ソフトとは上下が逆になるので、最初は戸惑うかもしれませんが、慣れれば問題ありません。

元のPDFと合成する

def insert_text_to_pdf(input_path, output_path, text):
    reader = PdfReader(input_path)
    writer = PdfWriter()

    for page in reader.pages:
        width = float(page.mediabox.width)
        height = float(page.mediabox.height)

        text_pdf = create_text_layer(text, width, height)
        page.merge_page(text_pdf.pages[0])
        writer.add_page(page)

    with open(output_path, "wb") as f:
        writer.write(f)

insert_text_to_pdf("input.pdf", "output_text.pdf", "作成日: 2024-06-01")

これで、既存のPDFの全ページに同じテキストを挿入できます。もしページごとに異なる文字を入れたい場合は、ループの中でページ番号を使ってテキストを変化させるだけでOKです。

for i, page in enumerate(reader.pages):
    text = f"{i + 1} / {len(reader.pages)} ページ"
    # ...(以下同様の処理)

3. PDFに画像を自動挿入する方法

続いて、会社ロゴや印鑑画像などをPDFに自動で貼り付ける方法を解説します。基本の流れはテキスト挿入と同じで、reportlabで画像を描画したレイヤーを作成し、それを重ね合わせます。

画像を貼り付けるレイヤーの作成

from reportlab.lib.utils import ImageReader

def create_image_layer(image_path, page_width, page_height, x, y, img_width, img_height):
    buffer = io.BytesIO()
    c = canvas.Canvas(buffer, pagesize=(page_width, page_height))
    img = ImageReader(image_path)
    c.drawImage(img, x, y, width=img_width, height=img_height, mask='auto')
    c.save()
    buffer.seek(0)
    return PdfReader(buffer)

mask='auto'を指定しておくと、透過PNG画像を使った場合に背景が透明なまま貼り付けられます。ロゴ画像などを扱う際にはぜひ覚えておいてください。

画像の配置とサイズ調整

def insert_image_to_pdf(input_path, output_path, image_path):
    reader = PdfReader(input_path)
    writer = PdfWriter()

    for page in reader.pages:
        width = float(page.mediabox.width)
        height = float(page.mediabox.height)

        # ページ右上に幅100pt, 高さ50ptの画像を配置
        x = width - 120
        y = height - 70
        image_pdf = create_image_layer(image_path, width, height, x, y, 100, 50)

        page.merge_page(image_pdf.pages[0])
        writer.add_page(page)

    with open(output_path, "wb") as f:
        writer.write(f)

insert_image_to_pdf("input.pdf", "output_image.pdf", "logo.png")

座標やサイズを変数化しておくと、「ロゴはここ」「印影はここ」といったテンプレートを複数用意して使い分けることもできます。業務で定型のPDFを量産する場合に非常に重宝する方法です。

4. PDFに透かし(ウォーターマーク)を自動挿入する方法

最後に紹介するのは「透かし(ウォーターマーク)」の挿入です。「社外秘」「サンプル」「複製禁止」といった文字を薄くページ全体に重ねることで、資料の取り扱いに注意喚起を促すことができます。

透かし用PDFの作成

透かしは斜めに回転させたり、色を薄くしたりするのがポイントです。saveState()とrestoreState()を使うと、描画設定を一時的に変更して元に戻すことができます。

def create_watermark_layer(text, page_width, page_height):
    buffer = io.BytesIO()
    c = canvas.Canvas(buffer, pagesize=(page_width, page_height))

    c.saveState()
    c.setFont("Helvetica-Bold", 60)
    c.setFillColorRGB(0.8, 0.1, 0.1, alpha=0.3)  # 薄い赤色・半透明
    c.translate(page_width / 2, page_height / 2)
    c.rotate(45)  # 45度回転させて斜めに表示
    c.drawCentredString(0, 0, text)
    c.restoreState()

    c.save()
    buffer.seek(0)
    return PdfReader(buffer)

全ページへの透かし適用

def insert_watermark_to_pdf(input_path, output_path, watermark_text):
    reader = PdfReader(input_path)
    writer = PdfWriter()

    for page in reader.pages:
        width = float(page.mediabox.width)
        height = float(page.mediabox.height)

        watermark_pdf = create_watermark_layer(watermark_text, width, height)
        page.merge_page(watermark_pdf.pages[0])
        writer.add_page(page)

    with open(output_path, "wb") as f:
        writer.write(f)

insert_watermark_to_pdf("input.pdf", "output_watermark.pdf", "社外秘")

この処理を使えば、フォルダ内の大量のPDFに対して一括で透かしを入れることも簡単に実現できます。globモジュールなどと組み合わせて、業務フォルダを丸ごと処理するスクリプトを作ってみるのもおすすめです。

import glob

for path in glob.glob("documents/*.pdf"):
    output_path = path.replace(".pdf", "_watermarked.pdf")
    insert_watermark_to_pdf(path, output_path, "社外秘")

まとめ

今回は、Pythonを使ってPDFに「テキスト」「画像」「透かし」を自動挿入する方法を解説しました。ポイントをおさらいしておきましょう。

  • PDFへの加工は「reportlabで新しいレイヤーを作成し、pypdfで元のPDFに重ね合わせる」という考え方が基本
  • テキスト挿入はdrawString、画像挿入はdrawImageを使う
  • 透かしは回転や半透明設定を組み合わせることで、それらしい見た目に仕上げられる
  • 処理を関数化しておけば、フォルダ単位での一括処理にも簡単に応用できる

一つひとつの処理はシンプルですが、組み合わせることで請求書の自動作成、契約書への捺印処理、資料への注意書き付与など、さまざまな業務を自動化できます。ぜひ実際の業務データで試してみてください。

次回、第4回では「PDFのページ結合・分割・並び替えを自在に操る方法」について、さらに実践的なテクニックを解説していく予定です。お楽しみに!

PR

\ 初心者から未経験でプロを目指す /

Pythonプログラミング マンツーマン詳細はこちら >

Photo by Danial Igdery on Unsplash

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