PDF Oxide vs pypdfium2
PDF Oxide と pypdfium2 はどちらもネイティブコンパイルされた高速な Python PDF ライブラリです。pypdfium2 は Google の PDFium エンジンをラップし、PDF Oxide は Rust コア上に構築されています。最大の違いは機能範囲:pypdfium2 は主にリーダーとレンダラーである一方、PDF Oxide は作成、抽出、OCR、フォーム、暗号化、コンプライアンスまで PDF のライフサイクル全体をカバーします。
主な違い
速度。 どちらも高速です。PDF Oxide はわずかに速く、平均 0.8ms vs 4.1ms(5.1 倍の差)。どちらも Pure Python ライブラリに比べると劇的に高速です。
機能。 pypdfium2 はレンダリング付きの読み取り専用です。PDF Oxide は作成、編集、フォーム書き込み、暗号化、Markdown/HTML 出力、OCR にも対応しています。
信頼性。 PDF Oxide は有効な PDF の 100% をパス。pypdfium2 は 99.2% — 31 件の失敗があります。
ライセンス。 どちらもパーミッシブライセンスです。PDF Oxide は MIT、pypdfium2 は Apache-2.0。いずれも AGPL の問題はありません。
比較概要
| PDF Oxide | pypdfium2 | |
|---|---|---|
| 平均抽出時間 | 0.8ms | 4.1ms |
| パス率(3,830 PDF) | 100% | 99.2% |
| ライセンス | MIT | Apache-2.0 |
| 言語 | Rust + PyO3 | C (PDFium) |
| テキスト抽出 | あり | あり |
| 文字位置 | あり | あり |
| 画像抽出 | あり | あり |
| Markdown 出力 | あり | なし |
| HTML 出力 | あり | なし |
| PDF 作成 | あり | なし |
| PDF 編集 | あり | なし |
| フォームフィールド | 読み書き | 読み取りのみ |
| 暗号化 | 読み書き | 読み取りのみ |
| レンダリング | あり | あり |
| OCR | 内蔵 | なし |
| 検索 | 正規表現 + 空間検索 | あり |
コード比較
テキスト抽出
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
pypdfium2:
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
textpage = page.get_textpage()
text = textpage.get_text_range()
print(text)
画像抽出
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
with open(f"image_{i}.{img['format']}", "wb") as f:
f.write(img["data"])
pypdfium2:
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
for i, obj in enumerate(page.get_objects()):
if obj.type == pdfium.FPDF_PAGEOBJ_IMAGE:
bitmap = obj.get_bitmap()
bitmap.to_pil().save(f"image_{i}.png")
PDF 作成
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Report\n\nQuarterly results are in.")
pdf.save("report.pdf")
pypdfium2:
# pypdfium2 では PDF を作成できません。
# レンダリング機能付きの読み取り専用ライブラリです。
レンダリング
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
image = doc.render_page(0, dpi=150)
image.save("page.png")
pypdfium2:
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
bitmap = page.render(scale=150/72)
bitmap.to_pil().save("page.png")
ベンチマーク詳細
| 指標 | PDF Oxide | pypdfium2 |
|---|---|---|
| 平均抽出時間 | 0.8ms | 4.1ms |
| p99 抽出時間 | 9ms | 42ms |
| パス率(有効 PDF) | 100%(3,823/3,823) | 99.2%(3,792/3,823) |
どちらもネイティブコード(それぞれ Rust と C)を使用していますが、PDF Oxide のテキスト抽出パイプラインはこのタスクに特化して最適化されています。シングルパス抽出、事前割り当てバッファ、キャッシュされたページツリーを使用しています。
ベンチマークの詳細はパフォーマンスベンチマークをご覧ください。
機能の網羅性
2 つのライブラリの最大の違いは機能範囲です。pypdfium2 はレンダリング付きリーダーで、PDF Oxide は PDF のライフサイクル全体をカバーします:
| 機能 | PDF Oxide | pypdfium2 |
|---|---|---|
| 読み取りと抽出 | あり | あり |
| ページレンダリング | あり | あり |
| PDF 作成 | あり(Markdown, HTML, 画像) | なし |
| 既存 PDF の編集 | あり(テキスト, 画像, 注釈) | なし |
| フォームフィールド入力 | あり | なし |
| 暗号化書き込み | あり(AES-256) | なし |
| Markdown/HTML 出力 | あり | なし |
| スキャンページの OCR | あり(ONNX 経由 PaddleOCR) | なし |
| PDF/A バリデーション | あり | なし |
PDF の読み取りとレンダリングだけが必要であれば、pypdfium2 は堅実な選択肢です。作成、編集、フォーム入力、暗号化のいずれかの書き込み機能が必要な場合は、PDF Oxide がワンストップソリューションになります。
pypdfium2 のライセンス(Apache-2.0)
pypdfium2 は Apache-2.0 ライセンスで、商用利用が可能です。ただし、Google の PDFium(Chromium の PDF エンジン)をラップしており、独自の BSD スタイルのライセンスがあります。どちらもパーミッシブです。
主なポイント:
- Apache-2.0 — パーミッシブ、商用利用可、帰属表示が必要
- PDFium 依存 — バイナリには Chromium の PDFium エンジン(~15 MB)が含まれます
- Google のリリースサイクル — pypdfium2 は Chromium プロジェクトからの PDFium リリースに依存
- Python API の安定性保証なし — API は PDFium の C API に忠実に従っています
PDF Oxide は MIT ライセンスで、Apache-2.0 よりもさらにパーミッシブです。バイナリ配布時の帰属表示義務もありません。
使い分けガイド
PDF Oxide を選ぶべき場合:
- 読み取り/レンダリング以上の機能が必要(作成、編集、フォーム、暗号化)
- Markdown や HTML への変換が必要
- スキャンドキュメント用の内蔵 OCR が必要
- 最高の信頼性が必要(100% vs 99.2%)
- 速度が重要で、大規模処理で 5 倍の差が問題になる
pypdfium2 を選ぶべき場合:
- PDF の読み取りとレンダリングだけが必要
- PDFium 固有のレンダリング出力を好む
- より小さな依存パッケージサイズを求める
関連ページ
- パフォーマンスベンチマーク — コーパス全体の結果
- Python PDF ライブラリとの比較 — 全 Python ライブラリの比較
- Python で始める — インストールと最初の抽出