PDF Oxide vs PyMuPDF
PDF Oxide は MIT ライセンスで、PyMuPDF より 5.8 倍速く、AGPL 由来のコンプライアンス負担もありません。商用プロダクトで PyMuPDF を検討中の方、ライセンス問題で乗り換えを考えている方向けに、主要な相違点を整理しました。
PyMuPDF から乗り換える理由
ライセンス。 PyMuPDF は AGPL-3.0 の MuPDF を内包しています。PyMuPDF を含むソフトウェア(SaaS、Web アプリ、Docker コンテナ含む)を配布する場合、ソースコードを AGPL で公開するか、Artifex から商用ライセンスを購入する必要があります。PDF Oxide は MIT ライセンスで、こうした制約はありません。
速度。 PDF Oxide のテキスト抽出は平均 0.8 ms、PyMuPDF は 4.6 ms。3,830 PDF での比較で 5.8 倍の差があります。
信頼性。 同じコーパスで PDF Oxide は 100% のパス率、PyMuPDF は 99.3% (有効な PDF 27 件で失敗) に留まります。
簡易比較
| PDF Oxide | PyMuPDF | |
|---|---|---|
| ライセンス | MIT | AGPL-3.0 |
| 平均抽出時間 | 0.8 ms | 4.6 ms |
| パス率 (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 には Markdown 変換機能がない。
# pymupdf4llm (別パッケージ、PDF Oxide より 69 倍遅い) を使う:
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 は Markdown から PDF を生成できない。
# ページ上にテキストを手で配置する必要がある:
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.8 ms | 4.6 ms |
| p99 抽出時間 | 9 ms | 28 ms |
| パス率 (有効 PDF) | 100% (3,823/3,823) | 99.3% (3,796/3,823) |
| テキスト品質パリティ | 99.5% | 基準 |
コーパスの内訳と再現手順は ベンチマーク方法論の全文 を参照してください。
AGPL ライセンスの実際の影響
PyMuPDF は MuPDF をラップしており、MuPDF は AGPL-3.0 ライセンスです。次のケースで影響を受けます:
- ソフトウェアを配布している — バイナリ、Docker イメージ、Electron アプリなど PyMuPDF を含むもの
- 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 を置換:
import fitz→from pdf_oxide import PdfDocument - オープンを置換:
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 で始める — インストールと最初の抽出