Skip to content

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")

手順

  1. インストール: pip install pdf_oxide
  2. import を置換: import fitzfrom pdf_oxide import PdfDocument
  3. オープンを置換: fitz.open(path)PdfDocument(path)
  4. 抽出を置換: page.get_text()doc.extract_text(page_index)
  5. 画像処理を置換: 多段の xref 参照 → doc.extract_images(page_index)
  6. パスワード処理を更新: PdfDocument(path, password="pw") か、開いた後の doc.authenticate("pw") を使う
  7. テスト: 既存のテストファイルでパイプラインを実行する

PyMuPDF を継続利用すべきケース

  • 既に MuPDF の商用ライセンスを保有し、MuPDF 固有のレンダリングに依存している
  • SVG エクスポートが必要 (PDF Oxide は SVG 出力に対応していない)
  • プロジェクト自体が既に AGPL ライセンスである

関連ページ