PyMuPDF проти pypdf — яку Python-бібліотеку для PDF обрати?
PyMuPDF і pypdf — це дві з найпопулярніших Python-бібліотек для PDF, але обидві мають суттєві компроміси. 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.6ms | 12.1ms | 0.8ms |
| Час вилучення p99 | 28ms | 97ms | 9ms |
| Частка успішних (3830 PDF) | 99.3% | 98.4% | 100% |
| Вилучення тексту | Так | Так | Так |
| Позиції символів | Так | Частково | Так |
| Вилучення зображень | Так | Так | Так |
| Поля форм | Читання + запис | Читання + запис | Читання + запис |
| Створення PDF | Так | Обмежено (лише об’єднання) | Так (Markdown/HTML) |
| Вивід у Markdown | Ні | Ні | Так |
| Вивід у HTML | Ні | Ні | Так |
| Рендеринг | Так | Ні | Так |
| OCR | Tesseract | Ні | Вбудований (PaddleOCR) |
| Розмір встановлення | ~20 МБ | ~1 МБ | ~5 МБ |
| Шифрування | Читання + запис | Читання + запис | Читання + запис |
| Пошук | Так | Ні | Regex + просторовий |
| Версії Python | 3.8–3.12 | 3.6+ | 3.8–3.14 |
PyMuPDF швидша й багатша за можливостями, ніж pypdf, але її ліцензія AGPL є неприйнятною перешкодою для багатьох комерційних проєктів. pypdf легша та ліцензована під BSD, але помітно повільніша й більш обмежена в можливостях вилучення. PDF Oxide поєднує перевагу швидкості нативного рушія зі свободою дозвільної ліцензії.
Ліцензування: AGPL проти BSD проти MIT
Різниця в ліцензуванні між PyMuPDF і pypdf часто стає вирішальним чинником для команд, які обирають між ними.
PyMuPDF — AGPL-3.0
PyMuPDF обгортає MuPDF, який ліцензований під AGPL-3.0. Це сильна копілефт-ліцензія. Якщо ви розповсюджуєте будь-яке програмне забезпечення, що використовує PyMuPDF, — зокрема SaaS-застосунки, Docker-контейнери, вебсервіси, настільні застосунки чи CLI-інструменти, — увесь ваш застосунок має бути випущений під AGPL-3.0. Це означає публікацію всього вашого вихідного коду під тією самою ліцензією.
Альтернатива — придбання комерційної ліцензії в Artifex, компанії, що стоїть за MuPDF. Artifex не оприлюднює ціни публічно; щоб отримати розрахунок вартості, потрібно звернутися до її відділу продажів. Комерційні ліцензії зазвичай річні, а ціна встановлюється за застосунок.
AGPL стосується вас, якщо:
- Ви постачаєте продукт, що містить PyMuPDF (настільний застосунок, мобільний застосунок, Electron)
- Ви запускаєте SaaS або вебсервіс, що обробляє PDF за допомогою PyMuPDF
- Ви розповсюджуєте Docker-образи, що містять PyMuPDF
- Ви надаєте API, який усередині використовує PyMuPDF
AGPL не стосується вас, якщо:
- Ваш проєкт уже відкритий під ліцензією, сумісною з AGPL
- Ви використовуєте PyMuPDF лише для внутрішніх інструментів, які ніколи не розповсюджуються
pypdf — BSD-3
pypdf використовує ліцензію BSD 3-Clause, яка є дозвільною. Ви можете використовувати pypdf у комерційних продуктах, ПЗ із закритим кодом і SaaS-застосунках без жодного зобов’язання відкривати свій код. Єдина вимога — зберігати повідомлення про авторські права під час розповсюдження.
PDF Oxide — MIT
PDF Oxide ліцензована під MIT — найдозвільнішою з поширених ліцензій відкритого ПЗ. Використовуйте її в будь-якому контексті (комерційному, пропрієтарному, SaaS, відкритому) без жодних обмежень, окрім включення тексту ліцензії.
Підсумок щодо ліцензування
| Сценарій використання | PyMuPDF (AGPL) | pypdf (BSD) | PDF Oxide (MIT) |
|---|---|---|---|
| Комерційний продукт | Потрібна ліцензія | Так | Так |
| SaaS із закритим кодом | Потрібна ліцензія | Так | Так |
| Розповсюдження через Docker | Потрібна ліцензія | Так | Так |
| Внутрішні інструменти | Так | Так | Так |
| Відкритий код (сумісний з AGPL) | Так | Так | Так |
| Відкритий код (MIT/BSD/Apache) | Ні | Так | Так |
Для комерційних проєктів, де важливе дотримання ліцензій, і pypdf, і PDF Oxide — безпечний вибір. PyMuPDF вимагає або відкриття вихідного коду вашого застосунку, або придбання комерційної ліцензії.
Бенчмарки швидкості
Усі бенчмарки виконувалися на одному й тому самому корпусі з 3830 PDF — трьох незалежних, публічно доступних наборах тестів (veraPDF, Mozilla pdf.js, DARPA SafeDocs), що охоплюють кожну версію специфікації PDF (1.0–2.0), зашифровані файли, кодування CJK, складні макети та некоректні документи.
Швидкість вилучення тексту
| Бібліотека | Середнє | p99 | Відносно PDF Oxide |
|---|---|---|---|
| PDF Oxide | 0.8ms | 9ms | 1x |
| PyMuPDF | 4.6ms | 28ms | у 5.8x повільніше |
| pypdf | 12.1ms | 97ms | у 15.1x повільніше |
PyMuPDF у 2.6x швидша за pypdf, бо делегує розбір C-рушію MuPDF. pypdf робить усе на чистому Python — розбір, декодування шрифтів, складання тексту, — а отже, кожна операція сплачує накладні витрати інтерпретатора.
PDF Oxide швидша за обидві, бо її ядро на Rust обробляє весь розбір PDF, декодування шрифтів і розкладку тексту нативно через PyO3, і лише фінальний результат перетинає межу Python. Немає накладних витрат на підпроцеси, немає містка до C-бібліотеки через ctypes і немає вузького місця інтерпретатора.
Надійність
| Бібліотека | Пройдено валідних PDF | Частка успішних |
|---|---|---|
| PDF Oxide | 3823 / 3823 | 100% |
| PyMuPDF | 3796 / 3823 | 99.3% |
| pypdf | 3762 / 3823 | 98.4% |
PyMuPDF не справляється з 27 валідними PDF у корпусі. pypdf — з 61. В обох випадках це валідні PDF-файли, на яких бібліотека або падає, або повертає порожній чи некоректний текст. PDF Oxide обробляє всі 3823 валідних PDF без жодного збою.
7 непройдених файлів у повному корпусі з 3830 файлів — це навмисно пошкоджені тестові фікстури (відсутній заголовок PDF, зіпсовані фазингом каталоги, некоректні потоки xref), і їх виключено з розрахунку частки успішних для всіх бібліотек.
Що це означає на практиці
Для конвеєра, що обробляє тисячі PDF на день, частка успішних PyMuPDF у 99,3 % означає приблизно 7 збоїв на 1000 документів. 98,4 % у pypdf — це 16 збоїв на 1000. Це документи, які вам потрібно обробляти за допомогою резервної логіки, ручної перевірки або просто прийняти як втрачені дані.
Частка успішних PDF Oxide у 100 % на тестовому корпусі означає менше граничних випадків, з якими доведеться мати справу у продакшені.
Порівняння можливостей
Вилучення тексту
Усі три бібліотеки підтримують базове вилучення тексту. Стилі 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)
PyMuPDF використовує модель об’єктів-сторінок (doc[0] повертає сторінку). pypdf використовує патерн reader/pages. PDF Oxide використовує індекси сторінок безпосередньо.
Для вилучення на рівні символів (позиції, розміри шрифту, обмежувальні рамки) PyMuPDF надає get_text("dict"), який повертає вкладену структуру словника. pypdf пропонує часткові дані про позиції символів. PDF Oxide надає extract_chars() з обмежувальними рамками для кожного символа та метаданими шрифту.
Перетворення на Markdown
Це суттєва відмінність. Багатьом конвеєрам LLM і RAG потрібен вивід PDF у Markdown.
PyMuPDF:
# PyMuPDF has no built-in Markdown conversion.
# You need pymupdf4llm, a separate package:
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
pymupdf4llm працює, але у 69x повільніший за вбудоване перетворення на Markdown у PDF Oxide (у середньому 55.5ms проти 0.8ms). До того ж це окрема залежність зі своїм циклом супроводу.
pypdf:
# pypdf has no Markdown conversion.
# You would need an external tool chain (e.g., extract text,
# then use a separate library to structure it as Markdown).
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
Перетворення на Markdown у PDF Oxide вбудоване, обробляє виявлення заголовків, зберігає структуру таблиць і працює з тією самою швидкістю, що й вилучення звичайного тексту.
Перетворення на HTML
PyMuPDF: Немає вбудованого виводу у HTML.
pypdf: Немає виводу у HTML.
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
html = doc.to_html(0)
print(html)
Поля форм
Усі три бібліотеки підтримують читання й запис полів форм (AcroForm).
PyMuPDF:
import fitz
doc = fitz.open("form.pdf")
page = doc[0]
for widget in page.widgets():
print(f"{widget.field_name}: {widget.field_value}")
pypdf:
from pypdf import PdfReader
reader = PdfReader("form.pdf")
fields = reader.get_fields()
for name, field in fields.items():
print(f"{name}: {field.get('/V', '')}")
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for field in fields:
print(f"{field.name}: {field.value}")
Одна помітна відмінність: PDF Oxide підтримує форми XFA (XML Forms Architecture), які використовуються в багатьох державних та корпоративних PDF-формах. Ані PyMuPDF, ані pypdf не обробляють вилучення даних форм XFA.
Вилучення зображень
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"])
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
for i, image in enumerate(page.images):
with open(f"image_{i}.{image.name.split('.')[-1]}", "wb") as f:
f.write(image.data)
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 потребує двокрокового пошуку за xref. pypdf і PDF Oxide пропонують лаконічніші API.
Рендеринг
PyMuPDF може рендерити сторінки PDF у зображення (PNG, JPEG) за допомогою рушія рендерингу MuPDF. pypdf взагалі не вміє рендерити сторінки. PDF Oxide містить вбудований рушій рендерингу.
OCR
PyMuPDF інтегрується з Tesseract для OCR відсканованих PDF. pypdf не має підтримки OCR. PDF Oxide має вбудований OCR через PaddleOCR, що не потребує зовнішніх системних залежностей.
Створення PDF
PyMuPDF може створювати PDF, але потребує ручного розміщення тексту, зображень і фігур на сторінках — немає високорівневого API для створення PDF зі структурованого вмісту.
pypdf не може створювати PDF з нуля. Вона може об’єднувати, розділяти й змінювати наявні PDF, але для створення вам знадобиться окрема бібліотека на кшталт reportlab чи fpdf2.
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")
Шифрування
Усі три бібліотеки підтримують читання зашифрованих PDF і запис зашифрованого виводу.
PyMuPDF:
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
text = doc[0].get_text()
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
Підсумок можливостей
| Можливість | PyMuPDF | pypdf | PDF Oxide |
|---|---|---|---|
| Вилучення тексту | Так | Так | Так |
| Позиції символів | Так | Частково | Так |
| Вилучення зображень | Так | Так | Так |
| Поля форм (AcroForm) | Читання + запис | Читання + запис | Читання + запис |
| Форми XFA | Ні | Ні | Так |
| Створення PDF | Вручну | Ні | Markdown/HTML |
| Вивід у Markdown | Ні (pymupdf4llm) | Ні | Вбудований |
| Вивід у HTML | Ні | Ні | Вбудований |
| Рендеринг | Так | Ні | Так |
| OCR | Tesseract | Ні | Вбудований (PaddleOCR) |
| Пошук | Так | Ні | Regex + просторовий |
| Шифрування | Читання + запис | Читання + запис | Читання + запис |
| Валідація PDF/A | Ні | Ні | Так |
| Експорт у SVG | Так | Ні | Ні |
| Об’єднання/розділення | Так | Так | Так |
Коли обирати яку бібліотеку
Обирайте pypdf, якщо:
- Вам потрібне рішення на чистому Python без скомпільованих розширень на C чи Rust
- Ви виконуєте прості операції з PDF (об’єднання, розділення, поворот, шифрування/дешифрування)
- Швидкість не критична для вашого сценарію
- Ви хочете якомога менший обсяг встановлення (~1 МБ)
- Вам потрібна широка підтримка версій Python (3.6+)
Обирайте PyMuPDF, якщо:
- У вас уже є комерційна ліцензія MuPDF від Artifex
- Вам потрібен експорт у SVG зі сторінок PDF
- Ваш проєкт уже ліцензований під AGPL-3.0
- Ви залежите від специфічної для MuPDF поведінки рендерингу
Обирайте PDF Oxide, якщо:
- Вам потрібна максимальна швидкість вилучення тексту (у 5.8x швидше за PyMuPDF, у 15x швидше за pypdf)
- Ви хочете ліцензію MIT для комерційного використання чи закритого коду
- Вам потрібен вбудований вивід у Markdown або HTML для конвеєрів LLM/RAG
- Вам потрібна підтримка форм XFA
- Ви хочете вбудований OCR без зовнішніх системних залежностей
- Вам потрібна 100 % надійність на валідних PDF
Встановлення
# PyMuPDF
pip install pymupdf
# pypdf
pip install pypdf
# PDF Oxide
pip install pdf_oxide
Усі три доступні через pip. PyMuPDF постачає колесо розміром ~20 МБ із вбудованим MuPDF. pypdf — це чистий Python розміром ~1 МБ. PDF Oxide постачає готові колеса (~5 МБ) для Linux (x86_64, aarch64), macOS (x86_64, arm64) та Windows (x86_64).
Вердикт
Якщо ви обираєте між PyMuPDF і pypdf, ви обираєте між швидкістю та свободою ліцензування. PDF Oxide дає вам і те, і інше — швидша за PyMuPDF, дозвільніша за pypdf, з можливостями, яких немає в жодній із них.
| Що для вас важливо | Найкращий вибір |
|---|---|
| Максимальна швидкість | PDF Oxide (0.8ms) |
| Дозвільна ліцензія | 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 — детальне порівняння
- Порівняння з усіма Python-бібліотеками для PDF — порівняння всієї екосистеми
- Бенчмарки продуктивності — методологія та результати