PyMuPDF vs pypdf
PyMuPDF та pypdf — дві з найпопулярніших бібліотек PDF для Python, але обидві мають значні компроміси. PyMuPDF швидка, але заблокована ліцензією AGPL-3.0. pypdf має дозвільну ліцензію, але у 15× повільніша. Ця сторінка порівнює їх безпосередньо — та показує, чому PDF Oxide є кращим вибором, ніж будь-яка з них.
Коротка відповідь: PDF Oxide у 5.8× швидший за PyMuPDF, у 15× швидший за pypdf, з ліцензією MIT, та має більше функцій, ніж обидві — включаючи вбудований вивід Markdown/HTML, підтримку форм XFA та OCR без системних залежностей.
Швидке порівняння
| PyMuPDF | pypdf | PDF Oxide | |
|---|---|---|---|
| Ліцензія | AGPL-3.0 | BSD-3 | MIT |
| Мова | C (MuPDF) | Чистий Python | Rust + PyO3 |
| Середній час вилучення | 4.6мс | 12.1мс | 0.8мс |
| Час вилучення p99 | 28мс | 97мс | 9мс |
| Рівень успіху (3 830 PDF) | 99.3% | 98.4% | 100% |
| Вилучення тексту | Так | Так | Так |
| Позиції символів | Так | Частково | Так |
| Вилучення зображень | Так | Так | Так |
| Поля форм | Читання + Запис | Читання + Запис | Читання + Запис |
| Створення PDF | Так | Обмежено (тільки об’єднання) | Так (Markdown/HTML) |
| Вивід Markdown | Ні | Ні | Так |
| Вивід HTML | Ні | Ні | Так |
| Рендеринг | Так | Ні | Так |
| OCR | Tesseract | Ні | Вбудований (PaddleOCR) |
| Шифрування | Читання + Запис | Читання + Запис | Читання + Запис |
Ліцензування: AGPL vs BSD vs MIT
PyMuPDF — AGPL-3.0
PyMuPDF використовує MuPDF під ліцензією AGPL-3.0. Це сильна copyleft-ліцензія. Якщо ви розповсюджуєте будь-яке програмне забезпечення, що використовує PyMuPDF — включаючи SaaS-застосунки, Docker-контейнери, веб-сервіси, десктопні застосунки або CLI-інструменти — весь ваш застосунок повинен бути випущений під AGPL-3.0.
Альтернатива — придбання комерційної ліцензії від Artifex. Ціни не публікуються; потрібно зв’язатися з їхнім відділом продажів.
pypdf — BSD-3
pypdf використовує ліцензію BSD 3-Clause, яка є дозвільною. Ви можете використовувати pypdf у комерційних продуктах без зобов’язань відкривати код.
PDF Oxide — MIT
PDF Oxide має ліцензію MIT — найбільш дозвільну поширену ліцензію відкритого коду.
Підсумок ліцензування
| Випадок використання | PyMuPDF (AGPL) | pypdf (BSD) | PDF Oxide (MIT) |
|---|---|---|---|
| Комерційний продукт | Потребує ліцензію | Так | Так |
| SaaS із закритим кодом | Потребує ліцензію | Так | Так |
| Розповсюдження Docker | Потребує ліцензію | Так | Так |
| Внутрішні інструменти | Так | Так | Так |
| Відкритий код (сумісний з AGPL) | Так | Так | Так |
| Відкритий код (MIT/BSD/Apache) | Ні | Так | Так |
Бенчмарки швидкості
Швидкість вилучення тексту
| Бібліотека | Середнє | p99 | Відносно PDF Oxide |
|---|---|---|---|
| PDF Oxide | 0.8мс | 9мс | 1× |
| PyMuPDF | 4.6мс | 28мс | У 5.8× повільніший |
| pypdf | 12.1мс | 97мс | У 15.1× повільніший |
Надійність
| Бібліотека | Оброблено валідних PDF | Рівень успіху |
|---|---|---|
| PDF Oxide | 3 823 / 3 823 | 100% |
| PyMuPDF | 3 796 / 3 823 | 99.3% |
| pypdf | 3 762 / 3 823 | 98.4% |
Що це означає на практиці
Для пайплайна, що обробляє тисячі PDF щоденно, 99,3 % показник PyMuPDF означає приблизно 7 збоїв на 1 000 документів. У pypdf показник 98,4 % — це 16 збоїв на 1 000. Ці документи доведеться обробляти резервною логікою, вручну переглядати або просто втрачати як “недоступні”.
100 % показник PDF Oxide на тестовому корпусі означає менше граничних випадків у продакшені.
Порівняння функцій
Вилучення тексту
Усі три бібліотеки підтримують базове вилучення тексту. API відрізняються стилем:
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
text = reader.pages[0].extract_text()
print(text)
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
Усі три дають порівнянний текст на коректних PDF. PyMuPDF і PDF Oxide мають схожу продуктивність; pypdf у 15× повільніший.
Конвертація в Markdown
PyMuPDF:
# PyMuPDF не має вбудованої конвертації в Markdown.
# Потрібен pymupdf4llm, окремий пакет:
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
pymupdf4llm працює, але у 69× повільніший за вбудовану конвертацію PDF Oxide.
pypdf:
# pypdf не має конвертації в Markdown.
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
Конвертація в HTML
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
html = doc[0].get_text("html")
pypdf:
# pypdf не має вбудованої конвертації в HTML.
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
html = doc.to_html(0)
PyMuPDF і PDF Oxide обидва конвертують у HTML. Вихід PDF Oxide зазвичай компактніший і ближчий до семантичного HTML.
Поля форми
Усі три бібліотеки підтримують читання та запис полів форм (AcroForm). Помітна різниця: PDF Oxide підтримує форми XFA (XML Forms Architecture), які використовуються в багатьох урядових та корпоративних PDF-формах. Ні PyMuPDF, ні pypdf не обробляють вилучення даних форм XFA.
Вилучення зображень
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
for img in page.get_images():
xref = img[0]
pix = fitz.Pixmap(doc, xref)
pix.save(f"image_{xref}.png")
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
for i, img in enumerate(reader.pages[0].images):
with open(f"image_{i}.png", "wb") as f:
f.write(img.data)
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i, img in enumerate(doc.extract_images(0)):
with open(f"image_{i}.png", "wb") as f:
f.write(img.data)
Усі три дозволяють вилучати вбудовані зображення. API PDF Oxide і pypdf практично ідентичні; PyMuPDF вимагає роботи з Pixmap.
Рендеринг
PyMuPDF може рендерити сторінки у PNG / JPEG / PPM через page.get_pixmap(). pypdf не має рендерингу. PDF Oxide рендерить сторінки в зображення через doc.render_page(index, format="png") — без зовнішніх залежностей.
OCR
PyMuPDF + Tesseract: потрібно встановити Tesseract окремо як системну залежність і викликати його як підпроцес. Не входить до PyMuPDF напряму.
pypdf: OCR не підтримується.
PDF Oxide: вбудований OCR через PaddleOCR (ONNX Runtime). Без Tesseract, без підпроцесів — модель завантажена в бібліотеці:
from pdf_oxide import PdfDocument
doc = PdfDocument("scanned.pdf")
text = doc.extract_text_ocr(0)
Підтримує сімейства моделей PP-OCRv3 / v4 / v5. Python-колесо вже містить моделі, додаткового завантаження не потрібно.
Створення PDF
PyMuPDF може створювати PDF, але вимагає ручного розміщення тексту, зображень та фігур на сторінках.
pypdf не може створювати PDF з нуля.
PDF Oxide може створювати PDF з Markdown або HTML:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")
Шифрування
PyMuPDF підтримує читання та створення зашифрованих PDF (AES-128 / AES-256) через doc.save(..., encryption=fitz.PDF_ENCRYPT_AES_256, owner_pw=..., user_pw=...).
pypdf підтримує шифрування RC4; підтримка AES обмежена.
PDF Oxide підтримує читання та створення PDF із AES-128 і AES-256:
from pdf_oxide import PdfDocument
doc = PdfDocument("input.pdf")
doc.save_encrypted("protected.pdf", "user-pw", "owner-pw")
PDF Oxide — MIT, тому шифрування можна використовувати в комерційних продуктах без застережень AGPL.
Підсумок функцій
| Функція | PyMuPDF | pypdf | PDF Oxide |
|---|---|---|---|
| Вилучення тексту | Так | Так | Так |
| Позиції символів | Так | Частково | Так |
| Вилучення зображень | Так | Так | Так |
| Поля форм (AcroForm) | Читання + Запис | Читання + Запис | Читання + Запис |
| Форми XFA | Ні | Ні | Так |
| Створення PDF | Ручне | Ні | Markdown/HTML |
| Вивід Markdown | Ні (pymupdf4llm) | Ні | Вбудований |
| Вивід HTML | Ні | Ні | Вбудований |
| Рендеринг | Так | Ні | Так |
| OCR | Tesseract | Ні | Вбудований (PaddleOCR) |
| Пошук | Так | Ні | Regex + просторовий |
| Шифрування | Читання + Запис | Читання + Запис | Читання + Запис |
| Валідація PDF/A | Ні | Ні | Так |
| Експорт SVG | Так | Ні | Ні |
| Об’єднання/розділення | Так | Так | Так |
Коли обирати кожну бібліотеку
Оберіть pypdf, якщо:
- Вам потрібне рішення на чистому Python без скомпільованих розширень
- Ви виконуєте просту маніпуляцію PDF (об’єднання, розділення, обертання)
- Швидкість не критична для вашого випадку використання
Оберіть PyMuPDF, якщо:
- Ви вже маєте комерційну ліцензію MuPDF від Artifex
- Вам потрібен експорт SVG зі сторінок PDF
- Ваш проєкт вже має ліцензію AGPL-3.0
Оберіть PDF Oxide, якщо:
- Вам потрібна максимальна швидкість вилучення тексту
- Ви хочете ліцензію MIT для комерційного використання або закритого коду
- Вам потрібен вбудований вивід Markdown або HTML для конвеєрів LLM/RAG
- Вам потрібна підтримка форм XFA
- Ви хочете вбудований OCR без зовнішніх системних залежностей
- Ви хочете 100% надійність на валідних PDF
Встановлення
# PyMuPDF
pip install pymupdf
# pypdf
pip install pypdf
# PDF Oxide
pip install pdf_oxide
Вердикт
Якщо ви обираєте між PyMuPDF та pypdf, ви обираєте між швидкістю та свободою ліцензування. PDF Oxide дає вам обидва — швидший за PyMuPDF, більш дозвільний за pypdf, з функціями, які жодна з двох бібліотек не пропонує.
| Що вам важливо | Найкращий вибір |
|---|---|
| Максимальна швидкість | PDF Oxide (0.8мс) |
| Дозвільна ліцензія | PDF Oxide (MIT) або pypdf (BSD) |
| Швидкість + дозвільна ліцензія | PDF Oxide — єдиний варіант |
| Вивід Markdown/HTML | PDF Oxide — вбудований |
| Форми XFA | PDF Oxide — єдина бібліотека, що їх підтримує |
| 100% надійність | PDF Oxide — 100% рівень успіху |
| OCR без Tesseract | PDF Oxide — вбудований PaddleOCR |
| Експорт SVG | PyMuPDF |
| Чистий Python, без бінарних файлів | pypdf |
Розпочніть за 10 секунд:
pip install pdf_oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
Пов’язані сторінки
- PDF Oxide vs PyMuPDF — детальне порівняння
- PDF Oxide vs pypdf — детальне порівняння
- Порівняння всіх бібліотек PDF для Python — повне порівняння екосистеми
- Бенчмарки продуктивності — методологія та результати