Skip to content

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 ради интеграции с унаследованным кодом

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