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
- Вам потрібен менший обсяг залежностей
Пов’язані сторінки
- Бенчмарки продуктивності — повні результати за корпусом
- vs Python-бібліотеки для PDF — порівняння всіх Python-бібліотек
- Початок роботи з Python — встановлення та перше вилучення