MENU
\ お問い合わせはこちら! /

PyPDF の使い方を徹底解説 | インストール・テキスト抽出・PDF操作まで

  • 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 でインストールします。

Bash
pip install pypdf

uv を使っている場合はこちらです。

Bash
uv add pypdf

インストール後は import pypdf または from pypdf import PdfReader のように使います。

PyPDF を使った PDF 操作の方法

ここからは以下の操作方法をコード例とともに解説します。

  • PDF ファイルの読み込み
  • テキストの抽出(1ページ指定 / 全ページ一括)
  • PDF の結合
  • PDF の分割
  • PDF のページ順を並べ替える
  • 画像を読み込む
  • メタデータにアクセスする
  • 大量の PDF から特定情報を抽出する

PDF ファイルの読み込み

PDF の読み込みには PdfReader を使います。

Python
from pypdf import PdfReader

# PDFファイルの読み込み
reader = PdfReader("sample.pdf")

上記では “sample.pdf” を読み込み、reader 変数に格納しています。以後の操作はこの reader に対して行います。

テキストの抽出

PDF 内のテキスト抽出には extract_text() メソッドを使います。

特定ページのみ抽出する場合

Python
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)

全ページのテキストをまとめて抽出する場合

実務では全ページのテキストを連結して扱うケースが多いです。ループで処理します。

Python
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 を使います。

Python
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 で書き出します。

Python
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 のページ順を並べ替える

PdfReaderPdfWriter を組み合わせてページの順番を入れ替えられます。

Python
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 で画像一覧を取得し、バイナリで書き出します。

Python
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 プロパティで取得できます。

Python
from pypdf import PdfReader

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

print(metadata)

出力例は以下の通りです。

JSON
{
  '/CreationDate': "D:20151127175214+09'00'",
  '/ModDate': "D:20151127175215+09'00'",
  '/Producer': 'JUST PDF 3'
}

大量の PDF ファイルから特定の情報を抽出する

複数の PDF から特定の文字列を一括抽出したい場合は、正規表現と組み合わせると便利です。以下はメールアドレスを抽出するサンプルです。

Python
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 がインストールされていないか、仮想環境が異なる場合に発生します。

Bash
# 仮想環境を有効化してからインストール
pip install pypdf

# uv の場合
uv add pypdf

PyPDF2 をインストールしてしまっている場合も同じエラーになります。パッケージ名が pypdf(小文字)であることを確認しましょう。

PdfReadError: EOF marker not found / 暗号化 PDF が読めない

壊れた PDF ファイル、または暗号化(パスワード保護)された PDF を読み込もうとした際に発生します。

パスワード付き PDF は decrypt() メソッドで復号してから操作します。

Python
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 処理を行う場合は以下の点を意識すると高速化できます。

必要なページのみを読み込む

処理対象ページが決まっている場合は、全ページをループせずに直接指定します。

Python
from pypdf import PdfReader

reader = PdfReader("large.pdf")

# 10ページ目だけ処理する(全ページをループしない)
page = reader.pages[9]
text = page.extract_text()
print(text)

大量データは一時ファイルを活用する

多数のページを結合する場合、全データをメモリ上に保持するとメモリ不足になることがあります。io.BytesIO や一時ファイルを使ってメモリ使用量を抑えましょう。

Python
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 読み込みPdfReaderPdfReader("file.pdf")
テキスト抽出PdfReaderpage.extract_text()
ページ数確認PdfReaderlen(reader.pages)
PDF 結合PdfWritermerger.append()
PDF 分割PdfReader + PdfWriterwriter.add_page()
ページ並べ替えPdfReader + PdfWriterwriter.add_page(reader.pages[i])
画像取得PdfReaderpage.images
メタデータ取得PdfReaderreader.metadata
暗号化PDF復号PdfReaderreader.decrypt("password")

PDF はビジネス現場でも日常的に使われるファイル形式です。PyPDF をマスターしておくと、請求書・報告書・契約書といったドキュメントの自動処理に活かせます。

まずはテキスト抽出から試してみて、徐々に結合・分割・メタデータ取得へと応用範囲を広げてみてください。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

基本、書くことで生計を立てています。
ITエンジニア歴は約5年ほど。
Pythonを書くことが多いですが、雑食です。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)