基礎から学ぶPython入門 90日コース | 業務自動化 - Day 40:PDF操作

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 40:PDF操作で「紙の資料」をコードで扱えるようにする

Day 40では、業務でよく使われる PDFファイル をPythonから操作する方法を学びます。 紙の資料やレポートがPDFで配られることは多いですが、それを「分割・結合・テキスト抽出」できるようになると、 資料整理や情報抽出を自動化できるようになります。

扱うキーワードは次の4つです。

  • PDF読み込み
  • PDF分割
  • PDF結合
  • テキスト抽出

ここでは、初心者向けにかみ砕いて、 代表的なPDFライブラリ(ここでは PyPDF2)を使った基本操作をステップバイステップで説明していきます。

PDFライブラリの準備

PyPDF2のインストール

まずはPDFを扱うためのライブラリをインストールします。

bash

pip install PyPDF2

Pythonコードの中では次のようにインポートします。

from PyPDF2 import PdfReader, PdfWriter
Python
  • PdfReader:PDFを読み込むためのクラスです。
  • PdfWriter:新しいPDFを作成したり、ページを追加したりするためのクラスです。

PDF読み込み:ページ数や基本情報を確認する

PDFを開いてページ数を表示する

# day40_pdf_read.py
from PyPDF2 import PdfReader


def read_pdf_basic(filename="sample.pdf"):
    """PDFを読み込んでページ数などの基本情報を表示する例です。"""
    # PDFファイルを読み込みます(バイナリモードで開きます)。
    reader = PdfReader(filename)

    # ページ数を取得します。
    num_pages = len(reader.pages)
    print(f"このPDFのページ数: {num_pages}")

    # 1ページ目の情報を少し見てみます。
    first_page = reader.pages[0]
    print("1ページ目のオブジェクト:", first_page)


if __name__ == "__main__":
    read_pdf_basic()
Python

ポイント:

  • PdfReader(filename) でPDFファイルを読み込めます。
  • len(reader.pages) でページ数を取得できます。
  • reader.pages[0] で1ページ目のページオブジェクトにアクセスできます。

PDF分割:特定ページだけを別PDFにする

例:1ページ目だけを切り出して新しいPDFに保存する

# day40_pdf_split.py
from PyPDF2 import PdfReader, PdfWriter


def split_first_page(input_file="sample.pdf", output_file="sample_page1.pdf"):
    """PDFの1ページ目だけを切り出して新しいPDFとして保存する例です。"""
    reader = PdfReader(input_file)
    writer = PdfWriter()

    # 1ページ目を取得します(0番目が1ページ目です)。
    first_page = reader.pages[0]

    # 新しいPDFに1ページ目を追加します。
    writer.add_page(first_page)

    # 新しいPDFファイルとして保存します。
    with open(output_file, "wb") as f:
        writer.write(f)

    print(f"1ページ目だけを {output_file} に保存しました。")


if __name__ == "__main__":
    split_first_page()
Python

例:指定範囲(1〜3ページ)を切り出す

from PyPDF2 import PdfReader, PdfWriter


def split_range(input_file="sample.pdf", output_file="sample_pages_1_3.pdf"):
    """PDFの1〜3ページを切り出して新しいPDFとして保存する例です。"""
    reader = PdfReader(input_file)
    writer = PdfWriter()

    # ページ番号は0始まりなので、0〜2が1〜3ページに相当します。
    for page_index in range(0, 3):
        page = reader.pages[page_index]
        writer.add_page(page)

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

    print(f"1〜3ページを {output_file} に保存しました。")


if __name__ == "__main__":
    split_range()
Python

ポイント:

  • PdfWriter() に対して add_page() でページを追加していく。
  • 最後に writer.write() で新しいPDFとして保存する。
  • 「分割」とは、元PDFから必要なページだけを取り出して新しいPDFを作ること。

PDF結合:複数PDFを1つにまとめる

例:複数PDFを順番に結合する

# day40_pdf_merge.py
from PyPDF2 import PdfReader, PdfWriter


def merge_pdfs(input_files, output_file="merged.pdf"):
    """複数のPDFを結合して1つのPDFにする例です。"""
    writer = PdfWriter()

    for filename in input_files:
        print(f"{filename} を結合対象として読み込みます。")
        reader = PdfReader(filename)

        # 各PDFの全ページを順番に追加します。
        for page in reader.pages:
            writer.add_page(page)

    # 結合結果を新しいPDFとして保存します。
    with open(output_file, "wb") as f:
        writer.write(f)

    print(f"結合したPDFを {output_file} に保存しました。")


if __name__ == "__main__":
    files_to_merge = ["sample_page1.pdf", "sample_pages_1_3.pdf"]
    merge_pdfs(files_to_merge, "merged_sample.pdf")
Python

ポイント:

  • 複数のPDFファイルを PdfReader で順番に読み込む。
  • 各ファイルの reader.pages をループして add_page() で追加していく。
  • 最後に1つのPDFとして保存することで、「結合」が完了する。

テキスト抽出:PDFから文字情報を取り出す

例:全ページのテキストを抽出して表示する

# day40_pdf_text_extract.py
from PyPDF2 import PdfReader


def extract_text_from_pdf(filename="sample.pdf"):
    """PDFからテキストを抽出して表示する例です。"""
    reader = PdfReader(filename)

    all_text = ""

    # 全ページをループしてテキストを抽出します。
    for page_index, page in enumerate(reader.pages):
        text = page.extract_text()  # ページからテキストを抽出します。
        print(f"=== ページ {page_index + 1} のテキスト ===")
        print(text)
        print("-----------------------------")

        # 全ページ分のテキストをまとめておきます。
        all_text += text + "\n"

    return all_text


if __name__ == "__main__":
    extract_text_from_pdf()
Python

ポイント:

  • page.extract_text() で、そのページに含まれるテキストを取得できる。
  • PDFの構造によっては、テキストがうまく取れない場合もありますが、 「テキストベースのPDF」であればかなりの確率で抽出できます。

抽出したテキストをファイルに保存する

from PyPDF2 import PdfReader


def extract_text_to_file(input_pdf="sample.pdf", output_txt="sample_text.txt"):
    """PDFからテキストを抽出してテキストファイルに保存する例です。"""
    reader = PdfReader(input_pdf)
    all_text = ""

    for page in reader.pages:
        text = page.extract_text()
        all_text += text + "\n"

    # テキストファイルとして保存します。
    with open(output_txt, "w", encoding="utf-8") as f:
        f.write(all_text)

    print(f"PDFのテキストを {output_txt} に保存しました。")


if __name__ == "__main__":
    extract_text_to_file()
Python

Day 40総合テンプレート:PDF基本操作ツール

最後に、Day 40で扱った要素をまとめた「PDF基本操作ツール」のテンプレートを示します。

# day40_pdf_tool.py
from PyPDF2 import PdfReader, PdfWriter


def read_pdf_info(filename="sample.pdf"):
    reader = PdfReader(filename)
    num_pages = len(reader.pages)
    print(f"PDFファイル: {filename}")
    print(f"ページ数: {num_pages}")
    return reader


def split_pdf(input_file="sample.pdf", output_file="sample_pages_1_3.pdf", start=0, end=3):
    reader = PdfReader(input_file)
    writer = PdfWriter()

    for page_index in range(start, end):
        writer.add_page(reader.pages[page_index])

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

    print(f"{input_file}{start + 1}{end} ページを {output_file} に保存しました。")


def merge_pdfs(input_files, output_file="merged.pdf"):
    writer = PdfWriter()

    for filename in input_files:
        reader = PdfReader(filename)
        for page in reader.pages:
            writer.add_page(page)

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

    print(f"PDFを結合して {output_file} に保存しました。")


def extract_text(input_pdf="sample.pdf", output_txt="sample_text.txt"):
    reader = PdfReader(input_pdf)
    all_text = ""

    for page_index, page in enumerate(reader.pages):
        text = page.extract_text()
        print(f"=== ページ {page_index + 1} ===")
        print(text)
        print("-----------------------------")
        all_text += text + "\n"

    with open(output_txt, "w", encoding="utf-8") as f:
        f.write(all_text)

    print(f"テキストを {output_txt} に保存しました。")


def main():
    # 1. PDF情報表示
    read_pdf_info("sample.pdf")

    # 2. PDF分割(1〜3ページ)
    split_pdf("sample.pdf", "sample_pages_1_3.pdf", start=0, end=3)

    # 3. PDF結合
    merge_pdfs(["sample_pages_1_3.pdf", "sample_pages_1_3.pdf"], "merged_sample.pdf")

    # 4. テキスト抽出
    extract_text("sample.pdf", "sample_text.txt")


if __name__ == "__main__":
    main()
Python

Day 40のまとめ

Day 40では、PDF操作として、

  • PdfReader でPDFを読み込み、ページ数やページオブジェクトにアクセスする方法
  • PdfWriter を使って、特定ページだけを切り出して新しいPDFを作る「分割」の方法
  • 複数PDFの全ページを順番に追加して1つのPDFにする「結合」の方法
  • extract_text() でPDFからテキストを抽出し、画面表示やテキストファイル保存を行う方法

をステップバイステップで体験していただきました。

ここまで来ると、PDFを「ただ見るだけのファイル」から、 「Pythonで分割・結合・テキスト抽出できるデータ源」 として扱えるようになります。 この基礎をベースに、業務で使うPDF帳票の自動整理や、 テキスト抽出による検索・分析などにも応用していくことができます。

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