PDF Oxide vs pypdf
PDF Oxide у 15 разів швидший за pypdf, має вищу частку успіху й одразу приносить рендеринг, експорт у Markdown/HTML, OCR та роботу з формами. Те, заради чого в pypdf збирають стек із кількох пакетів, PDF Oxide робить однією бібліотекою.
Чому розглянути PDF Oxide замість pypdf
Швидкість. pypdf — чистий Python. У PDF Oxide ядро на Rust, підключене через PyO3, працює прямо всередині Python-процесу. Середнє видобування тексту: 0,8 мс проти 12,1 мс — різниця у 15 разів.
Надійність. PDF Oxide проходить усі 3 830 тестових PDF на 100 %. pypdf — 98,4 %, 61 падіння на валідних файлах.
Обсяг можливостей. pypdf — бібліотека для маніпуляцій (склеювання, розділення, поворот, шифрування). Для видобування тексту, рендерингу, виводу в 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 | Вбудований | Ні |
| Пошук | Regex + просторовий | Ні |
| Розмір встановлення | ~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 немає конвертації у Markdown.
# Довелося б будувати окремий набір інструментів.
Подробиці бенчмарку
| Метрика | 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") |
Немає |
| Bounding box по символах | doc.extract_chars(0) |
Частково |
| Валідація PDF/A | Так | Немає |
Якщо робочий процес — виключно склеювання/розділення/поворот, легкий Python-підхід pypdf цілком доречний. Щойно доходить до якості видобування, створення PDF чи конвертації форматів, PDF Oxide — суттєво повніший варіант.
Коли лишатися на pypdf
- Потрібна залежність чисто на Python, без скомпільованих розширень
- Сценарій виключно «склеювання/розділення/поворот/шифрування» без видобування тексту
- Потрібні конкретні методи pypdf заради інтеграції зі застарілим кодом
Пов’язані сторінки
- Бенчмарки продуктивності — повні результати по корпусу
- vs Python-бібліотеки для PDF — усі бібліотеки Python у порівнянні
- Старт із Python — встановлення й перше видобування