Справочник 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 из различных исходных форматов.
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()
Header / Footer
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.
Дальнейшие шаги
- Типы и перечисления — все общие типы и перечисления
- Справочник Page API — единообразная постраничная итерация для всех привязок
- Начало работы с Python — учебное руководство