こんにちは、かつコーチです。
「複数の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, 中級者向け, 自動化