PDF Oxide vs pypdf
PDF Oxide в 15 раз быстрее pypdf, с лучшим процентом успехов и со встроенными рендерингом, экспортом в Markdown/HTML, OCR и работой с формами. То, ради чего в pypdf собирают связку из нескольких пакетов, PDF Oxide делает одной библиотекой.
Зачем рассматривать PDF Oxide вместо pypdf
Скорость. pypdf — чистый Python. У PDF Oxide под капотом ядро на Rust, подключённое через PyO3 и работающее прямо в процессе Python. Среднее время извлечения текста: 0,8 мс против 12,1 мс — разница в 15 раз.
Надёжность. PDF Oxide проходит все 3 830 тестовых PDF на 100 %. pypdf — 98,4 %, 61 падение на валидных файлах.
Набор возможностей. pypdf — это библиотека манипуляций (склейка, разрезка, поворот, шифрование). Для извлечения текста, рендеринга, вывода в 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 | Встроенный | Нет |
| Поиск | Regex + пространственный | Нет |
| Размер установки | ~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 нет конвертации в Markdown.
# Пришлось бы собирать отдельный набор инструментов.
Детали бенчмарка
| Метрика | 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") |
Недоступно |
| Bounding box по символам | doc.extract_chars(0) |
Частично |
| Валидация PDF/A | Да | Недоступно |
Если весь рабочий процесс сводится к склейке/разрезке/повороту, лёгкий Python-подход pypdf вполне разумен. Как только речь заходит о качестве извлечения, создании PDF или конвертации форматов, PDF Oxide — заметно более полный инструмент.
Когда остаться на pypdf
- Нужна зависимость на чистом Python без скомпилированных расширений
- Сценарий строго «склейка/разрезка/поворот/шифрование», без извлечения текста
- Нужны конкретные методы pypdf ради интеграции с унаследованным кодом
Связанные страницы
- Бенчмарки производительности — полные результаты по корпусу
- vs Python-библиотеки для PDF — все библиотеки Python в сравнении
- Начало работы с Python — установка и первое извлечение