- Python で PDF を扱いたい!
- テキスト抽出・結合・分割を自動化したい!
- PyPDF と PyPDF2 の違いが知りたい!
このような疑問にお答えします。
Python で PDF を操作するライブラリといえば、以前は PyPDF2 が主流でした。しかし現在は後継ライブラリの PyPDF が活発にメンテナンスされており、新しいプロジェクトでは PyPDF を使うのがスタンダードです。
本記事では PyPDF のインストール方法から、テキスト抽出・PDF の結合・分割・画像取得まで、実用的なコード例を交えて解説します。
PyPDF とは?PyPDF2 との違い
PyPDF は Python で PDF を操作するためのサードパーティライブラリです。テキスト抽出・ページの結合・分割・並べ替え・メタデータ取得など、PDF に関する処理を純粋な Python で実現できます。
以前はほぼ同じ用途で PyPDF2 が広く使われていました。PyPDF2 は長らくメンテナンスが停止していたのですが、2022年以降に PyPDF として刷新・再公開されました。現在は PyPDF が公式に推奨されています。
- PyPDF: 現在アクティブにメンテナンスされている推奨ライブラリ
- PyPDF2: 旧バージョン。新規利用は非推奨(PyPDF に移行推奨)
- インポート文が異なる: PyPDF は
from pypdf import PdfReader、PyPDF2 はfrom PyPDF2 import PdfReader
名前が似ているので混同しやすいですが、全くの別物です。間違えてインストールしないよう注意しましょう。
PyPDF のインストール方法
PyPDF はサードパーティライブラリなので、pip でインストールします。
pip install pypdfuv を使っている場合はこちらです。
uv add pypdfインストール後は import pypdf または from pypdf import PdfReader のように使います。
PyPDF を使った PDF 操作の方法
ここからは以下の操作方法をコード例とともに解説します。
- PDF ファイルの読み込み
- テキストの抽出(1ページ指定 / 全ページ一括)
- PDF の結合
- PDF の分割
- PDF のページ順を並べ替える
- 画像を読み込む
- メタデータにアクセスする
- 大量の PDF から特定情報を抽出する
PDF ファイルの読み込み
PDF の読み込みには PdfReader を使います。
from pypdf import PdfReader
# PDFファイルの読み込み
reader = PdfReader("sample.pdf")上記では “sample.pdf” を読み込み、reader 変数に格納しています。以後の操作はこの reader に対して行います。
テキストの抽出
PDF 内のテキスト抽出には extract_text() メソッドを使います。
特定ページのみ抽出する場合
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
# ページ数の確認
print(len(reader.pages)) # 例: 10
# 1ページ目のテキストを抽出(インデックスは0始まり)
page = reader.pages[0]
text = page.extract_text()
print(text)全ページのテキストをまとめて抽出する場合
実務では全ページのテキストを連結して扱うケースが多いです。ループで処理します。
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
# 全ページのテキストを一括抽出
full_text = ""
for page in reader.pages:
full_text += page.extract_text() + "\n"
print(full_text)PDF の結合
複数の PDF を1つに結合するには PdfWriter を使います。
from pypdf import PdfWriter
# 結合したいPDFファイルのリスト
pdf_files = ["file1.pdf", "file2.pdf", "file3.pdf"]
merger = PdfWriter()
for pdf_file in pdf_files:
merger.append(pdf_file)
merger.write("merged.pdf")
merger.close()空の PdfWriter を用意し、結合したいファイルを append() で追加していく流れです。最後に write() でファイルに書き出します。
PDF の分割
PDF を分割するには、元の PDF を PdfReader で読み込み、必要なページだけ PdfWriter で書き出します。
from pypdf import PdfReader, PdfWriter
reader = PdfReader("file1.pdf")
# 1ページ目だけ取り出して別ファイルに保存
writer = PdfWriter()
writer.add_page(reader.pages[0])
with open("page1_only.pdf", "wb") as output_file:
writer.write(output_file)複数ページを取り出したい場合は、add_page() を繰り返すかループで対応します。
PDF のページ順を並べ替える
PdfReader と PdfWriter を組み合わせてページの順番を入れ替えられます。
from pypdf import PdfReader, PdfWriter
reader = PdfReader("source.pdf")
# 新しいページ順を定義(3ページ目→1ページ目→2ページ目の順)
new_order = [2, 0, 1]
writer = PdfWriter()
for index in new_order:
writer.add_page(reader.pages[index])
with open("reordered.pdf", "wb") as output_pdf:
writer.write(output_pdf)new_order に含まれないページは出力対象から外れる点に注意してください。全ページを並べ替えたい場合はすべてのインデックスを含めます。
画像を読み込む
PDF に埋め込まれた画像も取り出せます。page.images で画像一覧を取得し、バイナリで書き出します。
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
page = reader.pages[0]
for count, image_file_object in enumerate(page.images):
with open(f"{count}_{image_file_object.name}", "wb") as image:
image.write(image_file_object.data)画像はページ内のインデックス番号で管理されており、enumerate() でカウントと画像オブジェクトを同時に取得しています。
メタデータにアクセスする
PDF のメタデータとは、ファイルの内容とは直接関連しない付帯情報のことです。以下のような情報が含まれます。
- 作者名・タイトル・主題・キーワード
- 作成日・更新日
- PDF を生成したソフトウェア名・バージョン
- 著作権情報
reader.metadata プロパティで取得できます。
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
metadata = reader.metadata
print(metadata)出力例は以下の通りです。
{
'/CreationDate': "D:20151127175214+09'00'",
'/ModDate': "D:20151127175215+09'00'",
'/Producer': 'JUST PDF 3'
}大量の PDF ファイルから特定の情報を抽出する
複数の PDF から特定の文字列を一括抽出したい場合は、正規表現と組み合わせると便利です。以下はメールアドレスを抽出するサンプルです。
from pypdf import PdfReader
import re
def extract_text_from_pdf(pdf_path):
reader = PdfReader(pdf_path)
text = ""
for page in reader.pages:
text += page.extract_text() + "\n"
return text
# メールアドレスを抽出する正規表現パターン
pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
pdf_files = ["file1.pdf", "file2.pdf", "file3.pdf"]
for pdf_file in pdf_files:
text = extract_text_from_pdf(pdf_file)
matches = re.findall(pattern, text)
print(f"{pdf_file}: {matches}")抽出したデータは Pandas などを使って CSV に出力するとさらに活用しやすくなります。
よくあるエラーと対処法
PyPDF を使い始めてよく遭遇するエラーとその対処法をまとめます。
ModuleNotFoundError: No module named ‘pypdf’
PyPDF がインストールされていないか、仮想環境が異なる場合に発生します。
# 仮想環境を有効化してからインストール
pip install pypdf
# uv の場合
uv add pypdfPyPDF2 をインストールしてしまっている場合も同じエラーになります。パッケージ名が pypdf(小文字)であることを確認しましょう。
PdfReadError: EOF marker not found / 暗号化 PDF が読めない
壊れた PDF ファイル、または暗号化(パスワード保護)された PDF を読み込もうとした際に発生します。
パスワード付き PDF は decrypt() メソッドで復号してから操作します。
from pypdf import PdfReader
reader = PdfReader("protected.pdf")
if reader.is_encrypted:
reader.decrypt("your_password")
text = reader.pages[0].extract_text()
print(text)extract_text() の結果が空になる
テキストが空文字になるケースは、主に以下の原因が考えられます。
- スキャンPDF: テキストではなく画像として保存されている。OCR ツール(pytesseract 等)が必要
- フォント埋め込みの問題: 特殊なフォントを使っている PDF はテキスト抽出に失敗することがある
- 暗号化: decrypt() していない状態で抽出しようとしている
スキャン PDF の場合は PyPDF では対応できないため、OCR ライブラリを組み合わせる必要があります。
パフォーマンスを最適化するヒント
ページ数が膨大な PDF を扱う場合や、Web アプリで PDF 処理を行う場合は以下の点を意識すると高速化できます。
必要なページのみを読み込む
処理対象ページが決まっている場合は、全ページをループせずに直接指定します。
from pypdf import PdfReader
reader = PdfReader("large.pdf")
# 10ページ目だけ処理する(全ページをループしない)
page = reader.pages[9]
text = page.extract_text()
print(text)大量データは一時ファイルを活用する
多数のページを結合する場合、全データをメモリ上に保持するとメモリ不足になることがあります。io.BytesIO や一時ファイルを使ってメモリ使用量を抑えましょう。
import io
from pypdf import PdfReader, PdfWriter
writer = PdfWriter()
for path in ["file1.pdf", "file2.pdf", "file3.pdf"]:
reader = PdfReader(path)
for page in reader.pages:
writer.add_page(page)
# メモリ上のバッファに書き出す
buffer = io.BytesIO()
writer.write(buffer)
buffer.seek(0)
# 必要に応じてファイルに保存
with open("merged.pdf", "wb") as f:
f.write(buffer.read())PDF の構造はシンプルに保つ
埋め込みフォント・高解像度画像・複雑なレイアウトを持つ PDF はテキスト抽出に時間がかかります。操作対象の PDF を作成できる場合は、構造をシンプルに保つとパフォーマンスが上がります。
まとめ
PyPDF の主な機能をまとめます。
| 操作 | 使うクラス | 主なメソッド / プロパティ |
|---|---|---|
| PDF 読み込み | PdfReader | PdfReader("file.pdf") |
| テキスト抽出 | PdfReader | page.extract_text() |
| ページ数確認 | PdfReader | len(reader.pages) |
| PDF 結合 | PdfWriter | merger.append() |
| PDF 分割 | PdfReader + PdfWriter | writer.add_page() |
| ページ並べ替え | PdfReader + PdfWriter | writer.add_page(reader.pages[i]) |
| 画像取得 | PdfReader | page.images |
| メタデータ取得 | PdfReader | reader.metadata |
| 暗号化PDF復号 | PdfReader | reader.decrypt("password") |
PDF はビジネス現場でも日常的に使われるファイル形式です。PyPDF をマスターしておくと、請求書・報告書・契約書といったドキュメントの自動処理に活かせます。
まずはテキスト抽出から試してみて、徐々に結合・分割・メタデータ取得へと応用範囲を広げてみてください。


コメント