Миграция с pypdf на PDF Oxide
Полное руководство по переходу с pypdf на PDF Oxide. Охватывает все используемые API и способы их замены.
Зачем переходить с pypdf?
Четыре веских причины для миграции:
- В 15 раз быстрее — PDF Oxide обрабатывает страницу в среднем за 0,8 мс, pypdf — за 12,1 мс. Обработка 500-страничного документа занимает 0,4 секунды вместо 6.
- 100% надёжность — PDF Oxide проходит 100% тестов PDF-набора. pypdf терпит неудачу на 1,6% файлов (98,4% успешных), то есть примерно каждый 60-й документ обрабатывается с ошибками.
- Встроенные Markdown и HTML — pypdf извлекает только простой текст. PDF Oxide конвертирует страницы в Markdown (с сохранением таблиц и структуры) и HTML — критично для LLM- и RAG-пайплайнов.
- Встроенные OCR и рендеринг — pypdf не поддерживает OCR и рендеринг страниц. PDF Oxide включает PaddleOCR для сканированных документов и рендеринг страниц в изображения без внешних зависимостей.
Шаг 1: Установка
pip install pdf_oxide
pip uninstall pypdf # необязательно
Шаг 2: Замена импортов
# Было
from pypdf import PdfReader, PdfWriter, PdfMerger
# Стало
from pdf_oxide import PdfDocument, Pdf
Шаг 3: Таблица соответствия API
| Задача | pypdf | PDF Oxide |
|---|---|---|
| Открыть PDF | PdfReader("file.pdf") |
PdfDocument("file.pdf") |
| Количество страниц | len(reader.pages) |
doc.page_count() |
| Извлечь текст | reader.pages[0].extract_text() |
doc.extract_text(0) |
| Извлечь изображения | reader.pages[0].images |
doc.extract_image_bytes(0) |
| Поля форм | reader.get_fields() |
doc.get_form_fields() |
| Метаданные | reader.metadata |
doc.metadata() |
| Зашифрованный PDF | reader.decrypt("pw") |
PdfDocument("file.pdf", password="pw") |
| Объединить PDF | PdfMerger() + .append() |
doc.merge_from("doc2.pdf") |
| Разделить страницы | PdfWriter() + .add_page() |
doc.extract_pages([0,1,2,3,4], "out.pdf") |
| В Markdown | Не поддерживается | doc.to_markdown(0) |
| Рендеринг | Не поддерживается | doc.render_page(0) |
| OCR | Не поддерживается | doc.extract_text_ocr(0) |
Шаг 4: Типовые изменения в коде
Извлечение текста
# pypdf
from pypdf import PdfReader
reader = PdfReader("report.pdf")
for page in reader.pages:
print(page.extract_text())
# PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
print(doc.extract_text(i))
Объединение PDF
pypdf требует создания объекта-слияния и последовательного добавления файлов. PDF Oxide делает это за один вызов:
# pypdf
from pypdf import PdfMerger
merger = PdfMerger()
merger.append("doc1.pdf")
merger.append("doc2.pdf")
merger.write("merged.pdf")
# PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("doc1.pdf")
doc.merge_from("doc2.pdf")
doc.save("merged.pdf")
Разделение / извлечение страниц
# pypdf — ручное постраничное копирование
from pypdf import PdfReader, PdfWriter
reader = PdfReader("report.pdf")
writer = PdfWriter()
for page in reader.pages[0:5]:
writer.add_page(page)
writer.write("first_5_pages.pdf")
# PDF Oxide — один вызов
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
doc.extract_pages([0, 1, 2, 3, 4], "first_5_pages.pdf")
Зашифрованные PDF
# pypdf — два шага: open + decrypt
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
# PDF Oxide — пароль в конструкторе
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
Конвертация в Markdown (новая возможность)
pypdf не поддерживает Markdown. PDF Oxide позволяет легко передавать PDF в LLM-пайплайны:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
md = doc.to_markdown(i)
print(md)
Извлечение изображений
# pypdf
from pypdf import PdfReader
reader = PdfReader("report.pdf")
for image in reader.pages[0].images:
with open(image.name, "wb") as f:
f.write(image.data)
# 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"])
Шаг 5: Тестирование миграции
Прогоните существующие тестовые файлы через обе библиотеки и сравните результаты:
from pdf_oxide import PdfDocument
doc = PdfDocument("your-test-file.pdf")
# Проверка извлечения текста
text = doc.extract_text(0)
print(text[:500])
# Проверка количества страниц
print(f"Pages: {doc.page_count()}")
# Проверка полей формы (при необходимости)
fields = doc.get_form_fields()
for f in fields:
print(f"{f.name}: {f.value}")
Другие руководства по миграции
Связанные страницы
- PDF Oxide vs pypdf — подробное сравнение
- Начало работы с Python — руководство по установке
- Извлечение текста из PDF — руководство по извлечению текста