Порівняння з бібліотеками 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 | 1× | 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). Компілятор чи системні бібліотеки не потрібні.
Пов’язані сторінки
- Бенчмарки продуктивності – результати бенчмарків на повному корпусі
- Початок роботи з Python – встановлення та перше вилучення
- Довідник з Python API – повний Python API
- Порівняння з бібліотеками PDF для Rust – порівняння екосистеми Rust