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 — встановлення та перше видобування