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") |
Пошагово
- Установка:
pip install pdf_oxide - Замените импорты:
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 — установка и первое извлечение