Skip to content

PDF Oxide vs pypdfium2

І PDF Oxide, і pypdfium2 — це швидкі, нативно скомпільовані бібліотеки для роботи з PDF на Python. pypdfium2 обгортає рушій PDFium від Google; PDF Oxide побудовано на ядрі Rust. Ключова відмінність — це охоплення: pypdfium2 здебільшого слугує для читання та рендерингу, тоді як PDF Oxide охоплює весь життєвий цикл PDF.

Ключові відмінності

Швидкість. Обидві бібліотеки швидкі. 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 мс
Частка успіху (3830 PDF) 100% 99,2%
Ліцензія MIT Apache-2.0
Мова Rust + PyO3 C (PDFium)
Вилучення тексту Так Так
Позиції символів Так Так
Вилучення зображень Так Так
Вивід у Markdown Так Ні
Вивід у HTML Так Ні
Створення PDF Так Ні
Редагування PDF Так Ні
Поля форм Читання + запис Лише читання
Шифрування Читання + запис Лише читання
Рендеринг Так Так
OCR Вбудований Ні
Пошук Регулярні вирази + просторовий Так

Порівняння коду

Вилучення тексту

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 cannot create PDFs.
# It is a read-only library with rendering capabilities.

Рендеринг

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% (3823/3823) 99,2% (3792/3823)

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

Подробиці про корпус див. у повній методології бенчмарка.

Повнота функціоналу

Найбільша відмінність між цими бібліотеками — охоплення. 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%)
  • Швидкість критична, і п’ятикратна різниця має значення за масштабування

Обирайте pypdfium2, якщо:

  • Вам потрібно лише читати та рендерити PDF
  • Ви надаєте перевагу саме рендерингу PDFium
  • Вам потрібен менший обсяг залежностей

Пов’язані сторінки