Skip to content

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× повільніший
Рівень успіху (валідні 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 не може цього

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