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

Пов’язані сторінки