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()
関連ページ
- パフォーマンスベンチマーク — コーパス全体の結果
- Python PDF ライブラリとの比較 — 全 Python ライブラリの比較
- PDF からのテーブル抽出 — テーブル抽出ガイド
- Python で始める — インストールと最初の抽出