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()
Связанные страницы
- Benchmark производительности — полные результаты benchmark на корпусе
- Сравнение с Python-библиотеками — все Python-библиотеки в сравнении
- Извлечение таблиц из PDF — руководство по извлечению таблиц
- Начало работы с Python — установка и первое извлечение