PythonでPDFファイルを1ページごとに分割する方法:PyPDF2とpikepdf
Pythonを使ってPDFファイルを1ページずつ分割し、それぞれ個別のPDFファイルとして保存する方法を解説します。PDFの分割は、大きなPDFファイルから特定のページだけを取り出したい時や、各ページを個別に管理したい場合に便利です。
この記事では、主要な2つのライブラリPyPDF2とpikepdfを使った方法を紹介します。
事前準備:ライブラリのインストール
まず、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ファイルに書き出します。
主な処理は以下の通りです。
- 出力フォルダ作成:
os.makedirs(output_folder, exist_ok=True)で出力先フォルダを作成。 - PDF読み込み:
PyPDF2.PdfReader(file)でPDFを読み込み、len(pdf_reader.pages)で総ページ数を取得。 - ページ分割:
forループで各ページを処理。PyPDF2.PdfWriter()で新しいPDFを作成。pdf_writer.add_page(pdf_reader.pages[page_num])でページを追加。pdf_writer.write(output_file)でファイルに書き出し。
- エラー処理:
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を分割します。
主な処理の流れは以下のようになります。
- 出力フォルダ作成:
os.makedirs()で出力フォルダを作成 (PyPDF2版と同様)。 - PDF読み込み:
pikepdf.open(input_pdf)でPDFを開き、len(pdf.pages)で総ページ数を取得。 - ページ分割:
forループで各ページを処理。pikepdf.new()で新しい空のPDFを作成。new_pdf.pages.append(pdf.pages[page_num])でページを追加。new_pdf.save(output_pdf)で保存。
- エラー処理:
try...exceptでエラーを処理。
実行方法 (pikepdf)
PyPDF2版と同様に、スクリプトを実行します。
python split.py
まとめと応用
PythonとPyPDF2、pikepdfライブラリを利用してPDFファイルを簡単に1ページずつ分割する方法を紹介しました。シンプルな用途では「PyPDF2」を、高度な処理が必要な場合には「pikepdf」を利用することをお勧めします。
PDFの分割は、文書管理、RAG、OCRの前処理、Webサービスへの組み込みなど、様々な場面で活用できます。この処理は非構造化データの前処理としても有用です。大規模な文書全体を一度に処理するのではなく、小さなチャンクに分割することで、処理の効率が向上します。特に、メモリや計算リソースが限られている場合に役立ちます。この方法は生成AIのRAGの構成でベクトル化するPDF文書をチャンキング(1ページ毎にチャンク)する際などにも利用できます。
[PR]