Skip to content

pypdf から PDF Oxide への移行

pypdf から PDF Oxide に乗り換えるための完全ガイドです。現在お使いのすべての API とその置き換え方法を解説します。

なぜ pypdf から乗り換えるのか?

移行すべき 4 つの理由があります:

  1. 15 倍高速 — PDF Oxide はページあたり平均 0.8ms、pypdf は 12.1ms です。500 ページのドキュメント処理が 6 秒から 0.4 秒に短縮されます。
  2. 100% の信頼性 — PDF Oxide は PDF テストスイートの 100% をパスします。pypdf は 1.6% のファイルで失敗します(98.4% のパス率)。約 60 件に 1 件の割合で出力が壊れます。
  3. Markdown と HTML を内蔵 — pypdf はプレーンテキストしか抽出できません。PDF Oxide はテーブルや構造を保持したまま Markdown や HTML に変換でき、LLM/RAG パイプラインに不可欠です。
  4. OCR とレンダリングを内蔵 — pypdf には OCR もページレンダリングも搭載されていません。PDF Oxide はスキャン文書向けの PaddleOCR を内蔵し、外部依存なしでページを画像にレンダリングできます。

ステップ 1: インストール

pip install pdf_oxide
pip uninstall pypdf  # 任意

ステップ 2: インポートの置き換え

# 変更前
from pypdf import PdfReader, PdfWriter, PdfMerger

# 変更後
from pdf_oxide import PdfDocument, Pdf

ステップ 3: API 対応表

タスク pypdf PDF Oxide
PDF を開く PdfReader("file.pdf") PdfDocument("file.pdf")
ページ数 len(reader.pages) doc.page_count()
テキスト抽出 reader.pages[0].extract_text() doc.extract_text(0)
画像抽出 reader.pages[0].images doc.extract_image_bytes(0)
フォームフィールド reader.get_fields() doc.get_form_fields()
メタデータ reader.metadata doc.metadata()
暗号化 PDF reader.decrypt("pw") PdfDocument("file.pdf", password="pw")
PDF 結合 PdfMerger() + .append() doc.merge_from("doc2.pdf")
ページ分割 PdfWriter() + .add_page() doc.extract_pages([0,1,2,3,4], "out.pdf")
Markdown 変換 非対応 doc.to_markdown(0)
レンダリング 非対応 doc.render_page(0)
OCR 非対応 doc.extract_text_ocr(0)

ステップ 4: よくあるパターンの変更

テキスト抽出

# pypdf
from pypdf import PdfReader
reader = PdfReader("report.pdf")
for page in reader.pages:
    print(page.extract_text())

# PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
    print(doc.extract_text(i))

PDF の結合

pypdf ではマージャーオブジェクトを作成し、ファイルを1つずつ追加する必要があります。PDF Oxide は 1 回の呼び出しで完了します:

# pypdf
from pypdf import PdfMerger
merger = PdfMerger()
merger.append("doc1.pdf")
merger.append("doc2.pdf")
merger.write("merged.pdf")

# PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("doc1.pdf")
doc.merge_from("doc2.pdf")
doc.save("merged.pdf")

ページの分割・抽出

# pypdf — 手動でページをコピー
from pypdf import PdfReader, PdfWriter
reader = PdfReader("report.pdf")
writer = PdfWriter()
for page in reader.pages[0:5]:
    writer.add_page(page)
writer.write("first_5_pages.pdf")

# PDF Oxide — 1回の呼び出し
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
doc.extract_pages([0, 1, 2, 3, 4], "first_5_pages.pdf")

暗号化 PDF

# pypdf — open と decrypt の2ステップ
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()

# PDF Oxide — コンストラクタでパスワード指定
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)

Markdown 変換(新機能)

pypdf には Markdown のサポートがありません。PDF Oxide なら LLM パイプラインへの投入が簡単です:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
    md = doc.to_markdown(i)
    print(md)

画像抽出

# pypdf
from pypdf import PdfReader
reader = PdfReader("report.pdf")
for image in reader.pages[0].images:
    with open(image.name, "wb") as f:
        f.write(image.data)

# PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
    with open(f"image_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

ステップ 5: 移行のテスト

既存のテストファイルを両方のライブラリで実行し、出力を比較してください:

from pdf_oxide import PdfDocument

doc = PdfDocument("your-test-file.pdf")

# テキスト抽出の検証
text = doc.extract_text(0)
print(text[:500])

# ページ数の検証
print(f"Pages: {doc.page_count()}")

# フォームフィールドの検証(該当する場合)
fields = doc.get_form_fields()
for f in fields:
    print(f"{f.name}: {f.value}")

その他の移行ガイド

関連ページ