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