Skip to content

PDF Oxide vs PyMuPDF

PDF Oxide — это более быстрая альтернатива PyMuPDF с лицензией MIT. Если вы рассматриваете PyMuPDF для коммерческого проекта или хотите заменить его из-за лицензии AGPL, на этой странице описаны ключевые различия.

Почему разработчики переходят с PyMuPDF

Лицензирование. PyMuPDF использует MuPDF под лицензией AGPL-3.0. Если вы распространяете программное обеспечение, включающее PyMuPDF — в том числе SaaS, веб-приложения и Docker-контейнеры, — ваш код должен быть открыт под AGPL, либо вам нужно купить коммерческую лицензию у Artifex. PDF Oxide лицензирован под MIT без каких-либо ограничений.

Скорость. PDF Oxide извлекает текст в среднем за 0,8 мс против 4,6 мс у PyMuPDF — в 5,8 раза быстрее на 3 830 PDF-файлах.

Надёжность. PDF Oxide достигает 100% успешных обработок на том же корпусе, где PyMuPDF проходит 99,3% (27 сбоев на корректных PDF).

Краткое сравнение

PDF Oxide PyMuPDF
Лицензия MIT AGPL-3.0
Среднее время извлечения 0,8 мс 4,6 мс
Доля успешных (3 830 PDF) 100% 99,3%
Извлечение текста Да Да
Позиции символов Да Да
Извлечение изображений Да Да
Поля форм Чтение + запись Чтение + запись
Создание PDF Да (Markdown/HTML) Да
Вывод в Markdown Да Нет
Вывод в HTML Да Нет
Шифрование Чтение + запись Чтение + запись
Рендеринг Да Да
OCR Встроенный (PaddleOCR) Tesseract
Размер установки ~5 МБ ~20 МБ
Версии 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"])

Создание PDF из Markdown

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 830 PDF-файлах из трёх независимых публичных наборов тестов (veraPDF, Mozilla pdf.js, DARPA SafeDocs).

Метрика PDF Oxide PyMuPDF
Среднее время извлечения 0,8 мс 4,6 мс
Время извлечения p99 9 мс 28 мс
Доля успешных (корректные PDF) 100% (3 823/3 823) 99,3% (3 796/3 823)
Совпадение качества текста 99,5% Базовый уровень

Подробности о корпусе и шаги для воспроизведения см. в полной методологии бенчмарка.

Лицензирование AGPL: что это значит для вас

PyMuPDF оборачивает 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. Замените открытие: 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

Связанные страницы