Skip to content

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 для інтеграції зі застарілими системами

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