pdfplumber vs PyMuPDF
pdfplumber та PyMuPDF — популярні бібліотеки PDF для Python, але обидві змушують вас йти на компроміси. pdfplumber чудово підходить для таблиць, але у 29× повільніша, ніж потрібно. PyMuPDF швидка, але заблокована ліцензією AGPL-3.0, що перешкоджає комерційному використанню. Ця сторінка порівнює обидві — та показує, чому PDF Oxide є кращим вибором для більшості випадків використання.
Коротка відповідь: PDF Oxide у 29× швидший за pdfplumber, у 5.8× швидший за PyMuPDF, з ліцензією MIT, та обробляє текст, зображення, форми, шифрування, вивід Markdown та OCR — усе в одній бібліотеці. Єдина область, де pdfplumber ще лідирує — складне вилучення таблиць із візуальною налагодженням.
Швидке порівняння
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Ліцензія | MIT | AGPL-3.0 | MIT |
| Мова | Чистий Python | C (MuPDF) | Rust + PyO3 |
| Середній час вилучення | 23.2мс | 4.6мс | 0.8мс |
| Час вилучення p99 | 189мс | 28мс | 9мс |
| Рівень успіху (3 830 PDF) | 98.8% | 99.3% | 100% |
| Вилучення тексту | Так | Так | Так |
| Позиції символів | Так | Так | Так |
| Вилучення таблиць | Розширене | Базове | Базове |
| Вилучення зображень | Ні | Так | Так |
| Візуальна налагодження | Так | Ні | Ні |
| Створення PDF | Ні | Так | Так |
| Редагування PDF | Ні | Так | Так |
| Вивід Markdown | Ні | Ні | Так |
| Вивід HTML | Ні | Ні | Так |
| Поля форм | Тільки читання | Читання + Запис | Читання + Запис |
| Шифрування | Ні | Читання + Запис | Читання + Запис |
| Рендеринг | Ні | Так | Так |
| OCR | Ні | Tesseract | Вбудований (PaddleOCR) |
| Розмір встановлення | ~1 МБ | ~20 МБ | ~5 МБ |
| Версії Python | 3.8+ | 3.8–3.12 | 3.8–3.14 |
Бенчмарки швидкості
Усі три бібліотеки протестовані на тому ж корпусі з 3 830 PDF із трьох незалежних публічних тестових наборів (veraPDF, Mozilla pdf.js, DARPA SafeDocs).
| Метрика | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Середній час вилучення | 23.2мс | 4.6мс | 0.8мс |
| Час вилучення p99 | 189мс | 28мс | 9мс |
| Відносно PDF Oxide | У 29× повільніший | У 5.8× повільніший | 1× |
| Рівень успіху (валідні PDF) | 98.8% (3 777/3 823) | 99.3% (3 796/3 823) | 100% (3 823/3 823) |
Що означають числа на практиці
| Навантаження | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| 100 PDF | 2.3 секунди | 0.46 секунди | 0.08 секунди |
| 1 000 PDF | 23 секунди | 4.6 секунди | 0.8 секунди |
| 10 000 PDF | 3.9 хвилини | 46 секунд | 8 секунд |
| 100 000 PDF | 39 хвилин | 7.7 хвилин | 80 секунд |
Вилучення таблиць
Вилучення таблиць — основна причина, чому розробники обирають pdfplumber замість PyMuPDF. Тут pdfplumber справді відзначається.
pdfplumber: Структурований парсинг таблиць
import pdfplumber
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0]
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
# Візуальна налагодження
im = page.to_image()
im.debug_tablefinder()
im.save("debug.png")
PDF Oxide: Вивід таблиць у Markdown
from pdf_oxide import PdfDocument
doc = PdfDocument("invoice.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
Підсумок вилучення таблиць
| Можливість | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Прості таблиці з рамками | Так | Так | Так |
| Таблиці без рамок | Так | Обмежено | Обмежено |
| Об’єднані комірки | Так | Обмежено | Обмежено |
| Багаторівневі заголовки | Так | Ні | Ні |
| Налаштовуване виявлення | Так | Обмежено | Ні |
| Візуальна налагодження | Так | Ні | Ні |
| Формат виводу | Списки Python | DataFrames pandas | Markdown / HTML |
| Швидкість | Повільна (чистий Python) | Швидка | Найшвидша |
Вилучення тексту
Для вилучення звичайного тексту обидві бібліотеки виконують завдання, але відрізняються у швидкості та дизайні API.
pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
text = page.extract_text()
print(text)
PyMuPDF
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
Усі три бібліотеки видобувають порівнянний текст для коректно сформованих PDF. PDF Oxide досягає 99,5 % збігу тексту з PyMuPDF на всьому корпусі тестових файлів; решта 0,5 % — це відмінності в нормалізації пробілів і обробці лігатур.
Позиціонування на рівні символів
І pdfplumber, і PyMuPDF надають дані про координати кожного символа — це важливо для просторового аналізу, визначення меж та власної реконструкції макета.
pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
for char in page.chars[:10]:
print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
f"size={char['size']:.1f}")
PyMuPDF
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
if "lines" in block:
for line in block["lines"]:
for span in line["spans"]:
print(f"'{span['text']}' size={span['size']:.1f}")
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars[:10]:
print(f"'{ch.char}' at ({ch.x:.1f}, {ch.y:.1f}) size={ch.font_size:.1f}")
Ліцензування
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Ліцензія | MIT | AGPL-3.0 | MIT |
| Комерційний продукт | Так | Потребує комерційну ліцензію | Так |
| SaaS із закритим кодом | Так | Потребує комерційну ліцензію | Так |
| Розповсюдження Docker | Так | Потребує комерційну ліцензію | Так |
| Внутрішні інструменти | Так | Так | Так |
Зашифровані PDF
pdfplumber не може відкривати зашифровані PDF взагалі. PyMuPDF та PDF Oxide підтримують повне шифрування.
Вилучення зображень
pdfplumber не вилучає вбудовані зображення з PDF. Вам потрібен PyMuPDF, PDF Oxide або pypdfium2 для цього.
Вивід Markdown та HTML
Ні pdfplumber, ні PyMuPDF не надають вбудованої конвертації Markdown або HTML. Це унікальна функція PDF Oxide.
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
html = doc.to_html(0)
Коли обирати кожну бібліотеку
Оберіть pdfplumber, якщо:
- Складне вилучення таблиць — ваш основний випадок використання.
- Вам потрібна візуальна налагодження.
- Ви хочете рішення на чистому Python.
Оберіть PyMuPDF, якщо:
- Ви вже маєте комерційну ліцензію MuPDF.
- Вам потрібен високоякісний рендеринг.
- Ваш проєкт сумісний з AGPL.
Оберіть PDF Oxide, якщо:
- Вам потрібні швидкість та широке покриття функцій. 0.8мс середнє вилучення — у 5.8× швидше за PyMuPDF, у 29× швидше за pdfplumber.
- Ви хочете ліцензію MIT без втрати швидкості.
- Вам потрібен вивід Markdown або HTML.
- Вам потрібна підтримка зашифрованих PDF з дозвільною ліцензією.
- Ви хочете одну бібліотеку для вилучення, створення та редагування.
Використовувати PDF Oxide + pdfplumber разом:
from pdf_oxide import PdfDocument
import pdfplumber
# Швидке вилучення тексту та зображень з PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
images = doc.extract_images(0)
# Складне вилучення таблиць з pdfplumber
with pdfplumber.open("report.pdf") as pdf:
tables = pdf.pages[0].extract_tables()
Встановлення
# pdfplumber
pip install pdfplumber
# PyMuPDF
pip install pymupdf
# PDF Oxide
pip install pdf_oxide
Усі три встановлюються через pip. pdfplumber і PDF Oxide — під ліцензією MIT. PyMuPDF — AGPL-3.0; перегляньте ліцензійні вимоги, перш ніж додавати її до комерційного проєкту.
Вердикт
| Що вам важливо | Найкращий вибір |
|---|---|
| Максимальна швидкість | PDF Oxide (0.8мс — у 29× швидше за pdfplumber) |
| Складне вилучення таблиць | pdfplumber (візуальна налагодження, об’єднані комірки) |
| Дозвільна ліцензія + швидкість | PDF Oxide — pdfplumber MIT, але повільна; PyMuPDF швидка, але AGPL |
| Зашифровані PDF | PDF Oxide або PyMuPDF — pdfplumber не може дешифрувати |
| Вилучення зображень | PDF Oxide або PyMuPDF — pdfplumber не підтримує зображення |
| Вивід Markdown/HTML | PDF Oxide — єдина бібліотека з вбудованою конвертацією |
| Одна бібліотека для всього | PDF Oxide — вилучення, створення, редагування, шифрування, OCR |
Розпочніть за 10 секунд:
pip install pdf_oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0) # У 29× швидше за pdfplumber
md = doc.to_markdown(0) # вбудоване, без окремого пакету
images = doc.extract_images(0) # pdfplumber не може цього
Пов’язані сторінки
- PDF Oxide vs PyMuPDF – детальне порівняння з посібником міграції
- PDF Oxide vs pdfplumber – детальне порівняння з прикладами коду
- Порівняння бібліотек PDF для Python – усі бібліотеки Python у порівнянні
- Бенчмарки продуктивності – повна методологія бенчмарку корпусу
- Вилучення таблиць з PDF – посібник з вилучення таблиць
- Початок роботи з Python – встановлення та перше вилучення