pdfminer.six から PDF Oxide への移行
pdfminer(pdfminer.six)から PDF Oxide に乗り換えるための完全ガイドです。現在お使いのすべての API とその置き換え方法を解説します。
なぜ pdfminer から乗り換えるのか?
移行すべき 4 つの理由があります:
- 約 30 倍高速 — pdfminer は主要な Python PDF ライブラリの中で最も遅いです。PDF Oxide はページあたり平均 0.8ms ですが、pdfminer は数十ミリ秒かかります。数分かかっていたバッチ処理が数秒で完了します。
- 活発にメンテナンス — pdfminer.six の更新頻度は低く、未解決の issue が大量にあります。PDF Oxide は活発に開発されており、定期的にリリースされています。
- オールインワン — pdfminer はテキスト抽出しかできません。PDF Oxide は PDF の作成、編集、ページレンダリング、画像抽出、フォーム処理、Markdown/HTML 変換もすべて対応しています。
- 設定不要 — pdfminer ではまともな結果を得るために
LAParams(word_margin、line_margin、char_margin)の手動調整が必要です。PDF Oxide はレイアウト検出を自動で行います。
ステップ 1: インストール
pip install pdf_oxide
pip uninstall pdfminer.six # 任意
ステップ 2: インポートの置き換え
# 変更前
from pdfminer.high_level import extract_text, extract_pages
from pdfminer.layout import LAParams
# 変更後
from pdf_oxide import PdfDocument
ステップ 3: API 対応表
| タスク | pdfminer | PDF Oxide |
|---|---|---|
| テキスト抽出 | extract_text("file.pdf") |
PdfDocument("file.pdf").extract_text(0) |
| ページ抽出 | extract_pages("file.pdf") |
doc.extract_text(i) でページごとに処理 |
| レイアウト解析 | LAParams() の設定 |
レイアウト検出が組み込み |
| 文字位置 | LTChar オブジェクト |
doc.extract_chars(0) |
| 暗号化 PDF | 制限あり(AES-256 で失敗) | 完全対応 |
| Markdown 変換 | 非対応 | doc.to_markdown(0) |
| フォームフィールド | 非対応 | doc.get_form_fields() |
ステップ 4: よくあるパターンの変更
基本的なテキスト抽出
pdfminer の extract_text はドキュメント全体を一度に処理します。PDF Oxide はページ単位で制御できます:
# pdfminer — ドキュメント全体を一度に処理
from pdfminer.high_level import extract_text
text = extract_text("report.pdf")
print(text)
# PDF Oxide — ページ単位の制御
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
text = doc.extract_text(i)
print(text)
レイアウト解析
pdfminer では LAParams の手動設定が必要です。PDF Oxide は自動で処理します:
# pdfminer — 手動のレイアウト設定
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
params = LAParams(
word_margin=0.1,
line_margin=0.5,
char_margin=2.0,
boxes_flow=0.5,
)
text = extract_text("report.pdf", laparams=params)
# PDF Oxide — 自動レイアウト検出
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0) # レイアウトは自動処理
文字レベルの抽出
pdfminer はレイアウトオブジェクトの複雑なツリーを使います。PDF Oxide はフラットなリストを返します:
# pdfminer — レイアウトツリーの走査
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar, LTTextBox
for page_layout in extract_pages("report.pdf"):
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
print(f"{char.get_text()} at ({char.x0}, {char.y0})")
# PDF Oxide — フラットな文字リスト
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for c in doc.extract_chars(0):
print(f"{c.char} at ({c.x}, {c.y})")
暗号化 PDF
pdfminer は暗号化のサポートが限定的で、AES-256 で暗号化されたファイルでは失敗します:
# pdfminer — 多くの暗号化 PDF で失敗
from pdfminer.high_level import extract_text
text = extract_text("encrypted.pdf", password="password")
# AES-256 暗号化ファイルではエラーが発生する可能性あり
# PDF Oxide — 完全な暗号化サポート
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0) # すべての暗号化方式に対応
Markdown 変換(新機能)
pdfminer には 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)
フォームフィールドの抽出(新機能)
pdfminer ではフォームフィールドを抽出できません。PDF Oxide なら対応できます:
from pdf_oxide import PdfDocument
doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for f in fields:
print(f"{f.name}: {f.value}")
ページレンダリング(新機能)
pdfminer にはレンダリング機能がありません。PDF Oxide はページを画像にレンダリングできます:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
png_bytes = doc.render_page(0, dpi=150)
with open("page.png", "wb") as f:
f.write(png_bytes)
主な違い
- LAParams の調整が不要 — PDF Oxide はレイアウトを自動的に処理します。
word_marginやline_marginなどの設定は必要ありません。 - 速度 — pdfminer は Python の PDF ライブラリの中で最も遅いです。PDF Oxide は約 30 倍高速です。
- オールインワン — pdfminer は抽出のみですが、PDF Oxide は PDF の作成、編集、レンダリングも行えます。
ステップ 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}")
その他の移行ガイド
関連ページ
- Python で始める — インストールガイド
- PDF からテキストを抽出する — テキスト抽出ガイド