PDF Oxide vs PyMuPDF
PDF Oxide は、PyMuPDF より高速な MIT ライセンスの代替ライブラリです。商用プロジェクト向けに PyMuPDF を検討している場合や、AGPL ライセンスを理由に置き換えを考えている場合、このページでは主な違いを解説します。
なぜ開発者は PyMuPDF から乗り換えるのか
ライセンス。 PyMuPDF は AGPL-3.0 ライセンスの MuPDF を利用しています。PyMuPDF を含むソフトウェアを配布する場合 — SaaS、Web アプリ、Docker コンテナを含む — コードを AGPL でオープンソース化するか、Artifex から商用ライセンスを購入する必要があります。PDF Oxide は MIT ライセンスで、制約は一切ありません。
速度。 PDF Oxide はテキストを平均 0.8ms で抽出し、PyMuPDF の 4.6ms に対して 3,830 件の PDF で 5.8 倍高速です。
信頼性。 PDF Oxide は、PyMuPDF が 99.3% の合格率(有効な PDF で 27 件の失敗)にとどまる同一コーパスで 100% の合格率を達成します。
簡易比較
| PDF Oxide | PyMuPDF | |
|---|---|---|
| ライセンス | MIT | AGPL-3.0 |
| 平均抽出時間 | 0.8ms | 4.6ms |
| 合格率(3,830 件の PDF) | 100% | 99.3% |
| テキスト抽出 | あり | あり |
| 文字位置 | あり | あり |
| 画像抽出 | あり | あり |
| フォームフィールド | 読み取り + 書き込み | 読み取り + 書き込み |
| PDF 生成 | あり(Markdown/HTML) | あり |
| Markdown 出力 | あり | なし |
| HTML 出力 | あり | なし |
| 暗号化 | 読み取り + 書き込み | 読み取り + 書き込み |
| レンダリング | あり | あり |
| OCR | 内蔵(PaddleOCR) | Tesseract |
| インストールサイズ | 約 5 MB | 約 20 MB |
| Python バージョン | 3.8–3.14 | 3.8–3.12 |
コードの並列比較
テキスト抽出
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
Markdown 変換
PDF Oxide(内蔵):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
PyMuPDF:
# PyMuPDF has no built-in Markdown conversion.
# Use pymupdf4llm (separate package, 69× slower than PDF Oxide):
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
画像抽出
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"])
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
for i, img in enumerate(page.get_images()):
xref = img[0]
base_image = doc.extract_image(xref)
with open(f"image_{i}.{base_image['ext']}", "wb") as f:
f.write(base_image["image"])
Markdown からの PDF 生成
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")
PyMuPDF:
import fitz
# PyMuPDF cannot create PDFs from Markdown.
# You must manually place text on pages:
doc = fitz.open()
page = doc.new_page()
page.insert_text(fitz.Point(72, 72), "Invoice", fontsize=24)
doc.save("invoice.pdf")
ベンチマークの詳細
3 つの独立した公開テストスイート(veraPDF、Mozilla pdf.js、DARPA SafeDocs)から取得した 3,830 件の PDF でベンチマークを実施しました。
| 指標 | PDF Oxide | PyMuPDF |
|---|---|---|
| 平均抽出時間 | 0.8ms | 4.6ms |
| p99 抽出時間 | 9ms | 28ms |
| 合格率(有効な PDF) | 100%(3,823/3,823) | 99.3%(3,796/3,823) |
| テキスト品質の一致率 | 99.5% | ベースライン |
コーパスの詳細と再現手順についてはベンチマーク方法論の全文をご覧ください。
AGPL ライセンス: あなたにとっての意味
PyMuPDF は MuPDF をラップしており、MuPDF は AGPL-3.0 ライセンスです。以下の場合に影響があります:
- ソフトウェアを配布する — PyMuPDF を使用するソフトウェア(バイナリ、Docker イメージ、Electron アプリ)
- SaaS を運営する — サーバー上で PyMuPDF がユーザーの PDF を処理する場合
- 製品に PyMuPDF を組み込む — API の背後にあるマイクロサービスであっても
これらすべてのケースで、AGPL はアプリケーション全体のソースコードを AGPL-3.0 で公開すること、または Artifex から商用ライセンスを購入することを要求します。
PDF Oxide は MIT ライセンスです。商用、プロプライエタリ、SaaS、オープンソースのいずれのプロジェクトでも、義務なしに利用できます。
| ユースケース | PDF Oxide(MIT) | PyMuPDF(AGPL) |
|---|---|---|
| 商用製品 | あり | ライセンスが必要 |
| クローズドソース SaaS | あり | ライセンスが必要 |
| 社内ツール | あり | あり |
| オープンソースプロジェクト | あり | あり(AGPL 互換の場合) |
| Docker 配布 | あり | ライセンスが必要 |
PyMuPDF 商用ライセンスの価格
Artifex(MuPDF と PyMuPDF を提供する企業)は、商用ライセンスの価格を公開していません。業界の報告に基づくと:
- 問い合わせが必要 — Artifex の営業に見積もりを依頼する必要があります
- アプリケーション単位のライセンス — 価格はデプロイの種類と規模によって異なります
- 年間料金 — 商用ライセンスは通常、毎年更新されます
- 無料枠なし — AGPL に「コミュニティ」や「スタートアップ」向けの例外はありません
商用利用のために PyMuPDF を検討するチームにとって、ライセンス費用は開発時間に加わる継続的な運用コストとなります。
PDF Oxide は MIT ライセンスです — あらゆる用途で永久に無料。 営業との通話も、ライセンス監査も、コンプライアンスリスクもありません。SaaS での利用、Docker コンテナでの配布、商用製品への組み込み — 制約は一切ありません。
移行ガイド
API 対応表
| タスク | PyMuPDF | PDF Oxide |
|---|---|---|
| PDF を開く | fitz.open("f.pdf") |
PdfDocument("f.pdf") |
| ページ数 | doc.page_count |
doc.page_count() |
| テキスト抽出 | doc[0].get_text() |
doc.extract_text(0) |
| 文字データ | doc[0].get_text("dict") |
doc.extract_chars(0) |
| 画像抽出 | doc[0].get_images() + doc.extract_image(xref) |
doc.extract_images(0) |
| テキスト検索 | doc[0].search_for("query") |
doc.search_page(0, "query") |
| 暗号化された PDF | doc.authenticate("pw") |
PdfDocument("f.pdf", password="pw") |
| Markdown へ変換 | pymupdf4llm(別パッケージ) | doc.to_markdown(0) |
| テキストから生成 | 手動の insert_text() |
Pdf.from_markdown("# Title") |
ステップバイステップ
- インストール:
pip install pdf_oxide - インポートの置き換え:
import fitz→from pdf_oxide import PdfDocument - open の置き換え:
fitz.open(path)→PdfDocument(path) - 抽出の置き換え:
page.get_text()→doc.extract_text(page_index) - 画像の置き換え: 複数ステップの xref 参照 →
doc.extract_images(page_index) - パスワード処理の更新:
PdfDocument(path, password="pw")を使うか、開いた後にdoc.authenticate("pw")を使用 - テスト: 既存のテストファイルでパイプラインを実行
PyMuPDF を使い続けるべき場合
- すでに商用 MuPDF ライセンスを持っており、MuPDF 固有のレンダリングに依存している
- SVG エクスポートが必要(PDF Oxide は SVG 出力をサポートしていません)
- プロジェクトがすでに AGPL ライセンスである
関連ページ
- パフォーマンスベンチマーク — コーパスの全結果
- vs Python PDF ライブラリ — すべての Python ライブラリの比較
- Python で始める — インストールと最初の抽出