Skip to content

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

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