Skip to content

pdfminer.six から PDF Oxide への移行

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

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

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

  1. 約 30 倍高速 — pdfminer は主要な Python PDF ライブラリの中で最も遅いです。PDF Oxide はページあたり平均 0.8ms ですが、pdfminer は数十ミリ秒かかります。数分かかっていたバッチ処理が数秒で完了します。
  2. 活発にメンテナンス — pdfminer.six の更新頻度は低く、未解決の issue が大量にあります。PDF Oxide は活発に開発されており、定期的にリリースされています。
  3. オールインワン — pdfminer はテキスト抽出しかできません。PDF Oxide は PDF の作成、編集、ページレンダリング、画像抽出、フォーム処理、Markdown/HTML 変換もすべて対応しています。
  4. 設定不要 — pdfminer ではまともな結果を得るために LAParamsword_marginline_marginchar_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)

主な違い

  1. LAParams の調整が不要 — PDF Oxide はレイアウトを自動的に処理します。word_marginline_margin などの設定は必要ありません。
  2. 速度 — pdfminer は Python の PDF ライブラリの中で最も遅いです。PDF Oxide は約 30 倍高速です。
  3. オールインワン — 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}")

その他の移行ガイド

関連ページ