Skip to content

PDF Oxide vs pdfplumber

PDF Oxide はテキスト抽出が pdfplumber の 29 倍速く、Markdown/HTML 出力、Tesseract 不要の OCR、暗号化 PDF の対応まで揃っています。pdfplumber は複雑なテーブル抽出ではまだ強力 — 用途に合わせた選び方をまとめます。

主な違い

速度。 pdfplumber は Pure Python(pdfminer ベース)です。PDF Oxide の Rust コアは平均 0.8ms でテキストを抽出しますが、pdfplumber は 23.2ms — 29 倍の差があります。

信頼性。 PDF Oxide は 3,830 件のテスト PDF すべてに合格し、100% のパス率を達成しています。pdfplumber は 98.8% で、有効な PDF のうち 46 件が失敗します。

テーブル抽出。 pdfplumber は Python PDF ライブラリの中で最高のテーブル抽出機能を持っています。PDF Oxide のテーブル検出は動作しますが、セル結合を含む複雑な多行・多列レイアウトでは pdfplumber に及びません。

機能範囲。 pdfplumber は読み取り専用です。PDF Oxide は作成、編集、暗号化、レンダリング、Markdown/HTML 出力にも対応しています。

比較概要

PDF Oxide pdfplumber
平均抽出時間 0.8ms 23.2ms
パス率(3,830 PDF) 100% 98.8%
ライセンス MIT MIT
言語 Rust + PyO3 Pure 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)
# テーブルは Markdown テーブル構文に変換されます
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 の Pure Python アーキテクチャに起因します。pdfplumber はパース処理に pdfminer を使用し、その上に独自の空間分析レイヤーを追加しています。いずれも Python で記述されています。PDF Oxide はパース、フォントデコード、テキスト組み立てのすべてをコンパイル済み Rust で処理します。

ベンチマークの詳細はパフォーマンスベンチマークをご覧ください。

使い分けガイド

PDF Oxide を選ぶべき場合:

  • 速度が重要。 数千の PDF を処理する場合、29 倍の差は数時間と数分の違いになります。
  • 抽出以外の機能も必要。 作成、編集、暗号化、レンダリング、Markdown 出力。
  • 最高の信頼性が必要。 100% のパス率 vs 98.8%。
  • 画像抽出が必要。 pdfplumber には画像抽出機能がありません。
  • バッチ処理パイプライン。 1 PDF あたり 0.8ms で、3,830 件の PDF を 3.1 秒で処理できます。

pdfplumber を選ぶべき場合:

  • 複雑なテーブル抽出がメインの用途。 pdfplumber のテーブルアルゴリズムは、セル結合、罫線なしテーブル、スパニングヘッダーに優れています。
  • ビジュアルデバッグが必要。 pdfplumber は検出された罫線、文字、テーブル境界を表示するアノテーション付きページ画像をレンダリングできます。
  • Pure Python にこだわりたい。 コンパイル済み依存パッケージなしで、どこでもインストールできます。

両方使う:

高速なテキスト抽出と複雑なテーブル解析の両方が必要なパイプラインでは、テキストに PDF Oxide、テーブルに pdfplumber を使い分けるのが効果的です:

from pdf_oxide import PdfDocument
import pdfplumber

# PDF Oxide で高速テキスト抽出
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)

# pdfplumber で複雑なテーブル抽出
with pdfplumber.open("report.pdf") as pdf:
    tables = pdf.pages[0].extract_tables()

関連ページ