Skip to content

Справочник Python API

PDF Oxide предоставляет нативные привязки для Python, собранные с помощью PyO3. Готовые wheel-пакеты доступны для Python 3.8–3.14 на Linux, macOS и Windows (x86_64 и ARM64).

pip install pdf_oxide

Описание Rust API см. в справочнике Rust API. Описание JavaScript API см. в справочнике Node.js API или справочнике WASM API. Подробности о типах см. в разделе Типы и перечисления.


PdfDocument

Основной класс для открытия, извлечения, редактирования и сохранения PDF-файлов.

from pdf_oxide import PdfDocument

Конструктор

PdfDocument(path: str, password: str | None = None)
Параметр Тип Описание
path str Путь к PDF-файлу
password str | None Необязательный пароль для зашифрованных PDF (по умолчанию None)

Передайте password=, чтобы открыть зашифрованный PDF за один шаг. В качестве альтернативы можно вызвать doc.authenticate(password) уже после открытия.

Выбрасывает FileNotFoundError, если файл не существует. Выбрасывает PdfError, если файл не является корректным PDF.

Методы класса

PdfDocument.from_bytes(data: bytes, password: str | None = None) -> PdfDocument

Открывает PDF из байтов в памяти (например, загруженных из S3 или полученных по HTTP). Принимает необязательный пароль для зашифрованных PDF.

Параметр Тип Описание
data bytes Сырые байты PDF-файла
password str | None Необязательный пароль для зашифрованных PDF (по умолчанию None)
from pdf_oxide import PdfDocument

# Open PDF from bytes (e.g., downloaded from S3)
doc = PdfDocument.from_bytes(pdf_bytes)

# Also supports password:
doc = PdfDocument.from_bytes(pdf_bytes, password="secret")

Методы

Общие

Метод Тип возврата Описание
version() tuple[int, int] Версия PDF в виде (major, minor) (например, (1, 7))
authenticate(password) bool Аутентификация зашифрованного PDF с паролем пользователя или владельца

Сведения о документе

doc.page_count() -> int

Возвращает количество страниц в документе.

doc.has_structure_tree() -> bool

Проверяет, является ли документ тегированным PDF (Tagged PDF) с деревом структуры.

Аутентификация

doc.authenticate(password: str) -> bool

Аутентификация с паролем после открытия. Возвращает True, если аутентификация прошла успешно.

Извлечение текста

doc.extract_text(
    page: int,
    region: tuple[float, float, float, float] | None = None,
    exclude_layers: list[str] | None = None,
    exclude_inks: list[str] | None = None,
    extract_tables: bool = True
) -> str

Извлекает простой текст с одной страницы. Отсчёт страниц ведётся от нуля. При необходимости можно ограничить область region, исключить именованные слои необязательного содержимого (optional content) или красители/сепарации по имени, а также включить или отключить реконструкцию таблиц.

doc.extract_chars(
    page: int,
    region: tuple[float, float, float, float] | None = None,
    exclude_layers: list[str] | None = None,
    exclude_inks: list[str] | None = None
) -> list[TextChar]

Извлекает позиционирование каждого символа и метаданные шрифта. Возвращает список объектов TextChar.

doc.extract_spans(page: int, region: tuple | None = None, reading_order: str | None = None) -> list[TextSpan]

Извлекает текстовые спаны с метаданными шрифта. Каждый спан — это последовательность текста с одинаковым стилем. Для многоколоночных PDF передайте reading_order="column_aware".

doc.extract_words(
    page: int,
    *,
    include_artifacts: bool = True,
    region: tuple | None = None,
    word_gap_threshold: float | None = None,
    profile: ExtractionProfile | None = None
) -> list[TextWord]

Извлекает текст, сгруппированный по словам, с ограничивающими прямоугольниками. Возвращает список объектов TextWord.

doc.extract_text_lines(
    page: int,
    *,
    include_artifacts: bool = True,
    region: tuple | None = None,
    word_gap_threshold: float | None = None,
    line_gap_threshold: float | None = None,
    profile: ExtractionProfile | None = None
) -> list[TextLine]

Извлекает текст, сгруппированный по строкам. Возвращает список объектов TextLine.

doc.extract_page_text(page: int, reading_order: str | None = None) -> dict

Извлекает спаны, символы и размеры страницы за один проход. Возвращает словарь с ключами spans, chars, page_width, page_height, text. Эффективнее, чем раздельный вызов extract_spans() + extract_chars().

doc.page_layout_params(page: int) -> LayoutParams

Вычисляет адаптивные параметры компоновки (пороги межсловных и межстрочных интервалов, медианные метрики, число колонок) для страницы. См. LayoutParams.

doc.within(page: int, bbox: tuple[float, float, float, float]) -> PdfPageRegion

Создаёт дескриптор обрезанной области для извлечения текста, слов, строк, таблиц, изображений и контуров внутри bbox. См. PdfPageRegion.

Авто-извлечение и классификация

doc.extract_text_auto(page: int) -> str

Автоматически выбирает оптимальную стратегию извлечения (нативный текст или OCR) для страницы и возвращает простой текст.

doc.extract_page_auto(page: int, options_json: str | None = None) -> str

Автоматически извлекает страницу и возвращает JSON-документ; передайте строку options_json в формате JSON для тонкой настройки конвейера.

doc.classify_page(page: int) -> str

Классифицирует отдельную страницу (например, "text", "scanned", "mixed").

doc.classify_document() -> str

Классифицирует весь документ по выборке его страниц.

doc.has_text_layer(page: int) -> bool

Проверяет, есть ли у страницы извлекаемый нативный текстовый слой (в отличие от случая, когда требуется OCR).

Конвертация

doc.to_plain_text(
    page: int,
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None
) -> str

Преобразует страницу в простой текст с опциями компоновки.

doc.to_plain_text_all(
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None
) -> str

Преобразует все страницы в простой текст.

doc.to_markdown(
    page: int,
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Преобразует страницу в Markdown.

doc.to_markdown_all(
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Преобразует все страницы в Markdown.

doc.to_html(
    page: int,
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Преобразует страницу в HTML.

doc.to_html_all(
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Преобразует все страницы в HTML.

Конвертация в Office

Метод Тип возврата Описание
to_docx(path) – Преобразует PDF в файл документа Word
to_docx_bytes() bytes Преобразует PDF в байты DOCX
to_pptx(path) – Преобразует PDF в файл PowerPoint
to_pptx_bytes() bytes Преобразует PDF в байты PPTX
to_xlsx(path) – Преобразует PDF в файл книги Excel
to_xlsx_bytes() bytes Преобразует PDF в байты XLSX

Извлечение изображений

doc.extract_images(page: int) -> list[ImageInfo]

Извлекает все изображения со страницы, включая картинки из потоков содержимого и вложенных Form XObject.

doc.extract_image_bytes(page: int) -> list[dict]

Извлекает сырые байты изображений со страницы. Каждый словарь содержит width, height, data (байты) и format.

Поиск

doc.search(
    pattern: str,
    case_insensitive: bool = False,
    literal: bool = False,
    whole_word: bool = False,
    max_results: int = 0
) -> list[SearchResult]

Ищет текст по всем страницам. Установите max_results=0 для неограниченного числа результатов. Возвращает список совпадений с номером страницы, текстом и координатами.

doc.search_page(
    page: int,
    pattern: str,
    case_insensitive: bool = False,
    literal: bool = False,
    whole_word: bool = False,
    max_results: int = 0
) -> list[SearchResult]

Ищет текст на одной странице.

Редактирование метаданных

Метод Параметры Описание
set_title(title) str Задаёт заголовок документа
set_author(author) str Задаёт автора документа
set_subject(subject) str Задаёт тему документа
set_keywords(keywords) str Задаёт ключевые слова документа

Поворот страниц

Метод Параметры Возвращает Описание
page_rotation(page) int int Получить текущий поворот (0, 90, 180, 270)
set_page_rotation(page, degrees) int, int – Задать абсолютный поворот
rotate_page(page, degrees) int, int – Добавить к текущему повороту
rotate_all_pages(degrees) int – Повернуть все страницы

Размеры страниц

Метод Параметры Возвращает Описание
page_media_box(page) int tuple[float, float, float, float] Получить MediaBox (llx, lly, urx, ury)
set_page_media_box(page, llx, lly, urx, ury) int, float, float, float, float – Задать MediaBox
page_crop_box(page) int `tuple None`
set_page_crop_box(page, llx, lly, urx, ury) int, float, float, float, float – Задать CropBox
crop_margins(left, right, top, bottom) float, float, float, float – Обрезать поля всех страниц

Стирание / закрашивание

Метод Параметры Описание
erase_region(page, llx, lly, urx, ury) int, float, float, float, float Стереть прямоугольную область
erase_regions(page, rects) int, list[tuple] Стереть несколько областей
clear_erase_regions(page) int Очистить отложенные операции стирания

Аннотации

doc.get_annotations(page: int) -> list[dict]

Получает метаданные аннотаций (тип, прямоугольник, содержимое и т. д.) для страницы.

Метод Параметры Возвращает Описание
flatten_page_annotations(page) int – Свести аннотации на странице
flatten_all_annotations() – – Свести все аннотации
is_page_marked_for_flatten(page) int bool Проверить, помечена ли страница для сведения
unmark_page_for_flatten(page) int – Снять с страницы пометку для сведения

Редакция

doc.add_redaction(
    page: int,
    rect: tuple[float, float, float, float],
    fill: tuple[float, float, float] | None = None
) -> None

Помечает прямоугольную область для редакции с необязательным цветом заливки RGB.

doc.redaction_count(page: int) -> int

Возвращает количество отложенных редакций на странице.

doc.apply_redactions_destructive(
    scrub_metadata: bool = True,
    remove_javascript: bool = True,
    remove_embedded_files: bool = True,
    fill: tuple[float, float, float] = (0.0, 0.0, 0.0)
) -> None

Необратимо применяет все редакции, удаляя лежащее под ними содержимое и при необходимости очищая метаданные, JavaScript и вложенные файлы.

doc.sanitize_document(
    scrub_metadata: bool = True,
    remove_javascript: bool = True,
    remove_embedded_files: bool = True
) -> None

Очищает документ без редактирования областей: удаляет метаданные, JavaScript и/или вложенные файлы.

Метод Параметры Возвращает Описание
apply_page_redactions(page) int – Применить редакции на странице
apply_all_redactions() – – Применить все отложенные редакции
is_page_marked_for_redaction(page) int bool Проверить, помечена ли страница для редакции
unmark_page_for_redaction(page) int – Снять с страницы пометку для редакции

Слои и красители

Метод Параметры Возвращает Описание
get_layers() – list[str] Список имён слоёв необязательного содержимого (OCG)
get_page_inks(page) int list[str] Список имён красителей / сепараций на странице
get_page_inks_deep(page) int list[str] Список красителей, включая вложенные в Form XObject

Очистка колонтитулов

doc.remove_headers(threshold: float = 0.8) -> int
doc.remove_footers(threshold: float = 0.8) -> int
doc.remove_artifacts(threshold: float = 0.8) -> int

Обнаруживает и удаляет повторяющиеся верхние колонтитулы, нижние колонтитулы или артефакты страниц по всему документу. threshold — это доля повторений между страницами. Возвращает количество удалённых элементов.

Метод Параметры Описание
erase_header(page) int Стереть обнаруженную область верхнего колонтитула на странице
edit_header(page) int Пометить область верхнего колонтитула для редактирования
erase_footer(page) int Стереть обнаруженную область нижнего колонтитула на странице
edit_footer(page) int Пометить область нижнего колонтитула для редактирования
erase_artifacts(page) int Стереть обнаруженные артефакты на странице
sync_editor_erasures() – Сбросить отложенные стирания колонтитулов/артефактов в редактор

Поля форм

doc.get_form_fields() -> list[FormField]

Получает все поля форм. Свойства см. в FormField.

doc.get_form_field_value(name: str) -> str | bool | list | None

Получает значение поля формы по имени. Возвращает подходящий тип Python в зависимости от типа поля.

doc.set_form_field_value(name: str, value: str | bool) -> None

Задаёт значение поля формы по имени.

doc.has_xfa() -> bool

Проверяет, содержит ли документ формы XFA.

doc.export_form_data(path: str, format: str = "fdf") -> None

Экспортирует данные формы в файл. Поддерживаемые форматы: "fdf" и "xfdf".

Метод Параметры Описание
flatten_forms() – Свести все поля форм в содержимое страниц
flatten_forms_on_page(page) int Свести формы на конкретной странице

Манипуляции с изображениями

doc.page_images(page: int) -> list[dict]

Получает имена и границы изображений для операций позиционирования. Каждый словарь содержит name, bounds [x, y, width, height] и matrix.

Метод Параметры Описание
reposition_image(page, name, x, y) int, str, float, float Переместить изображение
resize_image(page, name, width, height) int, str, float, float Изменить размер изображения
set_image_bounds(page, name, x, y, width, height) int, str, float, float, float, float Задать позицию и размер изображения
clear_image_modifications(page) int Очистить отложенные изменения изображений
has_image_modifications(page) int → bool Проверить наличие отложенных изменений изображений

Операции с документом

doc.merge_from(source: str | PdfDocument) -> int

Объединяет страницы из другого PDF. Принимает путь к файлу или экземпляр PdfDocument. Возвращает количество объединённых страниц.

doc.embed_file(name: str, data: bytes) -> None

Прикрепляет файл к PDF.

doc.get_outline() -> list[dict] | None

Получает закладки документа / оглавление. Возвращает None, если структура отсутствует.

doc.extract_paths(page: int, region: tuple | None = None) -> list[dict]

Получает векторные контуры (линии, кривые, фигуры) со страницы.

doc.extract_rects(page: int, region: tuple | None = None) -> list[dict]

Получает выровненные по осям прямоугольники (из заливаемых/обводимых контуров) на странице.

doc.extract_lines(page: int, region: tuple | None = None) -> list[dict]

Получает прямые отрезки линий на странице.

doc.extract_tables(page: int, region: tuple | None = None, table_settings: dict | None = None) -> list[dict]

Обнаруживает и извлекает таблицы. Каждая таблица — это словарь со строками и ячейками (текст + ограничивающие прямоугольники). Передайте table_settings для тонкой настройки стратегии обнаружения.

doc.extract_structured(page: int) -> str

Извлекает страницу как структурированный JSON-документ (логический порядок чтения, блоки и роли).

doc.page_labels() -> list[dict]

Получает диапазоны меток страниц. Каждый словарь содержит start_page, style, prefix и start_value.

doc.xmp_metadata() -> dict | None

Получает метаданные XMP в виде словаря с полями вроде dc_title, dc_creator, xmp_create_date и т. д. Возвращает None, если метаданных XMP нет.

OCR

doc.extract_text_ocr(page: int, engine: OcrEngine | None = None) -> str

Извлекает текст с помощью OCR. Требует функции ocr в сборке Rust. Передайте собственный OcrEngine или None для движка по умолчанию.

Извлечение и переупорядочивание страниц

doc.extract_pages(pages: list[int], output: str) -> None

Извлекает указанные индексы страниц в новый PDF-файл по пути output.

doc.extract_pages_to_bytes(pages: list[int]) -> bytes

Извлекает указанные индексы страниц в новый PDF, возвращаемый в виде байтов.

doc.extract_page_ranges_to_bytes(ranges: list[tuple[int, int]]) -> bytes

Извлекает один или несколько диапазонов страниц (start, end) в новый PDF, возвращаемый в виде байтов.

Метод Параметры Описание
select_pages(pages) list[int] Оставить только перечисленные страницы в заданном порядке
delete_page(index) int Удалить одну страницу
move_page(from_index, to_index) int, int Переместить страницу на новую позицию

Соответствие стандартам и валидация

doc.validate_pdf_a(level: str = "1b") -> dict

Проверяет соответствие уровню PDF/A (например, "1b", "2b", "3b"). Возвращает словарь-отчёт.

doc.convert_to_pdf_a(level: str = "2b") -> dict

Преобразует документ в PDF/A и возвращает словарь с отчётом о конвертации.

doc.validate_pdf_ua() -> dict

Проверяет соответствие требованиям PDF/UA (доступность).

doc.validate_pdf_x(level: str = "1a_2001") -> dict

Проверяет соответствие уровню PDF/X (полиграфическое производство).

Разрешения и предупреждения

doc.permissions() -> dict

Возвращает флаги разрешений шифрования документа (печать, копирование, изменение, аннотирование и т. д.).

doc.structured_warnings() -> list

Возвращает предупреждения, собранные при извлечении структурированного / тегированного содержимого.

doc.flatten_warnings() -> list[str]

Возвращает предупреждения, собранные при сведении форм/аннотаций.

Подписи и Document Security Store

doc.signatures() -> list[Signature]

Возвращает все цифровые подписи в документе. См. Signature.

doc.signature_count() -> int

Возвращает количество цифровых подписей.

doc.dss() -> Dss | None

Возвращает разобранный Document Security Store (материалы LTV) документа или None. См. Dss.

API страниц (v0.3.34)

PdfDocument поддерживает итерацию и индексирование, возвращая ленивые объекты Page. См. Page.

len(doc)                  # number of pages
doc[i]                    # page at index i (negative indexing supported)
doc[-1]                   # last page
for page in doc: ...      # iterate pages

Доступ к DOM

doc.page(index: int) -> PdfPage

Получает DOM-подобный дескриптор страницы для поэлементного редактирования. См. PdfPage.

doc.save_page(page: PdfPage) -> None

Сохраняет изменённую PdfPage обратно в документ.

Рендеринг

doc.render_page(
    page: int,
    dpi: int | None = None,
    format: str | None = None,
    background: tuple[float, float, float, float] | None = None,
    transparent: bool = False,
    render_annotations: bool | None = None,
    jpeg_quality: int | None = None,
    excluded_layers: list[str] | None = None
) -> bytes

Рендерит страницу в байты PNG или JPEG с управлением DPI, фоном, прозрачностью, отрисовкой аннотаций, качеством JPEG и исключёнными слоями.

doc.render_pixmap(page: int, dpi: int | None = None) -> RenderedPixmap

Рендерит страницу в сырой RGBA-объект RenderedPixmap (именованный кортеж с width, height, data).

doc.render_separations(page: int, dpi: int | None = None) -> list[SeparationPlate]

Рендерит цветоделённые формы по каждому красителю для страницы. Возвращает список именованных кортежей SeparationPlate (name, width, height, data).

doc.render_separation(page: int, ink_name: str, dpi: int | None = None) -> SeparationPlate

Рендерит одну именованную цветоделённую форму красителя.

Метод Тип возврата Описание
render_page_fit(page, fit_width, fit_height, format=0) bytes Рендерит страницу, масштабированную под пиксельную область
flatten_to_images(dpi=150) bytes Сводит все страницы в PDF на основе изображений

Сохранение

doc.save(path: str, compress: bool = True, garbage_collect: bool = True, linearize: bool = False) -> None

Сохраняет PDF в файл. Управляйте сжатием потоков, сборкой «мусора» (мёртвых объектов) и линеаризацией (быстрый веб-просмотр).

doc.to_bytes(compress: bool = True, garbage_collect: bool = True, linearize: bool = False) -> bytes

Сериализует PDF в байты с теми же опциями, что и у save().

doc.save_encrypted(
    path: str,
    user_password: str,
    owner_password: str | None = None,
    allow_print: bool = True,
    allow_copy: bool = True,
    allow_modify: bool = True,
    allow_annotate: bool = True
) -> None

Сохраняет с защитой паролем AES-256 и управлением разрешениями. Если owner_password равен None, используется пароль пользователя.

doc.to_bytes_encrypted(
    user_password: str,
    owner_password: str | None = None,
    allow_print: bool = True,
    allow_copy: bool = True,
    allow_modify: bool = True,
    allow_annotate: bool = True
) -> bytes

Сериализует зашифрованный AES-256 PDF в байты.


Page

Ленивый дескриптор страницы, возвращаемый doc[i] или итерацией по PdfDocument. Все свойства вычисляются при обращении и делегируются родительскому документу.

from pdf_oxide import PdfDocument

with PdfDocument("paper.pdf") as doc:
    page = doc[0]
    text = page.text
    md = page.markdown(detect_headings=True)

Свойства (ленивые)

Свойство Тип Описание
index int Индекс страницы с отсчётом от нуля
width, height float Размеры страницы в пунктах PDF
bbox tuple[float, 4] (llx, lly, urx, ury)
text str Извлечённый простой текст
chars, words, lines, spans list[...] Структурированный текст
tables list[dict] Таблицы со строками + ячейками (текст + bbox)
images, paths, annotations list[...] Содержимое страницы

Методы

page.markdown(preserve_layout=False, detect_headings=True,
              include_images=False, image_output_dir=None,
              embed_images=True, include_form_fields=True) -> str
page.plain_text(...) -> str
page.html(...) -> str
page.render(dpi=None, format=None, background=None, transparent=False,
            render_annotations=None, jpeg_quality=None, excluded_layers=None) -> bytes
page.render_pixmap(dpi=None) -> RenderedPixmap
page.search(pattern, case_insensitive=False, literal=False,
            whole_word=False, max_results=100) -> list
page.region(x, y, width, height) -> PdfPageRegion

Ленивый объект страницы также доступен как doc.pages() (итератор, эквивалентный прямой итерации по документу).


PdfPage

DOM-подобный дескриптор страницы для поэлементного доступа и редактирования. Получается через PdfDocument.page().

from pdf_oxide import PdfDocument

doc = PdfDocument("file.pdf")
page = doc.page(0)

Свойства

Свойство Тип Описание
index int Индекс страницы с отсчётом от нуля
width float Ширина страницы в пунктах PDF
height float Высота страницы в пунктах PDF

Методы

page.children() -> list[PdfElement]

Получает все элементы на странице.

page.find_text_containing(needle: str) -> list[PdfText]

Находит все текстовые элементы, содержащие заданную подстроку.

page.find_images() -> list[PdfImage]

Находит все элементы-изображения на странице.

page.get_element(element_id: str) -> PdfElement | None

Получает конкретный элемент по его ID.

page.set_text(text_id: PdfTextId, new_text: str) -> None

Заменяет текстовое содержимое элемента, идентифицируемого его PdfTextId.

page.annotations() -> list[PdfAnnotation]

Получает все аннотации на странице.

page.add_link(x: float, y: float, width: float, height: float, url: str) -> str

Добавляет аннотацию-ссылку URL. Возвращает ID аннотации.

page.add_highlight(x: float, y: float, width: float, height: float, color: tuple[float, float, float]) -> str

Добавляет аннотацию-выделение с цветом RGB. Возвращает ID аннотации.

page.add_note(x: float, y: float, text: str) -> str

Добавляет аннотацию-стикер. Возвращает ID аннотации.

page.remove_annotation(index: int) -> bool

Удаляет аннотацию по индексу. Возвращает True, если удаление выполнено.

page.add_text(text: str, x: float, y: float, font_size: float = 12.0) -> PdfTextId

Добавляет новый текст на страницу. Возвращает PdfTextId для последующего обращения.

page.remove_element(element_id: PdfTextId) -> bool

Удаляет элемент по его ID. Возвращает True, если удаление выполнено.

Пример

from pdf_oxide import PdfDocument

doc = PdfDocument("invoice.pdf")
page = doc.page(0)

# Find and replace text
for text in page.find_text_containing("DRAFT"):
    page.set_text(text.id, "FINAL")

# Add a link
page.add_link(100, 700, 200, 20, "https://example.com")

doc.save_page(page)
doc.save("invoice_updated.pdf")

Pdf

Единый класс для создания PDF из различных исходных форматов.

from pdf_oxide import Pdf

Фабричные методы

Pdf.from_markdown(content: str, title: str | None = None, author: str | None = None) -> Pdf

Создаёт PDF из содержимого Markdown.

Pdf.from_html(content: str, title: str | None = None, author: str | None = None) -> Pdf

Создаёт PDF из содержимого HTML.

Pdf.from_text(content: str, title: str | None = None, author: str | None = None) -> Pdf

Создаёт PDF из простого текста.

Pdf.from_markdown_with_template(content: str, template: str, title: str | None = None, author: str | None = None) -> Pdf

Создаёт PDF из Markdown, отрисованного через именованный CSS/шаблон компоновки.

Pdf.from_image(path: str) -> Pdf

Создаёт одностраничный PDF из файла изображения (JPEG, PNG).

Pdf.from_bytes(data: bytes) -> Pdf

Открывает существующий PDF из байтов в памяти для изменения. Удобно при загрузке PDF из S3, HTTP или баз данных.

from pdf_oxide import Pdf

pdf = Pdf.from_bytes(existing_pdf_bytes)
pdf.save("modified.pdf")
Pdf.from_images(paths: list[str]) -> Pdf

Создаёт многостраничный PDF из нескольких файлов изображений — по одной странице на изображение.

Pdf.from_image_bytes(data: bytes) -> Pdf

Создаёт одностраничный PDF из байтов изображения.

Pdf.merge(paths: list[str]) -> Pdf

Объединяет несколько PDF-файлов (по пути) в один Pdf.

Методы

pdf.save(path: str) -> None

Сохраняет PDF в файл.

pdf.to_bytes() -> bytes

Возвращает содержимое PDF в виде байтов.

len(pdf) -> int

Возвращает размер PDF в байтах (через __len__).


PdfText

Представляет текстовый элемент на странице. Возвращается методом PdfPage.find_text_containing().

Свойство Тип Описание
id PdfTextId Уникальный идентификатор элемента
value str Текстовое содержимое
text str Текстовое содержимое (псевдоним value)
bbox tuple[float, float, float, float] Ограничивающий прямоугольник (x0, y0, x1, y1)
font_name str Имя шрифта в PostScript
font_size float Размер шрифта в пунктах
is_bold bool Является ли текст полужирным
is_italic bool Является ли текст курсивным

Методы

Метод Параметры Возвращает Описание
contains(needle) str bool Проверить, содержит ли текст подстроку
starts_with(prefix) str bool Проверить, начинается ли текст с префикса
ends_with(suffix) str bool Проверить, заканчивается ли текст суффиксом

PdfImage

Представляет элемент-изображение на странице. Возвращается методом PdfPage.find_images().

Свойство Тип Описание
bbox tuple[float, float, float, float] Ограничивающий прямоугольник (x0, y0, x1, y1)
width int Ширина изображения в пикселях
height int Высота изображения в пикселях
aspect_ratio float Соотношение ширины к высоте

PdfAnnotation

Представляет аннотацию на странице. Возвращается методом PdfPage.annotations().

Свойство Тип Описание
subtype str Тип аннотации (например, "Link", "Highlight", "Text")
rect tuple[float, float, float, float] Позиция (x0, y0, x1, y1)
contents `str None`
color `tuple[float, float, float] None`
is_modified bool Была ли аннотация изменена
is_new bool Является ли аннотация только что добавленной

PdfElement

Универсальная обёртка элемента. Возвращается методом PdfPage.children().

Метод Возвращает Описание
is_text() bool Проверить, является ли элемент текстом
is_image() bool Проверить, является ли элемент изображением
is_path() bool Проверить, является ли элемент векторным контуром
is_table() bool Проверить, является ли элемент таблицей
is_structure() bool Проверить, является ли элемент элементом структуры
as_text() `PdfText None`
as_image() `PdfImage None`
Свойство Тип Описание
bbox tuple[float, float, float, float] Ограничивающий прямоугольник

TextChar

Представляет один символ с позиционированием и метаданными шрифта. Возвращается методом PdfDocument.extract_chars().

from pdf_oxide import TextChar  # or access via PdfDocument
Атрибут Тип Описание
char str Символ Юникода
bbox tuple[float, float, float, float] Ограничивающий прямоугольник (x0, y0, x1, y1)
font_name str Имя шрифта в PostScript
font_size float Размер шрифта в пунктах
font_weight str Насыщенность ("thin", "light", "normal", "medium", "semi-bold", "bold", "extra-bold", "black")
is_italic bool Является ли символ курсивным
color tuple[float, float, float] Цвет RGB (r, g, b), значения 0.0–1.0
rotation_degrees float Поворот символа в градусах
origin_x float Координата X начала текста
origin_y float Координата Y начала текста
advance_width float Ширина продвижения глифа
mcid `int None`

Пример

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
chars = doc.extract_chars(0)

for ch in chars[:5]:
    print(f"'{ch.char}' at bbox={ch.bbox} "
          f"font={ch.font_name} size={ch.font_size:.1f} "
          f"weight={ch.font_weight} italic={ch.is_italic}")

TextSpan

Представляет последовательность текста с одинаковым шрифтом и стилем. Возвращается методом PdfDocument.extract_spans().

Атрибут Тип Описание
text str Текстовое содержимое
bbox tuple[float, float, float, float] Ограничивающий прямоугольник (x0, y0, x1, y1)
font_name str Имя шрифта в PostScript
font_size float Размер шрифта в пунктах
is_bold bool Является ли спан полужирным
is_italic bool Является ли спан курсивным
is_monospace bool Является ли шрифт моноширинным (Courier, Consolas и т. д.)
char_widths list[float] Ширины продвижения по каждому глифу для точных ограничивающих прямоугольников
color tuple[float, float, float] Цвет RGB (r, g, b), значения 0.0–1.0

Пример

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
spans = doc.extract_spans(0)

for span in spans:
    print(f"'{span.text}' font={span.font_name} size={span.font_size:.1f} "
          f"bold={span.is_bold} italic={span.is_italic} color={span.color}")

Извлечение изображений

extract_images() возвращает объекты ImageInfo с метаданными изображений. Для сырых данных изображений, пригодных для сохранения на диск, используйте extract_image_bytes().

Формат возврата extract_image_bytes()

Каждый словарь, возвращаемый extract_image_bytes(), имеет следующие ключи:

Ключ Тип Описание
width int Ширина изображения в пикселях
height int Высота изображения в пикселях
data bytes Сырые данные изображения
format str Формат изображения (например, "png", "jpeg")

Пример

from pdf_oxide import PdfDocument

doc = PdfDocument("brochure.pdf")
images = doc.extract_image_bytes(0)

for i, img in enumerate(images):
    print(f"Image {i}: {img['width']}x{img['height']}")
    with open(f"image_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

SearchResult

Представляет совпадение текстового поиска. Возвращается методами search() и search_page().

Атрибут Тип Описание
page int Индекс страницы с отсчётом от нуля
text str Найденный текст
x float Координата X в пунктах PDF
y float Координата Y в пунктах PDF

FormField

Представляет поле формы. Возвращается методом PdfDocument.get_form_fields().

Свойство Тип Описание
name str Полностью квалифицированное имя поля
field_type str Тип поля: "text", "button", "choice", "signature" или "unknown"
value `str bool
tooltip `str None`
bounds `tuple[float, float, float, float] None`
flags `int None`
max_length `int None`
is_readonly bool Является ли поле доступным только для чтения
is_required bool Является ли поле обязательным

TextWord

Последовательность текста, сгруппированная по словам. Возвращается методами PdfDocument.extract_words() и PdfPageRegion.extract_words().

Свойство Тип Описание
text str Текст слова
bbox tuple[float, float, float, float] Ограничивающий прямоугольник (x0, y0, x1, y1)
font_name str Имя шрифта в PostScript
font_size float Размер шрифта в пунктах
is_bold bool Является ли слово полужирным
is_italic bool Является ли слово курсивным
chars list[TextChar] Составляющие символы

TextLine

Последовательность текста, сгруппированная по строкам. Возвращается методами PdfDocument.extract_text_lines() и PdfPageRegion.extract_text_lines().

Свойство Тип Описание
text str Текст строки
bbox tuple[float, float, float, float] Ограничивающий прямоугольник (x0, y0, x1, y1)
words list[TextWord] Слова в строке
chars list[TextChar] Символы в строке

PdfPageRegion

Обрезанная область страницы. Возвращается методами PdfDocument.within() и PdfPage.region().

Свойство Тип Описание
bbox tuple[float, float, float, float] Границы области

Методы

region.extract_text() -> str
region.extract_words() -> list[TextWord]
region.extract_text_lines() -> list[TextLine]
region.extract_tables(table_settings: dict | None = None) -> list[dict]
region.extract_images() -> list
region.extract_paths() -> list

Методы извлечения, ограниченные ограничивающим прямоугольником области.


LayoutParams

Вычисленные адаптивные параметры компоновки страницы. Возвращается методом PdfDocument.page_layout_params().

Свойство Тип Описание
word_gap_threshold float Порог межсловного интервала в пунктах
line_gap_threshold float Порог межстрочного интервала в пунктах
median_char_width float Медианная ширина символа
median_font_size float Медианный размер шрифта
median_line_spacing float Медианный межстрочный интервал
column_count int Обнаруженное количество текстовых колонок

ExtractionProfile

Настраиваемый профиль извлечения текста, передаваемый в extract_words() / extract_text_lines().

from pdf_oxide import ExtractionProfile

Статические конструкторы

ExtractionProfile.conservative()
ExtractionProfile.aggressive()
ExtractionProfile.balanced()
ExtractionProfile.academic()
ExtractionProfile.policy()
ExtractionProfile.form()
ExtractionProfile.government()
ExtractionProfile.scanned_ocr()
ExtractionProfile.adaptive()
ExtractionProfile.available() -> list[str]   # names of all built-in profiles

Свойства

Свойство Тип Описание
name str Имя профиля
tj_offset_threshold float Порог разрыва слов по смещению в массиве TJ
word_margin_ratio float Коэффициент межсловного отступа
space_threshold_em_ratio float Порог ширины пробела (коэффициент em)
space_char_multiplier float Множитель символа пробела
use_adaptive_threshold bool Включены ли адаптивные пороги

OfficeConverter

Преобразует документы Office (DOCX, XLSX, PPTX) в PDF. Требует функции office в сборке Rust.

from pdf_oxide import OfficeConverter

OfficeConverter()   # instances are stateless; the conversion methods are also usable as static methods

Методы

OfficeConverter.from_docx(path: str) -> Pdf

Преобразует документ Word в объект Pdf.

OfficeConverter.from_docx_bytes(data: bytes) -> Pdf

Преобразует байты документа Word в объект Pdf.

OfficeConverter.from_xlsx(path: str) -> Pdf

Преобразует таблицу Excel в объект Pdf.

OfficeConverter.from_xlsx_bytes(data: bytes) -> Pdf

Преобразует байты таблицы Excel в объект Pdf.

OfficeConverter.from_pptx(path: str) -> Pdf

Преобразует презентацию PowerPoint в объект Pdf.

OfficeConverter.from_pptx_bytes(data: bytes) -> Pdf

Преобразует байты презентации PowerPoint в объект Pdf.

OfficeConverter.convert(path: str) -> Pdf

Автоматически определяет формат и преобразует любой поддерживаемый документ Office в объект Pdf.

Пример

from pdf_oxide import OfficeConverter

pdf = OfficeConverter.from_docx("report.docx")
pdf.save("report.pdf")

# Or use convert() for auto-detection
pdf = OfficeConverter.convert("spreadsheet.xlsx")
pdf.save("spreadsheet.pdf")

Классы графики

Эти классы доступны для продвинутого создания PDF с графикой:

Color

from pdf_oxide import Color

Color(r: float, g: float, b: float)  # RGB, values 0.0-1.0
Color.from_hex("#ff0000")
Color.black()
Color.white()
Color.red()
Color.green()
Color.blue()

BlendMode

from pdf_oxide import BlendMode

BlendMode.NORMAL()
BlendMode.MULTIPLY()
BlendMode.SCREEN()
BlendMode.OVERLAY()
BlendMode.DARKEN()
BlendMode.LIGHTEN()
BlendMode.COLOR_DODGE()
BlendMode.COLOR_BURN()
BlendMode.HARD_LIGHT()
BlendMode.SOFT_LIGHT()
BlendMode.DIFFERENCE()
BlendMode.EXCLUSION()

ExtGState

from pdf_oxide import ExtGState

gs = ExtGState()
gs = gs.fill_alpha(0.5)
gs = gs.stroke_alpha(0.8)
gs = gs.alpha(0.5)  # Set both fill and stroke
gs = gs.blend_mode(BlendMode.MULTIPLY())

gs = ExtGState.semi_transparent()  # Preset

LineCap / LineJoin

from pdf_oxide import LineCap, LineJoin

LineCap.BUTT()       # Default
LineCap.ROUND()
LineCap.SQUARE()

LineJoin.MITER()     # Default
LineJoin.ROUND()
LineJoin.BEVEL()

Градиенты

from pdf_oxide import LinearGradient, RadialGradient, Color

# Linear gradient (fluent API)
grad = (LinearGradient()
    .start(0, 0)
    .end(100, 0)
    .add_stop(0.0, Color.red())
    .add_stop(1.0, Color.blue()))

# Convenience constructors
hgrad = LinearGradient.horizontal(200, Color.red(), Color.blue())
vgrad = LinearGradient.vertical(100, Color(1, 1, 0), Color(0, 0, 1))

# Radial gradient
rgrad = RadialGradient.centered(50, 50, 50)
rgrad = rgrad.add_stop(0.0, Color(1, 1, 0))
rgrad = rgrad.add_stop(1.0, Color(1, 0, 0))

PatternPresets

from pdf_oxide import PatternPresets, Color

PatternPresets.horizontal_stripes(width, height, stripe_height, color)
PatternPresets.vertical_stripes(width, height, stripe_width, color)
PatternPresets.checkerboard(size, color1, color2)
PatternPresets.dots(spacing, radius, color)
PatternPresets.diagonal_lines(size, line_width, color)
PatternPresets.crosshatch(size, line_width, color)

Классы OCR

Требуют функции ocr в сборке Rust.

OcrEngine

from pdf_oxide import OcrEngine, OcrConfig

engine = OcrEngine(
    det_model_path: str,
    rec_model_path: str,
    dict_path: str,
    config: OcrConfig | None = None
)

OcrConfig

from pdf_oxide import OcrConfig

config = OcrConfig(
    det_threshold: float | None = None,
    box_threshold: float | None = None,
    rec_threshold: float | None = None,
    num_threads: int | None = None,
    max_candidates: int | None = None,
    use_v5: bool = False
)

DocumentBuilder

Текучий (fluent) построитель для постраничной компоновки PDF. См. пример ниже и Создание с нуля.

from pdf_oxide import DocumentBuilder

Методы уровня документа

Метод Параметры Описание
DocumentBuilder() – Создать новый построитель
title(title) str Задать заголовок документа
author(author) str Задать автора документа
subject(subject) str Задать тему документа
keywords(keywords) str Задать ключевые слова документа
creator(creator) str Задать имя приложения-создателя
on_open(script) str Задать JavaScript-действие при открытии на уровне документа
tagged_pdf_ua1() – Создать доступный тегированный документ PDF/UA-1
language(lang) str Задать язык документа (например, "en-US")
role_map(custom, standard) str, str Сопоставить пользовательский структурный тег со стандартным
register_embedded_font(name, font) str, EmbeddedFont Зарегистрировать шрифт (потребляет EmbeddedFont)

Фабрики страниц

builder.a4_page() -> FluentPageBuilder       # 595 x 842 pt
builder.letter_page() -> FluentPageBuilder   # 612 x 792 pt
builder.page(width: float, height: float) -> FluentPageBuilder

Вывод

builder.build() -> bytes
builder.save(path: str) -> None
builder.save_encrypted(path: str, user_password: str, owner_password: str) -> None
builder.to_bytes_encrypted(user_password: str, owner_password: str) -> bytes

FluentPageBuilder

Буферизует операции уровня страницы до вызова done(). Возвращается методами DocumentBuilder.a4_page() / letter_page() / page(). Каждый метод возвращает self для цепочечного вызова; done() фиксирует страницу и возвращает родительский DocumentBuilder.

Текст и компоновка

Метод Параметры Описание
font(name, size) str, float Задать текущий шрифт и размер
at(x, y) float, float Переместить курсор в абсолютную позицию
text(text) str Нарисовать текст в позиции курсора
heading(level, text) int, str Нарисовать заголовок (уровень 1–6)
paragraph(text) str Нарисовать абзац с переносом строк
space(points) float Сместиться по вертикали
horizontal_rule() – Нарисовать горизонтальный разделитель
columns(column_count, gap_pt, text) int, float, str Сбалансированный многоколоночный поток текста
footnote(ref_mark, note_text) str, str Встроенный знак сноски + примечание внизу страницы
new_page_same_size() – Начать новую страницу с теми же размерами
measure(text) -> float str Измерить ширину отрисованного текста в пунктах
remaining_space() -> float – Оставшееся вертикальное пространство на странице

Встроенные фрагменты

page.inline(text: str)
page.inline_bold(text: str)
page.inline_italic(text: str)
page.inline_color(text: str, r: float, g: float, b: float)
page.newline()

Ссылки и действия

page.link_url(url: str)
page.link_page(page: int)
page.link_named(name: str)
page.link_javascript(script: str)
page.on_open(script: str)
page.on_close(script: str)
page.field_keystroke(script: str)
page.field_format(script: str)
page.field_validate(script: str)
page.field_calculate(script: str)

Аннотации разметки

page.highlight(color: tuple[float, float, float])
page.underline(color: tuple[float, float, float])
page.strikeout(color: tuple[float, float, float])
page.squiggly(color: tuple[float, float, float])
page.sticky_note(text: str)
page.sticky_note_at(x: float, y: float, text: str)
page.watermark(text: str)
page.watermark_confidential()
page.watermark_draft()
page.stamp(name: str)
page.freetext(x: float, y: float, w: float, h: float, text: str)

Виджеты AcroForm

page.text_field(name: str, x: float, y: float, w: float, h: float, default_value: str | None = None)
page.checkbox(name: str, x: float, y: float, w: float, h: float, checked: bool = False)
page.combo_box(name: str, x: float, y: float, w: float, h: float, options: list[str], selected: str | None = None)
page.radio_group(name: str, buttons: list[tuple[str, float, float, float, float]], selected: str | None = None)
page.push_button(name: str, x: float, y: float, w: float, h: float, caption: str)
page.signature_field(name: str, x: float, y: float, w: float, h: float)

Графика

page.rect(x: float, y: float, w: float, h: float)
page.filled_rect(x: float, y: float, w: float, h: float, r: float, g: float, b: float)
page.line(x1: float, y1: float, x2: float, y2: float)
page.text_in_rect(x: float, y: float, w: float, h: float, text: str, align: int | None = None)
page.stroke_rect(x, y, w, h, width=1.0, color=(0.0, 0.0, 0.0))
page.stroke_rect_dashed(x, y, w, h, dash, width=1.0, color=(0.0, 0.0, 0.0), phase=0.0)
page.stroke_line(x1, y1, x2, y2, width=1.0, color=(0.0, 0.0, 0.0))
page.stroke_line_dashed(x1, y1, x2, y2, dash, width=1.0, color=(0.0, 0.0, 0.0), phase=0.0)

Изображения и штрихкоды

page.image_with_alt(bytes: bytes, x: float, y: float, w: float, h: float, alt_text: str)
page.image_artifact(bytes: bytes, x: float, y: float, w: float, h: float)
page.barcode_1d(barcode_type: int, data: str, x: float, y: float, w: float, h: float)
page.barcode_qr(data: str, x: float, y: float, size: float)

barcode_type: 0=Code128, 1=Code39, 2=EAN13, 3=EAN8, 4=UPCA, 5=ITF, 6=Code93, 7=Codabar.

Таблицы

page.table(table: Table)
page.streaming_table(
    columns: list[Column],
    repeat_header: bool = False,
    mode: str = "fixed",
    sample_rows: int = 50,
    min_col_width_pt: float = 20.0,
    max_col_width_pt: float = 400.0,
    max_rowspan: int = 1,
    batch_size: int = 256
) -> StreamingTable

Фиксация

page.done() -> DocumentBuilder

EmbeddedFont

Шрифт TTF/OTF, зарегистрированный в DocumentBuilder.

from pdf_oxide import EmbeddedFont

EmbeddedFont.from_file(path: str) -> EmbeddedFont
EmbeddedFont.from_bytes(data: bytes, name: str | None = None) -> EmbeddedFont
Свойство Тип Описание
name str Зарегистрированное имя шрифта

Таблицы

Объекты-значения для текучего табличного API.

Align

from pdf_oxide import Align

Align.LEFT     # 0
Align.CENTER   # 1
Align.RIGHT    # 2

Column

from pdf_oxide import Column

Column(header: str, width: float = 100.0, align: Align | int | None = None)
Свойство Тип Описание
header str Текст заголовка колонки
width float Ширина колонки в пунктах
align int Выравнивание ячеек

Table

from pdf_oxide import Table

Table(columns: list[Column], rows: list[list[str]], has_header: bool = False)

Буферизованная таблица, потребляемая методом FluentPageBuilder.table(). При has_header=True заголовки колонок отрисовываются как стилизованная строка-заголовок.

StreamingTable

Дескриптор таблицы с потоковой подачей строк, возвращаемый методом FluentPageBuilder.streaming_table(), для таблиц, слишком больших для одномоментной материализации.

Метод Параметры Описание
push_row(cells) list[str] Добавить строку из строковых ячеек
push_row_span(cells) list[tuple[str, int]] Добавить строку из ячеек (text, colspan)
flush() – Сбросить текущий пакет
finish() – Завершить таблицу, возвращая FluentPageBuilder
column_count() – → int Количество колонок
pending_row_count() – → int Строки в буфере, ещё не зафиксированные
batch_count() – → int Количество завершённых пакетов

Шаблоны страниц

Повторяющиеся артефакты колонтитулов, применяемые ко всем страницам.

Artifact / ArtifactStyle

from pdf_oxide import Artifact, ArtifactStyle

Artifact()                       # empty artifact
Artifact.center(text: str)       # centered artifact text
artifact.with_left(text: str)    # add left-aligned text

style = ArtifactStyle()
style = style.font(name: str, size: float)
style = style.bold()
from pdf_oxide import Header, Footer

Header()                  # or Header.center(text: str)
Footer()                  # or Footer.center(text: str)

PageTemplate

from pdf_oxide import PageTemplate, Header, Footer

template = (PageTemplate()
    .header(Header.center("Confidential"))
    .footer(Footer.center("Page")))

Цифровые подписи

Подписывайте, проставляйте метки времени и проверяйте PDF (PAdES / LTV). Требует функции signatures (и опционально tsa-client) в сборке Rust.

Certificate

from pdf_oxide import Certificate

Certificate.load(data: bytes) -> Certificate                       # DER certificate (verify only)
Certificate.load_pem(cert_pem: str, key_pem: str) -> Certificate   # signing credential
Certificate.load_pkcs12(data: bytes, password: str) -> Certificate # PKCS#12 / .p12 signing credential
Метод Возвращает Описание
subject() str DN субъекта сертификата
issuer() str DN издателя сертификата
serial() str Серийный номер
validity() tuple[int, int] Метки времени Unix (not_before, not_after)
is_valid() bool Находится ли сертификат сейчас в пределах срока действия

Signature

Возвращается методом PdfDocument.signatures().

Свойство / метод Тип Описание
signer_name `str None`
reason `str None`
location `str None`
contact_info `str None`
signing_time `int None`
covers_whole_document bool Покрывает ли подпись весь файл
pades_level PadesLevel Обнаруженный базовый уровень PAdES (B-B/B-T/B-LT)
verify() bool Криптографически проверить подпись
verify_detached(pdf_data) bool Проверка, включая messageDigest, против байтов файла

Timestamp

from pdf_oxide import Timestamp

Timestamp.parse(data: bytes) -> Timestamp
Свойство / метод Тип Описание
time int Время метки (Unix)
serial str Серийный номер ответа TSA
policy_oid str OID политики TSA
tsa_name str Имя TSA
hash_algorithm int Код алгоритма хеширования отпечатка сообщения
message_imprint bytes Хешированный отпечаток сообщения
verify() bool Проверить токен метки времени

TsaClient

from pdf_oxide import TsaClient

client = TsaClient(
    url: str,
    username: str | None = None,
    password: str | None = None,
    timeout_seconds: int = 30,
    hash_algorithm: int = 2,
    use_nonce: bool = True,
    cert_req: bool = True
)
client.request_timestamp(data: bytes) -> Timestamp
client.request_timestamp_hash(digest: bytes, algorithm: int = 2) -> Timestamp

PadesLevel

from pdf_oxide import PadesLevel

PadesLevel.B_B     # baseline
PadesLevel.B_T     # + trusted timestamp
PadesLevel.B_LT    # + long-term validation material
PadesLevel.B_LTA   # + archival timestamp

RevocationMaterial

from pdf_oxide import RevocationMaterial

RevocationMaterial(
    certs: list[bytes] | None = None,
    crls: list[bytes] | None = None,
    ocsps: list[bytes] | None = None
)

Сертификаты, CRL и ответы OCSP в кодировке DER для подписания на уровне B-LT.

Dss

Разобранный Document Security Store, возвращаемый методом PdfDocument.dss().

Свойство Тип Описание
certs list[bytes] DER-блобы сертификатов уровня документа
crls list[bytes] DER-блобы CRL
ocsps list[bytes] DER-блобы ответов OCSP
vri list[str] Ключи VRI по каждой подписи (hex SHA-1 от /Contents)

Функции уровня модуля

from pdf_oxide import (
    sign_pdf_bytes, sign_pdf_bytes_pades, has_document_timestamp,
    generate_barcode_svg, generate_qr_svg,
    plan_split_by_bookmarks, split_by_bookmarks,
)

Подписание

sign_pdf_bytes(pdf_data: bytes, cert: Certificate, reason: str | None = None, location: str | None = None) -> bytes

Подписывает сырые байты PDF загруженным сертификатом Certificate для подписания и возвращает подписанный PDF.

sign_pdf_bytes_pades(
    pdf_data: bytes,
    cert: Certificate,
    level: PadesLevel,
    tsa_url: str | None = None,
    reason: str | None = None,
    location: str | None = None,
    revocation: RevocationMaterial | None = None
) -> bytes

Подписывает сырые байты PDF на базовом уровне PAdES. B_T/B_LT требуют tsa_url.

has_document_timestamp(pdf_data: bytes) -> bool

Несёт ли PDF архивную метку времени RFC 3161 на уровне документа (PAdES-B-LTA).

Штрихкоды

generate_barcode_svg(barcode_type: int, data: str) -> str
generate_qr_svg(data: str, error_correction: int, size: int) -> str

Генерирует одномерный штрихкод или QR-код в виде строки SVG. Требует функции barcodes.

Разбиение по закладкам

plan_split_by_bookmarks(src_bytes: bytes, title_prefix: str | None = None, ignore_case: bool = False, level: int = 1, include_front_matter: bool = True) -> list[dict]
split_by_bookmarks(src_bytes: bytes, title_prefix: str | None = None, ignore_case: bool = False, level: int = 1, include_front_matter: bool = True) -> list[tuple[dict, bytes]]

Планирует или выполняет разбиение PDF по границам закладок. plan_* возвращает только метаданные сегментов; split_* возвращает каждый сегмент в паре с его байтами PDF.

Подготовка моделей OCR

prefetch_models(languages: list[str]) -> str
model_manifest() -> str
prefetch_available() -> bool

Подготавливает модели OCR для офлайн/изолированного использования, инспектирует манифест моделей (JSON) и проверяет, может ли эта сборка загружать модели.

Логирование

setup_logging() -> None
set_log_level(level: str) -> None     # "off" | "error" | "warn" | "info" | "debug" | "trace"
get_log_level() -> str
disable_logging() -> None

Настройка движка

set_max_ops_per_stream(limit: int | None) -> int | None
set_preserve_unmapped_glyphs(preserve: bool) -> bool

Регулирует ограничение на число операторов в потоке (защита от вредоносного ввода) и сохранение U+FFFD для несопоставленных глифов. Оба метода возвращают предыдущее значение.

Криптографическое управление

crypto_active_provider() -> str
crypto_available_providers() -> list[str]
crypto_use_fips() -> None                 # install the FIPS aws-lc-rs provider (requires the fips feature)
crypto_set_policy(spec: str) -> None      # e.g. "strict" or "compat;deny:rc4@write"
crypto_policy() -> str
crypto_inventory() -> list[str]
crypto_cbom() -> str                      # CycloneDX 1.6 CBOM (JSON)

Асинхронный API

Обёртки async/await, которые выполняют блокирующие операции в пуле потоков. Методы зеркалируют свои синхронные аналоги.

from pdf_oxide import AsyncPdfDocument, AsyncPdf, AsyncOfficeConverter

async def main():
    doc = await AsyncPdfDocument.open("input.pdf")
    text = await doc.extract_text(0)
    await doc.close()
    # Or use as an async context manager:
    async with await AsyncPdfDocument.from_bytes(pdf_bytes) as doc:
        md = await doc.to_markdown_all()
Класс Конструкторы Примечания
AsyncPdfDocument await AsyncPdfDocument.open(path, password=None), await AsyncPdfDocument.from_bytes(data, password=None) Все методы PdfDocument доступны как awaitable; поддерживает async with и .close()
AsyncPdf оборачивает фабричные методы Pdf await pdf.save(path), await pdf.to_bytes()
AsyncOfficeConverter оборачивает статические методы OfficeConverter например, await AsyncOfficeConverter.from_docx(path)

Обработка ошибок

PdfError

Все ошибки, характерные для PDF, выбрасывают PdfError:

from pdf_oxide import PdfDocument, PdfError

try:
    doc = PdfDocument("file.pdf")
    text = doc.extract_text(0)
except PdfError as e:
    print(f"PDF error: {e}")
except FileNotFoundError:
    print("File not found")
except IndexError:
    print("Page index out of range")

Типичные сценарии ошибок:

Исключение Причина
PdfError Повреждённый PDF, зашифрован без пароля, сбой разбора
FileNotFoundError Файл не существует
IndexError Индекс страницы превышает page_count()
ValueError Некорректный аргумент (например, отрицательный индекс страницы)

Полный пример

from pdf_oxide import PdfDocument, Pdf

# --- Extraction ---
doc = PdfDocument("input.pdf")
print(f"Pages: {doc.page_count()}")

for i in range(doc.page_count()):
    text = doc.extract_text(i)
    print(f"Page {i + 1}: {len(text)} characters")

# Character-level analysis
chars = doc.extract_chars(0)
fonts = set(ch.font_name for ch in chars)
print(f"Fonts on page 1: {fonts}")

# Image extraction
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
    with open(f"extracted_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

# --- Creation ---
pdf = Pdf.from_markdown("# Report\n\nGenerated by PDF Oxide.",
                        title="Report", author="PDF Oxide")
pdf.save("report.pdf")

# --- Editing ---
doc = PdfDocument("document.pdf")
doc.set_title("Updated Title")
doc.set_author("New Author")
doc.rotate_all_pages(90)

# Search and replace via DOM
page = doc.page(0)
for text in page.find_text_containing("DRAFT"):
    page.set_text(text.id, "FINAL")
doc.save_page(page)

# Form filling
fields = doc.get_form_fields()
for f in fields:
    print(f"{f.name} ({f.field_type}) = {f.value}")
doc.set_form_field_value("name", "John Doe")

# Merge another PDF
merged_count = doc.merge_from("appendix.pdf")
print(f"Merged {merged_count} pages")

doc.save("output.pdf")

# --- Search ---
results = doc.search("configuration", case_insensitive=True)
for r in results:
    print(f"Page {r.page + 1}: '{r.text}' at ({r.x:.0f}, {r.y:.0f})")

Добавления в v0.3.38

DocumentBuilder / FluentPageBuilder / EmbeddedFont

from pdf_oxide import DocumentBuilder, EmbeddedFont, StampType

font = EmbeddedFont.from_file("DejaVuSans.ttf")
# Alt: EmbeddedFont.from_bytes(data: bytes, name: str | None = None)

(DocumentBuilder()
    .register_embedded_font("DejaVu", font)
    .letter_page()           # or .a4_page() / .page(size)
        .at(72, 720).font("DejaVu", 12).text("Hello")
        .heading(1, "Title")
        .paragraph("Body text with automatic wrapping")
        # Annotations (15 methods)
        .link_url("https://example.com")
        .link_page(2)
        .link_named("glossary")
        .highlight((1.0, 1.0, 0.0))
        .underline((0.0, 0.0, 1.0))
        .strikeout((1.0, 0.0, 0.0))
        .squiggly((1.0, 0.5, 0.0))
        .sticky_note("Review this")
        .stamp(StampType.APPROVED)
        .freetext((100, 500, 200, 50), "Comment")
        .watermark("DRAFT")
        .watermark_confidential()
        .watermark_draft()
        # AcroForm widgets (5 types)
        .text_field("name", 150, 400, 200, 20, "Jane Doe")
        .checkbox("agree", 72, 380, 15, 15, True)
        .combo_box("country", 150, 360, 200, 20, ["US", "UK"], "US")
        .radio_group("tier", [("free", 72, 340, 15, 15), ("pro", 120, 340, 15, 15)], "pro")
        .push_button("submit", 72, 300, 80, 25, "Submit")
        # Graphics primitives
        .rect(50, 270, 500, 2)
        .filled_rect(50, 260, 500, 2, (0.9, 0.9, 0.9))
        .line(50, 250, 550, 250)
    .done()
    .save_encrypted("out.pdf", "user-pw", "owner-pw"))
# Alt: .save("out.pdf") / .build() -> bytes
# Alt: .to_bytes_encrypted("user-pw", "owner-pw") -> bytes

Конвейер HTML + CSS

Pdf.from_html_css(html: str, css: str, font_bytes: bytes) -> Pdf
Pdf.from_html_css_with_fonts(html: str, css: str, fonts: list[tuple[str, bytes]]) -> Pdf

См. Создание из HTML.

Проверка подписей

from pdf_oxide import PdfDocument, Timestamp, TsaClient

doc = PdfDocument("signed.pdf")
doc.signature_count()                # int
for sig in doc.signatures():
    sig.signer_name                  # str
    sig.reason                       # str | None
    sig.location                     # str | None
    sig.signing_time                 # datetime | None
    sig.verify()                     # "Valid" | "Invalid" | "Unknown"
    sig.verify_detached(pdf_bytes)   # adds messageDigest check

# Timestamp
ts = Timestamp.parse(tst_bytes)
ts.time, ts.serial, ts.policy_oid, ts.tsa_name, ts.hash_algorithm, ts.message_imprint

# TSA client (behind `tsa-client` feature)
client = TsaClient(url="https://freetsa.org/tsr",
                   username=None, password=None,
                   timeout_seconds=30, hash_algorithm=2,
                   use_nonce=True, cert_req=True)
ts = client.request_timestamp(pdf_bytes)
ts = client.request_timestamp_hash(digest, algorithm=2)

Подробности см. в разделе Цифровые подписи.

Рендеринг

doc.render_page_region(page: int, x: float, y: float, w: float, h: float, format: int = 0) -> bytes
doc.render_page_fit(page: int, fit_width: int, fit_height: int, format: int = 0) -> bytes

format: 0 = PNG, 1 = JPEG. Координаты в пунктах PDF от нижнего левого угла.

Сведение Pdf

doc.flatten_to_images(dpi: int = 150) -> bytes

Other Language Bindings

PDF Oxide предоставляет нативные привязки для всех основных экосистем: Rust, Node.js, WASM, C#, Golang, Java, PHP, Ruby, C++, Swift, Kotlin, Dart, R, Julia, Zig, Scala, Clojure, Objective-C, и Elixir.

Дальнейшие шаги