Skip to content

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

PDF Oxide поставляет идиоматичные привязки для Kotlin/JVM (готовые для Android) в виде тонкого фасада над зрелой Java-привязкой fyi.oxide:pdf-oxide, которая владеет единственным нативным мостом JNI (крейт pdf_oxide_jni). Модуль Kotlin не добавляет никакого нативного кода: он реэкспортирует типы из Java (PdfDocument, Pdf, PdfPage, DocumentEditor, PdfSigner, PdfValidator, AutoExtractor и типы-значения геометрии / текста / таблиц / поиска) и наслаивает поверх удобства Kotlin — расширения Optional<T> в T? и use { } для закрываемых хендлов AutoCloseable.

// build.gradle.kts
dependencies {
    implementation("fyi.oxide:pdf-oxide-kotlin:0.3.69")
}

Нативная библиотека JNI (libpdf_oxide_jni) не входит в комплект — загрузите её через System.loadLibrary("pdf_oxide_jni") (поставьте .so/.dylib в java.library.path или в jniLibs/<abi>/ на Android) либо укажите её Java-загрузчику NativeLoader через -Dfyi.oxide.pdf.lib.path=<path>.

Документацию по Java API см. в Справочнике Java API. По Rust API — в Справочнике Rust API. Подробности о типах см. в Типы и перечисления.

import fyi.oxide.pdf.Pdf
import fyi.oxide.pdf.PdfDocument
import fyi.oxide.pdf.producerOrNull

Pdf.fromMarkdown("# Hello\n\nbody\n").use { pdf ->
    PdfDocument.open(pdf.save()).use { doc ->
        println(doc.pageCount())
        println(doc.extractText(0))
        println(doc.toMarkdown())
        println(doc.page(0).words().map { it.text() })
        println(doc.producerOrNull() ?: "(no producer)")   // Optional -> nullable
    }
}

Все хендлы (PdfDocument, Pdf, DocumentEditor) реализуют AutoCloseable, поэтому блок Kotlin use { } детерминированно освобождает нативную память. Ошибки порождают PdfException (и его подклассы); см. Исключения.


PdfDocument

Основная точка входа для чтения PDF — открытие, извлечение, конвертация, рендеринг, поиск и инспекция полей форм. Экземпляры владеют нативной памятью и должны быть закрыты; используйте use { }.

import fyi.oxide.pdf.PdfDocument

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

PdfDocument.open(path: Path): PdfDocument

Открыть PDF по пути в файловой системе.

PdfDocument.open(path: String): PdfDocument

Открыть PDF по строке пути.

PdfDocument.open(bytes: ByteArray): PdfDocument

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

PdfDocument.open(path: Path, password: String): PdfDocument

Открыть зашифрованный PDF по пути с паролем пользователя или владельца.

PdfDocument.open(path: String, password: String): PdfDocument

Открыть зашифрованный PDF по строке пути с паролем.

PdfDocument.open(bytes: ByteArray, password: String): PdfDocument

Открыть зашифрованный PDF из байтов с паролем.

PdfDocument.open(stream: InputStream): PdfDocument

Открыть PDF, прочитав все байты из InputStream.

Статические одноразовые вызовы

PdfDocument.extractText(path: String): String
PdfDocument.extractText(path: Path): String

Открыть, извлечь весь текст и закрыть за один вызов — для простых случаев, когда живой хендл не нужен.

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

doc.authenticate(password: String): Boolean
doc.authenticate(password: ByteArray): Boolean

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

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

doc.pageCount(): Int

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

doc.producer(): Optional<String>
doc.creator(): Optional<String>

Метаданные документа /Producer и /Creator. Для доступа через null используйте расширения Kotlin producerOrNull() / creatorOrNull().

val doc.isOpen: Boolean

Открыт ли ещё нативный хендл (свойство Kotlin поверх Java-геттера isOpen()).

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

doc.extractText(pageIndex: Int): String

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

doc.extractTextAuto(pageIndex: Int): String

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

doc.extractStructured(page: Int): String

Извлечь структурированное (JSON) представление текста и раскладки страницы.

Конвертация

doc.toMarkdown(): String
doc.toMarkdown(pageIndex: Int): String

Преобразовать весь документ или одну страницу в Markdown.

doc.toHtml(): String
doc.toHtml(pageIndex: Int): String

Преобразовать весь документ или одну страницу в HTML.

Поиск

doc.search(query: String): List<SearchMatch>

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

doc.search(query: String, caseInsensitive: Boolean, regex: Boolean, maxResults: Int): List<SearchMatch>

Поиск с учётом регистра, поддержкой регулярных выражений и ограничением числа результатов (maxResults = 0 означает отсутствие ограничения).

Формы

doc.formFields(): List<FormField>

Получить все поля AcroForm с их типом, значением, границами виджета и индексом страницы. См. FormField.

Рендеринг

doc.render(pageIndex: Int): ByteArray
doc.render(pageIndex: Int, dpi: Int): ByteArray

Отрендерить страницу в байты изображения PNG с разрешением по умолчанию или заданным DPI.

Доступ к страницам

doc.page(index: Int): PdfPage

Получить ленивый хендл PdfPage по заданному индексу (с нуля).

doc.pages(): List<PdfPage>

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

doc.pagesStream(): Stream<PdfPage>

Получить все страницы как Java Stream для текучей обработки.

Жизненный цикл

doc.close()

Освободить нативную память. Идемпотентно — повторный вызов ничего не делает. Предпочитайте use { }.


PdfPage

Ленивый хендл страницы, возвращаемый методами PdfDocument.page(), pages() или pagesStream(). Все аксессоры при обращении делегируют родительскому документу.

PdfDocument.open(bytes).use { doc ->
    val page = doc.page(0)
    val words = page.words()
    val tables = page.tables()
}

Геометрия

page.parent(): PdfDocument
page.index(): Int
page.mediaBox(): BBox
page.cropBox(): BBox
page.width(): Double
page.height(): Double
page.rotation(): Int

Родительский документ, индекс (с нуля), прямоугольники MediaBox / CropBox, размеры в пунктах PDF и поворот страницы в градусах.

Извлечение содержимого

page.text(): String

Извлечь весь текст на странице.

page.text(region: BBox): String

Извлечь текст в пределах области-прямоугольника.

page.words(): List<TextWord>
page.lines(): List<TextLine>
page.chars(): List<TextChar>

Структурированный текст с детализацией по словам, строкам и символам.

page.images(): List<ExtractedImage>
page.tables(): List<Table>
page.annotations(): List<Annotation>

Извлечённые изображения, обнаруженные таблицы и аннотации страницы.


Pdf

Создание PDF из исходных форматов, разбиение по закладкам и сериализация. Реализует AutoCloseable.

import fyi.oxide.pdf.Pdf

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

Pdf.fromMarkdown(markdown: String): Pdf

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

Pdf.fromHtml(html: String): Pdf

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

Pdf.fromImages(images: List<ByteArray>): Pdf

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

Разбиение

pdf.planSplitByBookmarks(opts: SplitByBookmarksOptions): List<BookmarkSegment>

Спланировать разбиение по закладкам оглавления без формирования вывода — возвращает сегменты (заголовок, диапазон страниц, имя файла), которые были бы созданы.

pdf.splitByBookmarks(opts: SplitByBookmarksOptions): List<ByteArray>

Разбить на несколько PDF по уровню закладок. Возвращает по одному байтовому массиву на сегмент.

Pdf.planSplitByBookmarksCount(sourcePdf: ByteArray, level: Int): Int

Статический помощник: подсчитать, сколько сегментов даст разбиение по закладкам на заданном уровне.

Pdf.splitByBookmarksFromBytes(sourcePdf: ByteArray, level: Int): Array<ByteArray>

Статический помощник: разбить байты исходного PDF по уровню закладок напрямую.

Сохранение

pdf.save(): ByteArray

Сериализовать PDF в байты.

pdf.saveTo(out: Path)

Записать PDF в файл.

val pdf.isOpen: Boolean
pdf.close()

Жизненный цикл (свойство Kotlin isOpen и close()). Предпочитайте use { }.


DocumentEditor

Мутирующий редактор для редактирования (редакции), заполнения форм, очистки метаданных и инкрементального сохранения. Реализует AutoCloseable. Методы-сеттеры возвращают this для текучего сцепления вызовов.

import fyi.oxide.pdf.DocumentEditor

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

DocumentEditor.open(path: Path): DocumentEditor
DocumentEditor.open(path: String): DocumentEditor
DocumentEditor.open(bytes: ByteArray): DocumentEditor

Открыть документ для редактирования по пути или из байтов в памяти.

Заполнение форм

editor.setFormField(name: String, value: String): DocumentEditor

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

editor.setFormField(name: String, checked: Boolean): DocumentEditor

Установить состояние флажка/переключателя по имени.

Редакция

editor.addRedaction(pageIndex: Int, region: BBox): DocumentEditor

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

editor.redactionCount(pageIndex: Int): Int
editor.redactionCount(): Int

Количество редакций в очереди на странице или по всему документу.

editor.applyRedactionsDestructive(): RedactResult

Безвозвратно применить все редакции из очереди, удаляя подлежащее содержимое. Возвращает RedactResult с количеством применённых редакций и статусом проверки оракулом.

Метаданные

editor.scrubMetadata(): DocumentEditor

Удалить метаданные документа (словарь Info, XMP) ради конфиденциальности.

Сохранение

editor.save(): ByteArray
editor.saveTo(out: Path)

Сериализовать отредактированный документ с полной перезаписью.

editor.saveIncremental(): ByteArray
editor.saveIncrementalTo(out: Path)

Сериализовать с помощью инкрементального обновления (дописывает изменения, сохраняя исходные байты).

val editor.isOpen: Boolean
editor.close()

Жизненный цикл. Предпочитайте use { }.


AutoExtractor

Адаптивный конвейер извлечения, который классифицирует страницы (текстовый слой или скан), применяет OCR там, где это нужно, и выдаёт текст / Markdown / HTML с оценками уверенности.

import fyi.oxide.pdf.AutoExtractor

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

AutoExtractor.of(doc: PdfDocument): AutoExtractor
AutoExtractor.of(doc: PdfDocument, config: AutoExtractConfig): AutoExtractor

Создать экстрактор над документом, опционально с пользовательской конфигурацией AutoExtractConfig.

AutoExtractor.fast(doc: PdfDocument): AutoExtractor
AutoExtractor.balanced(doc: PdfDocument): AutoExtractor
AutoExtractor.highFidelity(doc: PdfDocument): AutoExtractor

Предустановленные конфигурации, балансирующие скорость и точность.

Извлечение

extractor.extractText(): String
extractor.extractTextForPage(pageIndex: Int): String

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

extractor.extractDocument(): AutoResult
extractor.extractPage(pageIndex: Int): AutoResult

Полное адаптивное извлечение, возвращающее AutoResult (текст, опциональные Markdown/HTML, причина, уверенность, флаг OCR, области).

extractor.extractAutoDocument(): AutoResult
extractor.extractAutoPage(pageIndex: Int): AutoResult

Варианты извлечения на уровне документа и страницы в авто-режиме.

extractor.extractDocumentJson(): String
extractor.extractPageJson(pageIndex: Int): String

Извлечение, сериализованное в виде строки JSON.

Классификация

extractor.classifyDocument(): ClassifyResult
extractor.classifyPage(pageIndex: Int): ClassifyResult

Классифицировать документ или страницу, возвращая ClassifyResult (класс каждой страницы плюс списки страниц, требующих OCR, содержащих диаграммы или зашифрованных).

extractor.classifyPageKind(pageIndex: Int): PageClass
extractor.classifyDocumentKinds(): List<PageClass>

Получить PageClass (TEXT_LAYER / SCANNED / MIXED) для страницы или всех страниц.

Аксессоры

extractor.document(): PdfDocument
extractor.config(): AutoExtractConfig

Обёрнутый документ и активная конфигурация.


MarkdownConverter

Конвертер из PdfDocument в Markdown или HTML без состояния и потокобезопасный.

import fyi.oxide.pdf.MarkdownConverter

MarkdownConverter.toMarkdown(doc: PdfDocument): String
MarkdownConverter.toMarkdown(doc: PdfDocument, pageIndex: Int): String
MarkdownConverter.toHtml(doc: PdfDocument): String
MarkdownConverter.toHtml(doc: PdfDocument, pageIndex: Int): String

Преобразовать весь документ или одну страницу в Markdown / HTML.


PdfSigner

Цифровая подпись и проверка PDF с хранилищами ключей PKCS#12 (уровни PAdES B-B / B-T / B-LT).

import fyi.oxide.pdf.PdfSigner
PdfSigner.fromPkcs12(keystore: Path, password: String): PdfSigner
PdfSigner.fromPkcs12(keystoreBytes: ByteArray, password: String): PdfSigner

Загрузить подписанта из хранилища ключей PKCS#12 с диска или из памяти.

signer.sign(pdf: ByteArray, opts: SignOptions): ByteArray

Подписать байты PDF с заданными параметрами SignOptions (уровень, причина, местоположение, контакт, URL службы меток времени TSA). Возвращает подписанный PDF.

signer.verify(pdf: ByteArray): Boolean

Проверить все подписи в PDF. Возвращает true, если каждая подпись криптографически корректна.

PdfSigner.classifyLevel(pdf: ByteArray): SignatureLevel

Статический помощник: определить уровень соответствия PAdES для уже подписанного PDF.


PdfValidator

Проверка соответствия стандартам PDF/A, PDF/X и PDF/UA без состояния и потокобезопасная.

import fyi.oxide.pdf.PdfValidator

PdfValidator.isPdfA(doc: PdfDocument, level: PdfALevel): Boolean
PdfValidator.isPdfUa(doc: PdfDocument, level: PdfUaLevel): Boolean

Быстрые булевы проверки соответствия.

PdfValidator.validatePdfA(doc: PdfDocument, level: PdfALevel): ValidationResult
PdfValidator.validatePdfX(doc: PdfDocument, level: PdfXLevel): ValidationResult
PdfValidator.validatePdfUa(doc: PdfDocument, level: PdfUaLevel): ValidationResult

Полная проверка, возвращающая ValidationResult со списком нарушений.


PdfPolicy

Глобальные настройки политики безопасности, определяющие, какие криптографические алгоритмы разрешены.

import fyi.oxide.pdf.PdfPolicy

PdfPolicy.current(): PolicyMode
PdfPolicy.set(mode: PolicyMode)
PdfPolicy.compat(): PolicyMode
PdfPolicy.strict(): PolicyMode
PdfPolicy.fipsStrict(): PolicyMode

Прочитать или установить активный PolicyMode, а также получить встроенные режимы compat / strict / FIPS-strict.


Расширения Kotlin

Единственное, что добавляет фасад Kotlin: преобразователи Optional<T> в T? и обобщённый помощник orNull(). Импортируйте из fyi.oxide.pdf.

fun <T : Any> Optional<T>.orNull(): T?

Обобщённый: пустой Optional становится null.

fun PdfDocument.producerOrNull(): String?
fun PdfDocument.creatorOrNull(): String?

Документ /Producer и /Creator, или null, если отсутствуют.

fun FormField.valueOrNull(): String?
fun FormField.bboxOrNull(): BBox?

Значение поля формы и ограничивающий прямоугольник виджета, или null.

fun Annotation.contentsOrNull(): String?
fun Annotation.uriOrNull(): String?

Аннотация /Contents и URI цели ссылки, или null.

fun AutoResult.markdownOrNull(): String?
fun AutoResult.htmlOrNull(): String?

Представление авто-извлечения в Markdown / HTML, или null, если оно не было сформировано.

fun ValidationViolation.pageIndexOrNull(): Int?

Индекс страницы, к которой относится нарушение, или null для правил уровня документа.


Типы геометрии

BBox

Ограничивающий прямоугольник, выровненный по осям, в пунктах PDF.

BBox(x0: Double, y0: Double, x1: Double, y1: Double)
Аксессор Тип Описание
x0(), y0(), x1(), y1() Double Координаты углов
width() Double x1 - x0
height() Double y1 - y0

Color

8-битный цвет RGBA с именованными константами Color.BLACK, Color.WHITE, Color.TRANSPARENT.

Color(r: Int, g: Int, b: Int, a: Int)
Color(r: Int, g: Int, b: Int)            // a = 255

Аксессоры: r(): Int, g(): Int, b(): Int, a(): Int.

Point

Point(x: Double, y: Double)

Аксессоры: x(): Double, y(): Double.

Rect

Прямоугольник вида «позиция плюс размер».

Rect(x: Double, y: Double, width: Double, height: Double)

Аксессоры: x(), y(), width(), height() (все Double) и toBBox(): BBox.


Типы текста

TextChar

Один извлечённый символ.

TextChar(codepoint: Int, bbox: BBox, confidence: Float)

Аксессоры: codepoint(): Int, bbox(): BBox, confidence(): Float, asString(): String.

TextWord

TextWord(text: String, bbox: BBox, confidence: Float)

Аксессоры: text(): String, bbox(): BBox, confidence(): Float.

TextLine

TextLine(text: String, bbox: BBox, words: List<TextWord>)

Аксессоры: text(): String, bbox(): BBox, words(): List<TextWord>.

TextSpan

Отрезок текста с одинаковым стилем.

TextSpan(text: String, bbox: BBox, style: TextStyle)

Аксессоры: text(): String, bbox(): BBox, style(): TextStyle.

TextStyle

TextStyle(font: String?, size: Double, color: Color, bold: Boolean, italic: Boolean)

Аксессоры: font(): String?, size(): Double, color(): Color, bold(): Boolean, italic(): Boolean.


Типы таблиц

Table

Table(bbox: BBox, rows: Int, cols: Int, cells: List<TableCell>)

Аксессоры: bbox(): BBox, rows(): Int, cols(): Int, cells(): List<TableCell>.

TableCell

TableCell(text: String, bbox: BBox, row: Int, col: Int, rowSpan: Int, colSpan: Int)

Аксессоры: text(): String, bbox(): BBox, row(): Int, col(): Int, rowSpan(): Int, colSpan(): Int.


Типы поиска

SearchMatch

SearchMatch(pageIndex: Int, bbox: BBox, text: String)

Аксессоры: pageIndex(): Int, bbox(): BBox, text(): String.

SearchResult

SearchResult(query: String, matches: List<SearchMatch>)

Аксессоры: query(): String, matches(): List<SearchMatch>, count(): Int, isEmpty(): Boolean.

SearchOptions

Неизменяемые параметры, собираемые через текучий билдер. SearchOptions.DEFAULT — экземпляр по умолчанию.

SearchOptions.builder()
    .withCaseSensitive(true)
    .withWholeWord(true)
    .withRegex(false)
    .withMaxResults(50)
    .build()

Аксессоры: caseSensitive(): Boolean, wholeWord(): Boolean, regex(): Boolean, maxResults(): Optional<Int>. Методы билдера: withCaseSensitive(Boolean), withWholeWord(Boolean), withRegex(Boolean), withMaxResults(Int) / withMaxResults(Int?), build().

Примечание: на данный момент не подключён к PdfDocument.search() — используйте вместо этого перегрузку с caseInsensitive/regex/maxResults выше.


Типы форм

FormField

FormField(name: String, type: FormFieldType, value: String?, bbox: BBox?, pageIndex: Int)

Аксессоры: name(): String, type(): FormFieldType, value(): Optional<String>, bbox(): Optional<BBox>, pageIndex(): Int. Для доступа через null используйте valueOrNull() / bboxOrNull().


Типы аннотаций

Annotation

Annotation(type: AnnotationType, pageIndex: Int, bbox: BBox, contents: String?, uri: String?)

Аксессоры: type(): AnnotationType, pageIndex(): Int, bbox(): BBox, contents(): Optional<String>, uri(): Optional<String>. Для доступа через null используйте contentsOrNull() / uriOrNull().


Типы изображений

ExtractedImage

ExtractedImage(bytes: ByteArray, format: ImageFormat, bbox: BBox, width: Int, height: Int)

Аксессоры: bytes(): ByteArray, format(): ImageFormat, bbox(): BBox, width(): Int, height(): Int.


Типы автоматического извлечения

AutoResult

Результат адаптивного извлечения.

result.text(): String
result.markdown(): Optional<String>
result.html(): Optional<String>
result.reason(): ExtractReason
result.confidence(): Double
result.ocrUsed(): Boolean
result.regions(): List<RegionResult>
result.pagesNeedingOcr(): List<Int>

Для доступа через null к отрендеренному выводу используйте markdownOrNull() / htmlOrNull().

RegionResult

Подробности извлечения по каждой области внутри AutoResult.

region.pageIndex(): Int
region.bbox(): BBox
region.text(): String
region.reason(): ExtractReason
region.confidence(): Double
region.ocrUsed(): Boolean
region.table(): Optional<Table>

ClassifyResult

result.pages(): List<PageClass>
result.pagesNeedingOcr(): List<Int>
result.pagesWithChart(): List<Int>
result.pagesEncrypted(): List<Int>

AutoExtractConfig

Неизменяемая конфигурация, собираемая через текучий билдер; AutoExtractConfig.DEFAULT — значение по умолчанию. Преобразовать существующую конфигурацию обратно в билдер можно методом toBuilder().

AutoExtractConfig.builder()
    .withMode(ExtractMode.AUTO)
    .withForceOcrPages(listOf(2, 5))
    .withMinOcrConfidence(0.6)
    .withOcrLanguages("eng", "deu")
    .withPasswords("secret")
    .withTopMarginFraction(0.05)
    .withBottomMarginFraction(0.05)
    .withAllowSingleColumnTables(true)
    .withOcrInlineImages(false)
    .withCancelToken("token-id")
    .build()

Аксессоры возвращают Optional<...> для каждого поля: mode(), forceOcrPages(), minOcrConfidence(), ocrLanguages(), passwords(), topMarginFraction(), bottomMarginFraction(), allowSingleColumnTables(), ocrInlineImages(), cancelToken(). Сеттеры билдера принимают как обёрнуто-nullable, так и примитивные перегрузки (например, withMinOcrConfidence(Double?) и withTopMarginFraction(double)), а также формы с varargs withOcrLanguages(vararg String) / withPasswords(vararg String).


Типы соответствия

ValidationResult

ValidationResult(valid: Boolean, violations: List<ValidationViolation>)

Аксессоры: valid(): Boolean, violations(): List<ValidationViolation>.

ValidationViolation

ValidationViolation(ruleId: String, description: String, pageIndex: Int?)

Аксессоры: ruleId(): String, description(): String, pageIndex(): Optional<Int>. Для доступа через null используйте pageIndexOrNull().


Типы метаданных

DocumentInfo

DocumentInfo(/* title, author, subject, keywords, creator, producer, creationDate, modificationDate */)

Все аксессоры возвращают Optional<String>: title(), author(), subject(), keywords(), creator(), producer(), creationDate(), modificationDate().

XmpMetadata

Сырой пакет XMP. XmpMetadata.EMPTY — пустой экземпляр.

XmpMetadata(xml: String)

Аксессоры: xml(): String, isEmpty(): Boolean.


Типы безопасности и редакции

SecurityPolicy

Неизменяемая политика, собираемая через текучий билдер.

SecurityPolicy.builder()
    .withMode(PolicyMode.STRICT)
    .allow("algorithm-id")
    .deny("algorithm-id")
    .build()

Аксессоры: mode(): PolicyMode, additionalAllow(): List<String>, additionalDeny(): List<String>. Методы билдера: withMode(PolicyMode), allow(String), deny(String), build().

RedactResult

RedactResult(regionsApplied: Int, oracleVerified: Boolean)

Аксессоры: regionsApplied(): Int, oracleVerified(): Boolean.


Типы подписи

SignOptions

Неизменяемые параметры подписи, собираемые через текучий билдер.

SignOptions.builder()
    .withLevel(SignatureLevel.B_T)
    .withReason("Approved")
    .withLocation("HQ")
    .withContactInfo("ops@example.com")
    .withTsaUrl("https://freetsa.org/tsr")
    .build()

Аксессоры: level(): SignatureLevel, reason(): Optional<String>, location(): Optional<String>, contactInfo(): Optional<String>, tsaUrl(): Optional<String>. Методы билдера: withLevel, withReason, withLocation, withContactInfo, withTsaUrl, build().


Типы разбиения

BookmarkSegment

BookmarkSegment(title: String, firstPage: Int, lastPage: Int, filename: String)

Аксессоры: title(): String, firstPage(): Int, lastPage(): Int, filename(): String.

SplitByBookmarksOptions

Неизменяемые параметры, собираемые через текучий билдер.

SplitByBookmarksOptions.builder()
    .withLevel(1)
    .withFilenamePrefix("chapter-")
    .build()

Аксессоры: level(): Int, filenamePrefix(): Optional<String>. Методы билдера: withLevel(Int), withFilenamePrefix(String?), build().


Перечисления

Перечисление Значения
FormFieldType TEXT, CHECKBOX, RADIO, CHOICE
AnnotationType HIGHLIGHT, TEXT, LINK, STAMP, UNDERLINE, STRIKEOUT, SQUIGGLY, FREE_TEXT, LINE, SQUARE, CIRCLE, FILE_ATTACHMENT
ImageFormat JPEG, PNG, CCITT, RAW
ExtractMode TEXT_ONLY, AUTO
ExtractReason OK, SCANNED_NO_TEXT_LAYER, GLYPH_MAPPING_MISSING, ENCRYPTED_NO_EXTRACT_PERMISSION, IMAGE_TABLE_NO_STRUCTURE, CHART_NOT_TRANSCRIBED, OCR_REQUESTED_BUT_UNAVAILABLE, OCR_LOW_CONFIDENCE, EMPTY
PageClass TEXT_LAYER, SCANNED, MIXED
PixelFormat RGBA_8888, RGB_888, GRAY_8, PNG
PolicyMode COMPAT, STRICT
SignatureLevel B_B, B_T, B_LT
PdfALevel A_1B, A_1A, A_2B, A_2A, A_2U, A_3B, A_3A, A_3U, A_4, A_4E, A_4F
PdfXLevel X_1A_2001, X_1A_2003, X_3_2002, X_3_2003, X_4, X_4P, X_5G, X_5N, X_5PG, X_6, X_6P, X_6N
PdfUaLevel UA_1, UA_2 (каждое предоставляет code(): Int)
PdfErrorKind PARSE, ENCRYPTED, PERMISSION, IO, OCR_UNAVAILABLE, SIGNATURE, INVALID_STATE, UNSUPPORTED, OTHER

Исключения

Все сбои порождают PdfException (непроверяемое исключение) или один из его подклассов, специфичных для вида ошибки. Аксессор kind() возвращает PdfErrorKind.

import fyi.oxide.pdf.exception.PdfException

try {
    PdfDocument.open(bytes).use { doc ->
        println(doc.extractText(0))
    }
} catch (e: PdfException) {
    println("PDF error [${e.kind()}]: ${e.message}")
}
PdfException(message: String)
PdfException(kind: PdfErrorKind, message: String)
PdfException(kind: PdfErrorKind, message: String, cause: Throwable)

e.kind(): PdfErrorKind
Исключение Причина
PdfParseException Некорректный или повреждённый PDF
PdfEncryptedException Зашифрованный документ открыт без корректного пароля
PdfPermissionException Операция заблокирована разрешениями документа
PdfIoException Сбой нижележащего ввода-вывода
PdfOcrUnavailableException Запрошен OCR, но функция ocr не была собрана
PdfSignatureException Сбой подписания или проверки подписи
PdfInvalidStateException Операция недопустима для текущего состояния хендла
PdfUnsupportedException Неподдерживаемая функция или формат

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

import fyi.oxide.pdf.AutoExtractor
import fyi.oxide.pdf.DocumentEditor
import fyi.oxide.pdf.Pdf
import fyi.oxide.pdf.PdfDocument
import fyi.oxide.pdf.geometry.BBox
import fyi.oxide.pdf.producerOrNull

// --- Creation ---
val bytes = Pdf.fromMarkdown("# Report\n\nGenerated by PDF Oxide.").use { it.save() }

// --- Extraction ---
PdfDocument.open(bytes).use { doc ->
    println("Pages: ${doc.pageCount()}")
    println("Producer: ${doc.producerOrNull() ?: "(none)"}")

    val page = doc.page(0)
    println("Words: ${page.words().map { it.text() }}")
    println("Tables: ${page.tables().size}")

    // Search without case sensitivity
    val matches = doc.search("Report", caseInsensitive = true, regex = false, maxResults = 0)
    matches.forEach { m -> println("p${m.pageIndex()} '${m.text()}' @ ${m.bbox()}") }

    // Adaptive extraction
    val result = AutoExtractor.balanced(doc).extractDocument()
    println("confidence=${result.confidence()} ocr=${result.ocrUsed()}")
}

// --- Editing: redact + fill forms ---
DocumentEditor.open(bytes).use { editor ->
    editor.setFormField("name", "Jane Doe")
        .addRedaction(0, BBox(72.0, 700.0, 272.0, 720.0))
        .scrubMetadata()
    val redaction = editor.applyRedactionsDestructive()
    println("Redacted ${redaction.regionsApplied()} regions")
    val out: ByteArray = editor.save()
}

Other Language Bindings

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

Следующие шаги