Skip to content

PDF Oxide vs pdfplumber

PDF Oxide в 29 раз быстрее pdfplumber при извлечении текста и несёт больше фич: экспорт в Markdown/HTML, OCR без Tesseract и работу с зашифрованными PDF. pdfplumber по-прежнему сильнее в сложной детекции таблиц — эта страница поможет выбрать правильный инструмент.

Ключевые отличия

Скорость. pdfplumber написан на чистом Python (поверх pdfminer). Ядро PDF Oxide на Rust извлекает текст за 0.8 мс в среднем против 23.2 мс — в 29 раз быстрее.

Надёжность. PDF Oxide проходит 100% из 3 830 тестовых PDF. pdfplumber проходит 98.8% — 46 ошибок на валидных PDF.

Таблицы. pdfplumber обладает лучшим извлечением таблиц среди всех Python-библиотек для PDF. Определение таблиц в PDF Oxide функционально, но менее зрелое для сложных многострочных, многоколоночных макетов с объединёнными ячейками.

Охват. pdfplumber работает только на чтение. PDF Oxide добавляет создание, редактирование, шифрование, рендеринг и вывод в Markdown/HTML.

Краткое сравнение

PDF Oxide pdfplumber
Среднее время извлечения 0.8 мс 23.2 мс
Успешность (3,830 PDF) 100% 98.8%
Лицензия MIT MIT
Язык Rust + PyO3 Чистый Python
Извлечение текста Да Да
Позиции символов Да Да
Извлечение таблиц Базовое Продвинутое
Извлечение изображений Да Нет
Визуальная отладка Нет Да
Вывод в Markdown Да Нет
Вывод в HTML Да Нет
Создание PDF Да Нет
Редактирование PDF Да Нет
Шифрование Чтение + запись Нет
Рендеринг Да Нет
Поля форм Чтение + запись Только чтение

Сравнение кода

Извлечение текста

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

Извлечение на уровне символов

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:

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}")

Извлечение таблиц

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("invoice.pdf")
md = doc.to_markdown(0, detect_headings=True)
# Таблицы конвертируются в синтаксис Markdown-таблиц
print(md)

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)

Метод extract_tables() в pdfplumber возвращает структурированные данные строк/столбцов с настраиваемым определением линий. Для сложных таблиц с объединёнными ячейками, перекрывающими заголовками или безрамочными макетами алгоритмы pdfplumber более надёжны.

Детали бенчмарков

Метрика PDF Oxide pdfplumber
Среднее время извлечения 0.8 мс 23.2 мс
Время извлечения p99 9 мс 189 мс
Успешность (валидные PDF) 100% (3,823/3,823) 98.8% (3,777/3,823)

Разница в 29 раз объясняется архитектурой pdfplumber на чистом Python. pdfplumber использует pdfminer для парсинга и добавляет собственный слой пространственного анализа — оба написаны на Python. PDF Oxide обрабатывает весь парсинг, декодирование шрифтов и сборку текста в скомпилированном Rust.

См. полную методологию benchmark для деталей о корпусе.

Когда использовать какую библиотеку

Выберите PDF Oxide, если:

  • Важна скорость. Обработка тысяч PDF, где 29-кратное ускорение означает минуты вместо часов.
  • Нужно больше, чем извлечение. Создание, редактирование, шифрование, рендеринг или вывод в Markdown.
  • Нужна максимальная надёжность. 100% успешности против 98.8%.
  • Нужно извлечение изображений. pdfplumber не извлекает изображения.
  • Пайплайны пакетной обработки. 0.8 мс на PDF означает 3 830 PDF за 3.1 секунды.

Выберите pdfplumber, если:

  • Сложное извлечение таблиц — ваша основная задача. Алгоритмы таблиц pdfplumber лучше справляются с объединёнными ячейками, безрамочными таблицами и перекрывающими заголовками.
  • Нужна визуальная отладка. pdfplumber может рендерить аннотированные изображения страниц с обнаруженными линиями, символами и границами таблиц.
  • Предпочитаете чистый Python. Никаких компилируемых зависимостей, устанавливается где угодно.

Использовать обе:

Для пайплайнов, требующих быстрого извлечения текста и сложного парсинга таблиц, используйте PDF Oxide для текста и pdfplumber для таблиц:

from pdf_oxide import PdfDocument
import pdfplumber

# Быстрое извлечение текста с PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)

# Сложное извлечение таблиц с pdfplumber
with pdfplumber.open("report.pdf") as pdf:
    tables = pdf.pages[0].extract_tables()

Связанные страницы