PythonでPDFファイルを1ページごとに分割する方法:PyPDF2とpikepdf

Pythonを使ってPDFファイルを1ページずつ分割し、それぞれ個別のPDFファイルとして保存する方法を解説します。PDFの分割は、大きなPDFファイルから特定のページだけを取り出したい時や、各ページを個別に管理したい場合に便利です。

この記事では、主要な2つのライブラリPyPDF2pikepdfを使った方法を紹介します。

事前準備:ライブラリのインストール

まず、PDF操作に必要なライブラリをインストールします。

  • PyPDF2: PDFの読み込み、書き込み、分割、結合など、基本的な操作を行うためのライブラリです。
  • pikepdf: PyPDF2よりも高機能で、PDFの暗号化解除、最適化、メタデータの編集なども可能です。より堅牢な処理が必要な場合や、PyPDF2で問題が発生する場合に推奨されます。

どちらか一方、または両方をインストールしてください。

pip install PyPDF2
pip install pikepdf

方法1: PyPDF2を使ったPDF分割

PyPDF2は、PythonでPDFを扱うための定番ライブラリの一つです。シンプルな操作でPDFを分割できます。

サンプルコード (PyPDF2)

import PyPDF2
import os

def split_pdf_pypdf2(input_pdf, output_folder):
    """
    PyPDF2を使ってPDFファイルを1ページごとに分割する関数
    """
    os.makedirs(output_folder, exist_ok=True)

    try:
        with open(input_pdf, 'rb') as file:
            pdf_reader = PyPDF2.PdfReader(file)
            num_pages = len(pdf_reader.pages)

            for page_num in range(num_pages):
                pdf_writer = PyPDF2.PdfWriter()
                pdf_writer.add_page(pdf_reader.pages[page_num])

                output_pdf = os.path.join(output_folder, f"page_{page_num + 1}.pdf")

                with open(output_pdf, 'wb') as output_file:
                    pdf_writer.write(output_file)

            print(f"{input_pdf} を {num_pages} ページに分割しました。")

    except PyPDF2.errors.PdfReadError as e:
        print(f"エラー: PDFファイルの読み込みに失敗しました。: {e}")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 使用例
input_pdf = "input.pdf"
output_folder = "output"
split_pdf_pypdf2(input_pdf, output_folder)

コード解説 (PyPDF2)

split_pdf_pypdf2関数は、PDFファイルを読み込み、1ページずつ新しいPDFファイルに書き出します。

主な処理は以下の通りです。

  1. 出力フォルダ作成: os.makedirs(output_folder, exist_ok=True) で出力先フォルダを作成。
  2. PDF読み込み: PyPDF2.PdfReader(file) でPDFを読み込み、len(pdf_reader.pages) で総ページ数を取得。
  3. ページ分割:
    • for ループで各ページを処理。
    • PyPDF2.PdfWriter() で新しいPDFを作成。
    • pdf_writer.add_page(pdf_reader.pages[page_num]) でページを追加。
    • pdf_writer.write(output_file) でファイルに書き出し。
  4. エラー処理: try...except でエラーを処理。

実行方法

スクリプトを保存し、分割したいPDFファイルを用意して実行します。

python split.py

方法2: pikepdfを使ったPDF分割

pikepdfは、PyPDF2よりも高機能なライブラリです。

サンプルコード (pikepdf)

import pikepdf
import os

def split_pdf_pikepdf(input_pdf, output_folder):
    """
    pikepdfを使ってPDFファイルを1ページごとに分割する関数
    """
    os.makedirs(output_folder, exist_ok=True)

    try:
        with pikepdf.open(input_pdf) as pdf:
            num_pages = len(pdf.pages)

            for page_num in range(num_pages):
                with pikepdf.new() as new_pdf:
                    new_pdf.pages.append(pdf.pages[page_num])
                    output_pdf = os.path.join(output_folder, f"page_{page_num + 1}.pdf")
                    new_pdf.save(output_pdf)

            print(f"{input_pdf} を {num_pages} ページに分割しました。")

    except pikepdf.PdfError as e:
        print(f"エラー: PDFファイルの読み込みまたは処理に失敗しました。: {e}")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 使用例
input_pdf = "input.pdf"
output_folder = "output"
split_pdf_pikepdf(input_pdf, output_folder)

コード解説 (pikepdf)

split_pdf_pikepdf 関数は、pikepdf を使ってPDFを分割します。

主な処理の流れは以下のようになります。

  1. 出力フォルダ作成: os.makedirs()で出力フォルダを作成 (PyPDF2版と同様)。
  2. PDF読み込み: pikepdf.open(input_pdf) でPDFを開き、len(pdf.pages) で総ページ数を取得。
  3. ページ分割:
    • for ループで各ページを処理。
    • pikepdf.new() で新しい空のPDFを作成。
    • new_pdf.pages.append(pdf.pages[page_num]) でページを追加。
    • new_pdf.save(output_pdf) で保存。
  4. エラー処理: try...except でエラーを処理。

実行方法 (pikepdf)

PyPDF2版と同様に、スクリプトを実行します。

python split.py

まとめと応用

PythonPyPDF2pikepdfライブラリを利用してPDFファイルを簡単に1ページずつ分割する方法を紹介しました。シンプルな用途では「PyPDF2」を、高度な処理が必要な場合には「pikepdf」を利用することをお勧めします。

PDFの分割は、文書管理、RAG、OCRの前処理、Webサービスへの組み込みなど、様々な場面で活用できます。この処理は非構造化データの前処理としても有用です。大規模な文書全体を一度に処理するのではなく、小さなチャンクに分割することで、処理の効率が向上します。特に、メモリや計算リソースが限られている場合に役立ちます。この方法は生成AIのRAGの構成でベクトル化するPDF文書をチャンキング(1ページ毎にチャンク)する際などにも利用できます。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com