pypdf から PDF Oxide への移行
pypdf から PDF Oxide に乗り換えるための完全ガイドです。現在お使いのすべての API とその置き換え方法を解説します。
なぜ pypdf から乗り換えるのか?
移行すべき 4 つの理由があります:
- 15 倍高速 — PDF Oxide はページあたり平均 0.8ms、pypdf は 12.1ms です。500 ページのドキュメント処理が 6 秒から 0.4 秒に短縮されます。
- 100% の信頼性 — PDF Oxide は PDF テストスイートの 100% をパスします。pypdf は 1.6% のファイルで失敗します(98.4% のパス率)。約 60 件に 1 件の割合で出力が壊れます。
- Markdown と HTML を内蔵 — pypdf はプレーンテキストしか抽出できません。PDF Oxide はテーブルや構造を保持したまま Markdown や HTML に変換でき、LLM/RAG パイプラインに不可欠です。
- 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}")
その他の移行ガイド
関連ページ
- PDF Oxide vs pypdf — 詳細な比較
- Python で始める — インストールガイド
- PDF からテキストを抽出する — テキスト抽出ガイド