【Python】PDFファイルをPythonで操作する(PyPDF2)

Python

こんにちは、かつコーチです。

「複数のPDFを1つに結合したい」「特定のページだけ抜き出したい」「PDFから文字を検索できるようにしたい」。
PDF操作は手作業だと地味に面倒な作業です。

そんなときに便利なのが、Pythonのpypdf(旧PyPDF2)というライブラリです。
この記事では、インストール方法からPDFの結合・分割・テキスト抽出まで、実際に動くコードで解説します。

pypdf(PyPDF2)とは?

PDFを操作するためのPythonライブラリ

pypdfとは、PDFファイルの読み込み・結合・分割・テキスト抽出などを、Pythonから行えるサードパーティ製ライブラリです。

以前はPyPDF2という名前で提供されていましたが、現在は開発がpypdfというパッケージ名に統合されています。
PyPDF2はメンテナンスモードとなっており、新規に使う場合はpypdfを選ぶのが推奨されています。

この記事ではPython 3.12系で動作確認済みの、最新パッケージ「pypdf」を使って解説します。

なぜpypdfが必要なのか

PDFはテキストファイルのように単純な構造ではなく、ページやフォント、画像などの情報が複雑に組み合わさったファイル形式です。
自力でPDFの中身を解析するのは大変ですが、pypdfを使えばページ単位の操作を数行のコードで実現できます。

基本の書き方

インストール

pypdfをインストールします。

pip install pypdf

importする際のモジュール名もpypdfになります(PyPDF2時代はimport PyPDF2でしたが、現在はimport pypdfが正しい書き方です)。

手順1:PDFを読み込んでページ数を確認する

まずは既存のPDFファイルを読み込んでみましょう。

from pypdf import PdfReader

reader = PdfReader("sample.pdf")
print(f"ページ数: {len(reader.pages)}")

PdfReaderにファイルパスを渡すだけで、PDFの中身を読み込めます。
reader.pagesはページのリストで、len()で総ページ数を取得できます。

手順2:複数のPDFを1つに結合する

見積書と請求書など、複数のPDFを1つにまとめたい場面はよくあります。

from pypdf import PdfWriter

writer = PdfWriter()

writer.append("estimate.pdf")
writer.append("invoice.pdf")

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

PdfWriterに対してappend()でPDFを順番に追加していき、最後にwrite()でファイルとして書き出します。
結合の順番はappend()を呼んだ順になるので、順序が重要な資料では気をつけましょう。

手順3:PDFを1ページずつ分割する

逆に、複数ページのPDFを1ページごとのファイルに分割することもできます。

from pypdf import PdfReader, PdfWriter

reader = PdfReader("report.pdf")

for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)

    with open(f"report_page_{i + 1}.pdf", "wb") as f:
        writer.write(f)

enumerate()でページ番号を取得しながら、1ページずつ新しいPdfWriterに追加して個別のファイルとして保存します。
i + 1としているのは、enumerate()が0始まりのため、ファイル名を1ページ目から始めるための調整です。

手順4:PDFからテキストを抽出する

PDFの中身をテキストとして取り出すこともできます。

from pypdf import PdfReader

reader = PdfReader("report.pdf")

for page in reader.pages:
    text = page.extract_text()
    print(text)

page.extract_text()で、そのページに含まれるテキストを文字列として取得できます。
抽出したテキストをファイルに保存すれば、PDFの中身を検索可能にすることもできます。

つまずきやすい設定・注意点

extract_text()は万能ではありません。
スキャンして画像化されたPDF(文字情報を持たないPDF)からは、テキストを取得できません。

画像化されたPDFから文字を読み取りたい場合は、OCR(光学文字認識)用の別ライブラリ(pytesseractなど)が必要になります。
pypdfはあくまで「PDF内部に文字データとして埋め込まれているテキスト」を扱うライブラリだと理解しておきましょう。

よくあるつまずきポイント・エラー対処

PyPDF2をインストールしたのにインポートエラーになる

Before(つまずいたコード)

pip install PyPDF2
import PyPDF2

reader = PyPDF2.PdfReader("sample.pdf")

私は最初、ネット記事を参考にpip install PyPDF2でインストールしました。
コード自体は動いたのですが、実行時に次のような警告が表示されました。

DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead.

調べてみると、PyPDF2は開発が停止しており、現在は後継のpypdfに一本化されていることが分かりました。

After(改善したコード)

pip install pypdf
from pypdf import PdfReader

reader = PdfReader("sample.pdf")

パッケージ名をpypdfに変更し、import文もfrom pypdf import PdfReaderに書き換えます。
これから新規に学ぶ場合は、最初からpypdfを使うことをおすすめします。

ファイルパスの指定ミスでエラーになる

Before(つまずいたコード)

from pypdf import PdfReader

reader = PdfReader("sample.pdf")

スクリプトを実行したディレクトリにsample.pdfが存在しないと、次のエラーが発生します。

FileNotFoundError: [Errno 2] No such file or directory: 'sample.pdf'

After(改善したコード)

import os
from pypdf import PdfReader

file_path = "sample.pdf"

if os.path.exists(file_path):
    reader = PdfReader(file_path)
    print(f"ページ数: {len(reader.pages)}")
else:
    print(f"{file_path} が見つかりません。ファイルの配置場所を確認してください")

os.path.exists()で事前にファイルの存在を確認してから読み込むことで、エラーで処理が止まるのを防げます。
特に自動化スクリプトに組み込む場合は、この確認を入れておくと安全です。

まとめ

この記事のポイント

  • 現在はPyPDF2ではなく、後継のpypdfを使うのが推奨されています
  • PdfReaderで読み込み、PdfWriterで結合・分割・書き出しを行います
  • append()で複数PDFの結合、add_page()で1ページずつの分割ができます
  • extract_text()でテキスト抽出ができますが、画像化PDFには対応していません
  • ファイル操作の前にos.path.exists()で存在確認をすると安全です

次に読むべき記事

ファイルパスの扱いに不安がある方は、osモジュールの解説記事もあわせてご覧ください。
定期的にPDFレポートを自動生成したい方は、schedule/cronによる定期実行の記事も参考になります。

タグ: Python, 中級者向け, 自動化

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