Skip to content

PDF Oxide vs pypdfium2

PDF Oxide и pypdfium2 — быстрые, нативно скомпилированные Python-библиотеки для PDF. pypdfium2 оборачивает движок PDFium от Google; PDF Oxide стоит на Rust-ядре. Главное различие — охват: pypdfium2 в первую очередь ридер и рендерер, а PDF Oxide покрывает весь жизненный цикл PDF — создание, извлечение, OCR, формы, шифрование и compliance.

Ключевые отличия

Скорость. Обе быстрые. PDF Oxide немного быстрее: 0.8 мс в среднем против 4.1 мс (разница в 5.1 раза). Обе значительно быстрее библиотек на чистом Python.

Функциональность. pypdfium2 работает только на чтение с рендерингом. PDF Oxide добавляет создание, редактирование, запись форм, шифрование, вывод в Markdown/HTML и OCR.

Надёжность. PDF Oxide проходит 100% валидных PDF. pypdfium2 проходит 99.2% — 31 ошибка.

Лицензия. Обе разрешительные. PDF Oxide — MIT; pypdfium2 — Apache-2.0. Никаких проблем с AGPL у обоих вариантов.

Краткое сравнение

PDF Oxide pypdfium2
Среднее время извлечения 0.8 мс 4.1 мс
Успешность (3,830 PDF) 100% 99.2%
Лицензия MIT Apache-2.0
Язык Rust + PyO3 C (PDFium)
Извлечение текста Да Да
Позиции символов Да Да
Извлечение изображений Да Да
Вывод в Markdown Да Нет
Вывод в HTML Да Нет
Создание PDF Да Нет
Редактирование PDF Да Нет
Поля форм Чтение + запись Только чтение
Шифрование Чтение + запись Только чтение
Рендеринг Да Да
OCR Встроенный Нет
Поиск Regex + пространственный Да

Сравнение кода

Извлечение текста

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

pypdfium2:

import pypdfium2 as pdfium

pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
textpage = page.get_textpage()
text = textpage.get_text_range()
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"])

pypdfium2:

import pypdfium2 as pdfium

pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
for i, obj in enumerate(page.get_objects()):
    if obj.type == pdfium.FPDF_PAGEOBJ_IMAGE:
        bitmap = obj.get_bitmap()
        bitmap.to_pil().save(f"image_{i}.png")

Создание PDF

PDF Oxide:

from pdf_oxide import Pdf

pdf = Pdf.from_markdown("# Report\n\nQuarterly results are in.")
pdf.save("report.pdf")

pypdfium2:

# pypdfium2 не может создавать PDF.
# Это библиотека только для чтения с возможностями рендеринга.

Рендеринг

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
image = doc.render_page(0, dpi=150)
image.save("page.png")

pypdfium2:

import pypdfium2 as pdfium

pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
bitmap = page.render(scale=150/72)
bitmap.to_pil().save("page.png")

Детали бенчмарков

Метрика PDF Oxide pypdfium2
Среднее время извлечения 0.8 мс 4.1 мс
Время извлечения p99 9 мс 42 мс
Успешность (валидные PDF) 100% (3,823/3,823) 99.2% (3,792/3,823)

Обе библиотеки используют нативный код (Rust и C соответственно), но пайплайн извлечения текста в PDF Oxide оптимизирован специально для этой задачи — однопроходное извлечение с предвыделенными буферами и кэшированными деревьями страниц.

См. полную методологию benchmark для деталей о корпусе.

Полнота возможностей

Главное различие между библиотеками — охват. pypdfium2 — это ридер с рендерингом; PDF Oxide покрывает полный жизненный цикл PDF:

Возможность PDF Oxide pypdfium2
Чтение и извлечение Да Да
Рендеринг страниц Да Да
Создание PDF Да (Markdown, HTML, изображения) Нет
Редактирование существующих PDF Да (текст, изображения, аннотации) Нет
Заполнение полей форм Да Нет
Запись шифрования Да (AES-256) Нет
Вывод в Markdown/HTML Да Нет
OCR отсканированных страниц Да (PaddleOCR через ONNX) Нет
Валидация PDF/A Да Нет

Если вам нужно только читать и рендерить PDF, pypdfium2 — хороший выбор. Если нужна любая возможность записи — создание, редактирование, заполнение форм или шифрование — PDF Oxide является решением в одной библиотеке.

Лицензия pypdfium2 (Apache-2.0)

pypdfium2 распространяется под лицензией Apache-2.0, допускающей коммерческое использование. Однако она оборачивает PDFium от Google (PDF-движок Chromium), у которого собственная BSD-подобная лицензия. Обе разрешительные.

Ключевые моменты:

  • Apache-2.0 — разрешительная, допускает коммерческое использование, требует указания авторства
  • Зависимость от PDFium — бинарник включает движок PDFium из Chromium (~15 МБ)
  • Цикл релизов Google — pypdfium2 зависит от релизов PDFium из проекта Chromium
  • Нет гарантии стабильности Python API — API следует C API PDFium

PDF Oxide распространяется под лицензией MIT — ещё более разрешительной, чем Apache-2.0, без требований об указании авторства при распространении бинарников.

Когда использовать какую библиотеку

Выберите PDF Oxide, если:

  • Вам нужно больше, чем чтение/рендеринг (создание, редактирование, формы, шифрование)
  • Вам нужна конвертация в Markdown или HTML
  • Вам нужен встроенный OCR для отсканированных документов
  • Нужна максимальная надёжность (100% против 99.2%)
  • Скорость критична, и 5-кратная разница имеет значение на масштабе

Выберите pypdfium2, если:

  • Вам нужно только читать и рендерить PDF
  • Вы предпочитаете конкретный рендеринг PDFium
  • Хотите меньший объём зависимостей

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