Skip to content

Порівняння з бібліотеками PDF для Python

PDF Oxide у порівнянні з PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer та іншими. Ця сторінка охоплює продуктивність, набір можливостей, ліцензування та відмінності в API, щоб допомогти вам обрати правильну бібліотеку PDF для Python для вилучення тексту.

Стисло

PDF Oxide PyMuPDF pypdfium2 pypdf pdfplumber pdfminer
Середній час вилучення 0.8ms 4.6ms 4.1ms 12.1ms 23.2ms 16.8ms
Частка успіху (3830 PDF) 100% 99.3% 99.2% 98.4% 98.8% 98.8%
Ліцензія MIT AGPL-3.0 Apache-2.0 BSD-3 MIT MIT
Мова Rust + PyO3 C (MuPDF) C (PDFium) Pure Python Pure Python Pure Python
Вилучення тексту Так Так Так Так Так Так
Позиції символів Так Так Так Частково Так Так
Вилучення зображень Так Так Так Так Ні Ні
Поля форм Читання + запис Читання + запис Лише читання Читання + запис Лише читання Ні
Створення PDF Так Так Ні Обмежено Ні Ні
Редагування PDF Так Так Ні Так Ні Ні
Вивід у Markdown Так Ні Ні Ні Ні Ні
Вивід у HTML Так Ні Ні Ні Ні Ні
Шифрування Читання + запис Читання + запис Лише читання Читання + запис Ні Ні
Перевірка PDF/A Так Ні Ні Ні Ні Ні
Рендеринг Так Так Так Ні Ні Ні
Пошук Regex + просторовий Так Так Ні Ні Ні
Версії Python 3.8–3.14 3.8–3.12 3.8+ 3.6+ 3.8+ 3.6+
Розмір встановлення ~5 МБ wheel ~20 МБ wheel ~3 МБ wheel ~1 МБ ~1 МБ ~1 МБ

Порівняння продуктивності

Середній час вилучення тексту на один PDF, виміряний на повному корпусі з 3830 PDF — три незалежні, загальнодоступні набори тестів, які разом охоплюють усі версії специфікації PDF (1.0–2.0), зашифровані файли, некоректні документи, кодування CJK, складні макети та граничні випадки безпеки. Про те, що тестує кожен набір і чому ці результати відтворювані, див. докладніше про корпус.

Бібліотека Середнє Відносно p99 Частка успіху
PDF Oxide 0.8ms 9ms 100%
PyMuPDF 4.6ms 5.8× 28ms 99.3%
pypdfium2 4.1ms 5.1× 42ms 99.2%
pymupdf4llm 55.5ms 69× 280ms 99.1%
pdftext 7.3ms 9.1× 82ms 99.0%
pdfminer 16.8ms 21× 124ms 98.8%
pdfplumber 23.2ms 29× 189ms 98.8%
markitdown 108.8ms 136× 378ms 98.6%
pypdf 12.1ms 15.1× 97ms 98.4%

PDF Oxide досягає такої швидкості завдяки нативному ядру на Rust, скомпільованому в модуль розширення Python через PyO3. Немає накладних витрат на підпроцеси чи мостів до C-бібліотек — код на Rust виконується безпосередньо в процесі Python.

Надійність

PDF Oxide обробляє 3823 з 3823 дійсних PDF без збоїв — частка успіху 100%. Ті 7 файлів із корпусу на 3830 документів, що не пройшли перевірку, — це навмисно пошкоджені тестові зразки (відсутній заголовок PDF, пошкоджені фазингом каталоги, недійсні xref-потоки).

Бібліотека Пройдено дійсних PDF Частка успіху
PDF Oxide 3,823 / 3,823 100%
PyMuPDF 3,796 / 3,823 99.3%
pypdfium2 3,792 / 3,823 99.2%
pymupdf4llm 3,787 / 3,823 99.1%
pdftext 3,784 / 3,823 99.0%
pdfminer 3,777 / 3,823 98.8%
pdfplumber 3,777 / 3,823 98.8%
markitdown 3,771 / 3,823 98.6%
pypdf 3,762 / 3,823 98.4%

Якість тексту

PDF Oxide досягає 99.5% збігу тексту порівняно з PyMuPDF та pypdfium2 на всьому корпусі. Якість вимірювали посимвольним порівнянням вилученого тексту. Решта 0.5% різниці припадає на нормалізацію пробілів та обробку лігатур, де PDF Oxide видає чистіший результат.

Порівняння ліцензій

Бібліотека Ліцензія Комерційне використання Copyleft
PDF Oxide MIT Без обмежень Ні
pypdfium2 Apache-2.0 Без обмежень Ні
PyMuPDF AGPL-3.0 Потрібна комерційна ліцензія ($) Так
pypdf BSD-3 Без обмежень Ні
pdfplumber MIT Без обмежень Ні
pdfminer MIT Без обмежень Ні
pdftext GPL-3.0 Потрібен відкритий код Так

PyMuPDF використовує MuPDF за ліцензією AGPL-3.0. Якщо ви розповсюджуєте програмне забезпечення, яке використовує PyMuPDF, ваше ПЗ також має бути випущене за AGPL-3.0 — або вам потрібно придбати комерційну ліцензію в Artifex. Це стосується SaaS-продуктів, вебзастосунків та будь-яких розповсюджуваних бінарних файлів.

PDF Oxide має ліцензію MIT без жодних обмежень. Використовуйте його у пропрієтарних продуктах, SaaS-платформах чи застосунках із закритим кодом без жодних ліцензійних зобов’язань.

Сценарій PDF Oxide (MIT) PyMuPDF (AGPL) pypdfium2 (Apache) pypdf (BSD) pdfplumber (MIT) pdfminer (MIT)
Комерційний продукт Так Потрібна ліцензія Так Так Так Так
Закритий код Так Ні (без ліцензії) Так Так Так Так
SaaS/хмара Так Потрібна ліцензія Так Так Так Так
Внутрішні інструменти Так Так Так Так Так Так

Порівняння API

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

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)

pypdf:

from pypdf import PdfReader

reader = PdfReader("report.pdf")
page = reader.pages[0]
text = page.extract_text()
print(text)

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

pdfminer:

from pdfminer.high_level import extract_text

text = extract_text("report.pdf", page_numbers=[0])
print(text)

Вилучення на рівні символів

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars:
    print(f"'{ch.char}' at ({ch.bbox[0]:.1f}, {ch.bbox[1]:.1f}) "
          f"size={ch.font_size:.1f}")

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
    if "lines" in block:
        for line in block["lines"]:
            for span in line["spans"]:
                print(f"'{span['text']}' size={span['size']:.1f}")

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    for char in page.chars:
        print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
              f"size={char['size']:.1f}")

pdfminer:

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar

for page_layout in extract_pages("report.pdf"):
    for element in page_layout:
        if hasattr(element, '__iter__'):
            for text_line in element:
                if hasattr(text_line, '__iter__'):
                    for char in text_line:
                        if isinstance(char, LTChar):
                            print(f"'{char.get_text()}' at ({char.x0:.1f}, {char.y0:.1f}) "
                                  f"size={char.size:.1f}")

Вилучення зображень

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"])

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
for i, img in enumerate(page.get_images()):
    xref = img[0]
    base_image = doc.extract_image(xref)
    with open(f"image_{i}.{base_image['ext']}", "wb") as f:
        f.write(base_image["image"])

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 Pdf

pdf = Pdf.from_markdown("# Hello World\n\nThis is a PDF.")
pdf.save("output.pdf")

# Also supports HTML
pdf = Pdf.from_html("<h1>Hello</h1><p>World</p>")
pdf.save("output.pdf")

PyMuPDF:

import fitz

doc = fitz.open()
page = doc.new_page()
text_point = fitz.Point(72, 72)
page.insert_text(text_point, "Hello World", fontsize=24)
doc.save("output.pdf")

pypdf:

# pypdf can merge/modify PDFs but cannot create from scratch with text content.
# Use reportlab or fpdf2 for creation, then merge with pypdf.

Зашифровані PDF

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)

PyMuPDF:

import fitz

doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()

pypdf:

from pypdf import PdfReader

reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()

Вивід у Markdown та HTML

PDF Oxide (унікальна можливість):

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")

# Convert to Markdown with heading detection
md = doc.to_markdown(0, detect_headings=True)
print(md)

# Convert to HTML
html = doc.to_html(0)
print(html)

Жодна інша бібліотека PDF для Python не пропонує вбудованого перетворення у Markdown чи HTML.

Профілі бібліотек

PDF Oxide

Сильні сторони:

  • Найшвидше вилучення тексту в бенчмарках завдяки ядру на Rust — у 5.8 раза швидше за PyMuPDF
  • Частка успіху 100% на корпусі з 3830 PDF — найвища надійність серед усіх протестованих бібліотек
  • Уніфікований API для вилучення, створення та редагування в одній бібліотеці
  • Вбудований експорт у Markdown та HTML із розпізнаванням заголовків
  • Ліцензія MIT без обмежень copyleft
  • Нативна перевірка відповідності (PDF/A, PDF/UA, PDF/X)
  • Готові wheel-пакети для всіх основних платформ і Python 3.8–3.14
  • Жодних системних залежностей — wheel містить усе

Обмеження:

  • Молодша бібліотека з меншою спільнотою
  • Вилучення таблиць базове порівняно з алгоритмами pdfplumber
  • Рушій рендерингу менш зрілий, ніж MuPDF

PyMuPDF (fitz)

Сильні сторони:

  • Зріла та перевірена часом (на основі MuPDF, у розробці з 2005 року)
  • Чудова якість рендерингу складних PDF
  • Вбудована інтеграція OCR (Tesseract)
  • Багатий набір можливостей: експорт у SVG, маніпуляції зі сторінками, виявлення таблиць

Обмеження:

  • Ліцензія AGPL-3.0 вимагає відкрити код вашого застосунку або придбати комерційну ліцензію
  • Великий розмір wheel (~20 МБ) через вбудований MuPDF
  • Немає вбудованого експорту в Markdown
  • Немає перевірки відповідності

pypdfium2

Сильні сторони:

  • Швидка (на основі рушія PDFium від Google)
  • Ліцензія Apache-2.0 — дозвільна для комерційного використання
  • Хороша якість рендерингу

Обмеження:

  • Обмежений API вилучення тексту порівняно з PDF Oxide чи PyMuPDF
  • Немає створення чи редагування PDF
  • Підтримка полів форм лише для читання

pypdf

Сильні сторони:

  • Pure Python — встановлюється будь-де, без скомпільованих залежностей
  • Легка та добре підтримувана
  • Підходить для маніпуляцій із PDF (об’єднання, поділ, поворот, шифрування)
  • Велика спільнота та докладна документація

Обмеження:

  • У 15 разів повільніша за PDF Oxide під час вилучення тексту
  • Якість вилучення тексту страждає на складних макетах
  • Немає рендерингу, експорту в Markdown/HTML, вилучення таблиць

pdfplumber

Сильні сторони:

  • Найкраще вилучення таблиць серед усіх бібліотек PDF для Python
  • Чудові дані про позиціонування на рівні символів
  • Інструменти візуального налагодження (анотовані зображення сторінок)
  • Ліцензія MIT

Обмеження:

  • Pure Python — у 29 разів повільніша за PDF Oxide
  • Лише читання — немає створення чи редагування PDF
  • Немає шифрування чи рендерингу

pdfminer

Сильні сторони:

  • Детальний аналіз символів і макета
  • Хороша підтримка тексту CJK
  • Основа для pdfplumber та інших інструментів
  • Ліцензія MIT

Обмеження:

  • У 21 раз повільніша за PDF Oxide (Pure Python, без оптимізацій)
  • Лише читання, без створення чи редагування
  • Багатослівний API для типових задач
  • Менш активно підтримувана

Коли що використовувати

Сценарій Рекомендована бібліотека
Швидке вилучення тексту PDF Oxide
Комерційний / пропрієтарний продукт PDF Oxide, pypdfium2, pypdf, pdfplumber або pdfminer
Альтернатива PyMuPDF (ліцензія MIT) PDF Oxide
Створення PDF із Markdown/HTML PDF Oxide
Перевірка відповідності (PDF/A, PDF/X) PDF Oxide
Вилучення таблиць із рахунків pdfplumber
Візуальне налагодження вилучення pdfplumber
Наявні напрацювання з MuPDF PyMuPDF (якщо сумісно з AGPL)
Мінімум залежностей pypdf (Pure Python)
Детальний аналіз макета pdfminer
OCR для сканованих документів PyMuPDF

Встановлення

# PDF Oxide
pip install pdf_oxide

# PyMuPDF
pip install pymupdf

# pypdfium2
pip install pypdfium2

# pypdf
pip install pypdf

# pdfplumber
pip install pdfplumber

# pdfminer
pip install pdfminer.six

PDF Oxide постачає готові wheel-пакети для Linux (x86_64, aarch64), macOS (x86_64, arm64) та Windows (x86_64). Компілятор чи системні бібліотеки не потрібні.

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