PDF Oxide vs pypdf
PDF Oxide в 15 раз быстрее pypdf, с более высоким процентом успешных тестов, встроенным рендерингом и конвертацией в Markdown/HTML. Если вам нужно больше, чем базовые манипуляции с PDF, PDF Oxide делает в одной библиотеке то, для чего pypdf требует нескольких пакетов.
Почему стоит рассмотреть PDF Oxide вместо pypdf
Скорость. pypdf написан на чистом Python. PDF Oxide использует ядро на Rust, скомпилированное через PyO3, и работает прямо в процессе Python. Среднее время извлечения текста: 0,8 мс против 12,1 мс — разница в 15 раз.
Надёжность. PDF Oxide успешно проходит 100% из 3 830 тестовых PDF. У pypdf — 98,4%, то есть 61 сбой на валидных PDF.
Возможности. pypdf — это библиотека для манипуляций с PDF (слияние, разделение, поворот, шифрование). Для извлечения текста, рендеринга, вывода в Markdown или создания форм вам понадобятся дополнительные пакеты. PDF Oxide покрывает всё это в рамках одной установки.
Краткое сравнение
| PDF Oxide | pypdf | |
|---|---|---|
| Среднее время извлечения | 0,8 мс | 12,1 мс |
| Процент успеха (3 830 PDF) | 100% | 98,4% |
| Лицензия | MIT | BSD-3 |
| Язык | Rust + PyO3 | Чистый Python |
| Извлечение текста | Да | Да |
| Позиции символов | Да | Частично |
| Извлечение изображений | Да | Да |
| Вывод в Markdown | Да | Нет |
| Вывод в HTML | Да | Нет |
| Создание PDF | Да (Markdown/HTML/изображения) | Ограниченно (только слияние) |
| Поля форм | Чтение + запись | Чтение + запись |
| Шифрование | Чтение + запись | Чтение + запись |
| Рендеринг | Да | Нет |
| OCR | Встроенный | Нет |
| Поиск | Регулярные выражения + пространственный | Нет |
| Размер установки | ~5 МБ | ~1 МБ |
Сравнение кода бок о бок
Извлечение текста
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
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("book.pdf")
for i in range(doc.page_count()):
text = doc.extract_text(i)
print(f"--- Page {i + 1} ---")
print(text)
pypdf:
from pypdf import PdfReader
reader = PdfReader("book.pdf")
for page in reader.pages:
text = page.extract_text()
print(text)
Извлечение изображений
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"])
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
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="secret")
text = doc.extract_text(0)
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("secret")
text = reader.pages[0].extract_text()
Конвертация в Markdown
PDF Oxide (встроенная):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
pypdf:
# pypdf has no Markdown conversion.
# You would need a separate tool chain.
Детали бенчмарка
| Метрика | PDF Oxide | pypdf |
|---|---|---|
| Среднее время извлечения | 0,8 мс | 12,1 мс |
| Время извлечения p99 | 9 мс | 97 мс |
| Процент успеха (валидные PDF) | 100% (3 823/3 823) | 98,4% (3 762/3 823) |
Из-за реализации pypdf на чистом Python каждая операция выполняется в интерпретаторе. Ядро PDF Oxide на Rust обрабатывает парсинг, декодирование шрифтов и сборку текста нативно, и только итоговый результат пересекает границу Python.
Подробности о корпусе см. в полной методологии бенчмарка.
Разрыв в возможностях
pypdf отлично справляется с манипуляциями над PDF — слиянием, разделением, поворотом и шифрованием. Но ему недостаёт:
| Возможность | PDF Oxide | pypdf |
|---|---|---|
| Конвертация в Markdown | doc.to_markdown(0) |
Недоступно |
| Конвертация в HTML | doc.to_html(0) |
Недоступно |
| Создание PDF из контента | Pdf.from_markdown(), Pdf.from_html() |
Недоступно |
| Рендеринг в изображения | Да | Недоступно |
| OCR для сканированных PDF | Встроенный PaddleOCR | Недоступно |
| Поиск по тексту | doc.search("query") |
Недоступно |
| Ограничивающие рамки на уровне символов | doc.extract_chars(0) |
Частично |
| Валидация PDF/A | Да | Недоступно |
Если ваш рабочий процесс — это исключительно слияние/разделение/поворот, лёгкий подход pypdf на чистом Python вполне разумен. Но как только речь заходит о качестве извлечения текста, создании или конвертации, PDF Oxide — более полноценный вариант.
Когда стоит остаться с pypdf
- Вам нужна зависимость на чистом Python без каких-либо скомпилированных расширений
- Ваш сценарий строго ограничен слиянием/разделением/поворотом/шифрованием без извлечения текста
- Вам нужны специфичные методы манипуляций pypdf для интеграции с устаревшими системами
Связанные страницы
- Бенчмарки производительности — полные результаты по корпусу
- vs Python PDF-библиотеки — сравнение всех Python-библиотек
- Начало работы с Python — установка и первое извлечение