Skip to content

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

ステップバイステップ

  1. インストール: pip install pdf_oxide
  2. インポートの置き換え: import fitzfrom pdf_oxide import PdfDocument
  3. open の置き換え: 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 ライセンスである

関連ページ