Skip to content

PDF Oxide vs pdfplumber

PDF Oxide はテキスト抽出において pdfplumber より29倍高速でありながら、より幅広い機能セットを備えています。一方、pdfplumber はテーブル抽出アルゴリズムがより成熟しています。このページは、用途に応じて適切なツールを選ぶための手助けとなります。

主な違い

速度。 pdfplumber は純粋な Python(pdfminer をベースに構築)です。PDF Oxide の Rust コアはテキストを平均0.8msで抽出し、23.2msに対して29倍高速です。

信頼性。 PDF Oxide は3,830件のテスト用 PDF を100%合格します。pdfplumber の合格率は98.8%で、有効な PDF で46件の失敗が発生します。

テーブル。 pdfplumber は、あらゆる Python PDF ライブラリの中で最も優れたテーブル抽出機能を備えています。PDF Oxide のテーブル検出は実用的ではありますが、結合セルを含む複雑な複数行・複数列のレイアウトに対してはまだ成熟していません。

スコープ。 pdfplumber は読み取り専用です。PDF Oxide は作成、編集、暗号化、レンダリング、Markdown/HTML 出力を加えています。

クイック比較

PDF Oxide pdfplumber
平均抽出時間 0.8ms 23.2ms
合格率(3,830件の PDF) 100% 98.8%
ライセンス MIT MIT
言語 Rust + PyO3 純粋な Python
テキスト抽出 あり あり
文字位置 あり あり
テーブル抽出 基本的 高度
画像抽出 あり なし
ビジュアルデバッグ なし あり
Markdown 出力 あり なし
HTML 出力 あり なし
PDF 作成 あり なし
PDF 編集 あり なし
暗号化 読み取り + 書き込み なし
レンダリング あり なし
フォームフィールド 読み取り + 書き込み 読み取りのみ

コードの並列比較

テキスト抽出

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

文字レベルの抽出

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars[:10]:
    print(f"'{ch.char}' at ({ch.x:.1f}, {ch.y:.1f}) size={ch.font_size:.1f}")

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    for char in page.chars[:10]:
        print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
              f"size={char['size']:.1f}")

テーブル抽出

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("invoice.pdf")
md = doc.to_markdown(0, detect_headings=True)
# Tables are converted to Markdown table syntax
print(md)

pdfplumber:

import pdfplumber

with pdfplumber.open("invoice.pdf") as pdf:
    page = pdf.pages[0]
    tables = page.extract_tables()
    for table in tables:
        for row in table:
            print(row)

pdfplumber の extract_tables() は、設定可能な罫線検出を備えた構造化された行/列データを返します。結合セル、結合ヘッダー、または罫線のないレイアウトを含む複雑なテーブルでは、pdfplumber のアルゴリズムの方が堅牢です。

ベンチマークの詳細

指標 PDF Oxide pdfplumber
平均抽出時間 0.8ms 23.2ms
p99 抽出時間 9ms 189ms
合格率(有効な PDF) 100% (3,823/3,823) 98.8% (3,777/3,823)

29倍の速度差は、pdfplumber の純粋な Python アーキテクチャに起因します。pdfplumber は解析に pdfminer をベースとし、その上に独自の空間解析レイヤーを追加していますが、いずれも Python で書かれています。PDF Oxide は、すべての解析、フォントデコード、テキスト組み立てをコンパイル済みの Rust で処理します。

コーパスの詳細については完全なベンチマーク手法をご覧ください。

それぞれの使いどころ

次の場合は PDF Oxide を選択:

  • 速度が重要。 数千件の PDF を処理する場合、29倍の高速化は時間単位ではなく分単位での処理を意味します。
  • 抽出以上のものが必要。 作成、編集、暗号化、レンダリング、または Markdown 出力。
  • 最大限の信頼性が欲しい。 98.8%に対して合格率100%。
  • 画像抽出が必要。 pdfplumber は画像を抽出しません。
  • バッチ処理パイプライン。 1 PDF あたり0.8msということは、3,830件の PDF を3.1秒で処理できることを意味します。

次の場合は pdfplumber を選択:

  • 複雑なテーブル抽出が主な用途。 pdfplumber のテーブルアルゴリズムは、結合セル、罫線のないテーブル、結合ヘッダーをより適切に処理します。
  • ビジュアルデバッグが必要。 pdfplumber は、検出された罫線、文字、テーブル境界を示す注釈付きのページ画像をレンダリングできます。
  • 純粋な Python を好む。 コンパイル済みの依存関係がなく、どこにでもインストールできます。

両方を使う:

高速なテキスト抽出と複雑なテーブル解析の両方が必要なパイプラインでは、テキストには PDF Oxide を、テーブルには pdfplumber を使用します:

from pdf_oxide import PdfDocument
import pdfplumber

# Fast text extraction with PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)

# Complex table extraction with pdfplumber
with pdfplumber.open("report.pdf") as pdf:
    tables = pdf.pages[0].extract_tables()

関連ページ