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. Опис Node.js API дивіться в Довіднику Node.js API, а опис WASM API — у Довіднику WASM API. Деталі щодо типів дивіться в розділі Типи та enum.


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) або фарби/сепарації (ink/separation) за іменем, а також увімкнути чи вимкнути реконструкцію таблиць.

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]

Видобуває текстові спани з метаданими шрифту. Кожен спан — це послідовність тексту з однаковим стилем. Передайте reading_order="column_aware" для багатоколонкових PDF.

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]

Видобуває всі зображення зі сторінки, включно із зображеннями в content stream і вкладених 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 Зняти позначку зведення зі сторінки

Редагування (Redaction)

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) intbool Перевірити наявність незавершених змін зображень

Операції з документом

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.

Page 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 Символ Unicode
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() Створити доступний документ Tagged 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 Залишок вертикального простору на сторінці

Вбудовані фрагменти (inline runs)

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 Зареєстрована назва шрифту

Таблиці

Об’єкти-значення для плавного (fluent) 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

Генерує 1D-штрихкод або 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 flatten

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.

Наступні кроки