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
- Хотите меньший объём зависимостей
Связанные страницы
- Benchmark производительности — полные результаты benchmark на корпусе
- Сравнение с Python-библиотеками — все Python-библиотеки в сравнении
- Начало работы с Python — установка и первое извлечение