Skip to content

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

PDF Oxide предоставляет нативные биндинги для Java через слой JNI поверх ядра на Rust. Встроенная нативная библиотека загружается автоматически на этапе загрузки класса; готовые нативные сборки поставляются для Linux, macOS и Windows (x86_64 и ARM64).

<dependency>
  <groupId>fyi.oxide</groupId>
  <artifactId>pdf-oxide</artifactId>
  <version>0.3.69</version>
</dependency>

Все классы находятся в пакете fyi.oxide.pdf и его подпакетах (fyi.oxide.pdf.geometry, fyi.oxide.pdf.text, fyi.oxide.pdf.form и т. д.).

import fyi.oxide.pdf.PdfDocument;
import fyi.oxide.pdf.DocumentEditor;
import fyi.oxide.pdf.Pdf;

Жизненный цикл. PdfDocument, DocumentEditor и Pdf владеют нативной памятью и реализуют AutoCloseable. Всегда используйте try-with-resources. Метод close() идемпотентен; страховка через Cleaner освобождает утёкшие дескрипторы, но на неё нельзя полагаться для своевременной очистки.

Потокобезопасность. Экземпляры документов не потокобезопасны — открывайте по одному на рабочий поток. Статические вспомогательные классы без состояния (MarkdownConverter, PdfValidator, PdfPolicy) потокобезопасны.

Описание Rust API см. в Справочнике Rust API. Описание Python API см. в Справочнике Python API.


PdfDocument

Основная точка входа для чтения PDF — открытие, извлечение, рендеринг и преобразование. Реализует AutoCloseable.

import fyi.oxide.pdf.PdfDocument;
import java.nio.file.Paths;

try (PdfDocument doc = PdfDocument.open(Paths.get("invoice.pdf"))) {
    System.out.println(doc.extractText(0));
}

Открытие (статические фабричные методы)

static PdfDocument open(Path path)

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

static PdfDocument open(String path)

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

static PdfDocument open(byte[] bytes)

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

static PdfDocument open(Path path, String password)

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

static PdfDocument open(String path, String password)

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

static PdfDocument open(byte[] bytes, String password)

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

static PdfDocument open(InputStream stream)

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

Одноразовые статические помощники

static String extractText(String path)

Открыть, извлечь весь текст и закрыть за один вызов (строка с путём).

static String extractText(Path path)

Открыть, извлечь весь текст и закрыть за один вызов (Path).

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

boolean authenticate(String password)

Аутентифицировать зашифрованный PDF после открытия; возвращает true при успехе.

boolean authenticate(byte[] password)

Аутентифицировать, передав пароль в виде набора байтов.

Информация о документе

int pageCount()

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

boolean isOpen()

Вернуть true, если дескриптор документа всё ещё открыт.

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

String extractText(int pageIndex)

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

String extractTextAuto(int pageIndex)

Извлечь текст со страницы, автоматически переключаясь на OCR для отсканированных страниц.

String extractStructured(int page)

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

Преобразование

String toMarkdown()

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

String toMarkdown(int pageIndex)

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

String toHtml()

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

String toHtml(int pageIndex)

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

Доступ к DOM

PdfPage page(int index)

Вернуть ленивый дескриптор PdfPage для заданного индекса (с нуля).

Рендеринг

byte[] render(int pageIndex)

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

byte[] render(int pageIndex, int dpi)

Отрендерить страницу в байты PNG с заданным DPI.

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

void close()

Освободить нижележащий нативный дескриптор. Идемпотентно.


DocumentEditor

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

import fyi.oxide.pdf.DocumentEditor;

try (DocumentEditor editor = DocumentEditor.open("form.pdf")) {
    editor.setFormField("name", "Jane Doe")
          .setFormField("subscribe", true)
          .saveTo(Paths.get("filled.pdf"));
}

Открытие (статические фабричные методы)

static DocumentEditor open(Path path)

Открыть PDF для редактирования из Path.

static DocumentEditor open(String path)

Открыть PDF для редактирования по строке с путём.

static DocumentEditor open(byte[] bytes)

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

Поля форм

DocumentEditor setFormField(String name, String value)

Задать значение текстового поля или поля выбора по имени; возвращает this.

DocumentEditor setFormField(String name, boolean checked)

Задать значение флажка или переключателя по имени; возвращает this.

Редактирование (redaction)

DocumentEditor addRedaction(int pageIndex, BBox region)

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

int redactionCount(int pageIndex)

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

int redactionCount()

Вернуть общее количество ожидающих скрытий по всему документу.

RedactResult applyRedactionsDestructive()

Применить все скрытия из очереди, безвозвратно удалив скрытое содержимое; возвращает RedactResult.

Метаданные

DocumentEditor scrubMetadata()

Удалить сведения о документе и метаданные XMP; возвращает this.

Сохранение

byte[] save()

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

void saveTo(Path out)

Записать отредактированный документ в файл (полная перезапись).

byte[] saveIncremental()

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

void saveIncrementalTo(Path out)

Записать инкрементальное обновление в файл.

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

boolean isOpen()
void close()

Проверить, открыт ли редактор, и освободить его нативный дескриптор.


Pdf

Создание новых PDF из Markdown, HTML или изображений и разбиение существующих PDF. Реализует AutoCloseable.

import fyi.oxide.pdf.Pdf;

try (Pdf pdf = Pdf.fromMarkdown("# Report\n\nGenerated by PDF Oxide.")) {
    pdf.saveTo(Paths.get("report.pdf"));
}

Создание (статические фабричные методы)

static Pdf fromMarkdown(String markdown)

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

static Pdf fromHtml(String html)

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

static Pdf fromImages(List<byte[]> images)

Создать многостраничный PDF, по одной странице на изображение (байты JPEG/PNG).

Разбиение

List<BookmarkSegment> planSplitByBookmarks(SplitByBookmarksOptions opts)

Вычислить план BookmarkSegment для разбиения по уровню закладок без записи результата.

List<byte[]> splitByBookmarks(SplitByBookmarksOptions opts)

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

static int planSplitByBookmarksCount(byte[] sourcePdf, int level)

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

static byte[][] splitByBookmarksFromBytes(byte[] sourcePdf, int level)

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

Сохранение и жизненный цикл

byte[] save()

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

void saveTo(Path out)

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

boolean isOpen()
void close()

Проверить, открыт ли дескриптор, и освободить нативные ресурсы.


AutoExtractor

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

import fyi.oxide.pdf.AutoExtractor;

try (PdfDocument doc = PdfDocument.open("scan.pdf")) {
    AutoExtractor extractor = AutoExtractor.balanced(doc);
    AutoResult result = extractor.extractDocument();
    System.out.println(result.text());
}

Конструирование (статические фабричные методы)

static AutoExtractor of(PdfDocument doc)

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

static AutoExtractor of(PdfDocument doc, AutoExtractConfig config)

Создать экстрактор с явной AutoExtractConfig.

static AutoExtractor fast(PdfDocument doc)

Создать экстрактор, настроенный на скорость (сначала текстовый слой).

static AutoExtractor balanced(PdfDocument doc)

Создать экстрактор со сбалансированным пресетом скорости и точности.

static AutoExtractor highFidelity(PdfDocument doc)

Создать экстрактор, настроенный на максимальную точность (агрессивный OCR).

Извлечение

String extractText()

Извлечь простой текст по всему документу.

String extractTextForPage(int pageIndex)

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

AutoResult extractDocument()

Выполнить полное адаптивное извлечение по документу; возвращает AutoResult.

AutoResult extractAutoDocument()

Псевдоним extractDocument(), возвращающий полный результат по документу.

AutoResult extractPage(int pageIndex)

Выполнить адаптивное извлечение для одной страницы.

AutoResult extractAutoPage(int pageIndex)

Псевдоним extractPage() для одной страницы.

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

ClassifyResult classifyDocument()

Классифицировать каждую страницу без извлечения; возвращает ClassifyResult.

ClassifyResult classifyPage(int pageIndex)

Классифицировать одну страницу.

Вывод в JSON

String extractDocumentJson()

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

String extractPageJson(int pageIndex)

Извлечь страницу и сериализовать результат в JSON.

Аксессоры

PdfDocument document()

Вернуть нижележащий PdfDocument.

AutoExtractConfig config()

Вернуть активную конфигурацию.


MarkdownConverter

Статические вспомогательные методы без состояния и потокобезопасные для преобразования в Markdown и HTML.

static String toMarkdown(PdfDocument doc, int pageIndex)

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

static String toMarkdown(PdfDocument doc)

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

static String toHtml(PdfDocument doc, int pageIndex)

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

static String toHtml(PdfDocument doc)

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


PdfSigner

Цифровая подпись и проверка с использованием хранилища ключей PKCS#12.

import fyi.oxide.pdf.PdfSigner;
import fyi.oxide.pdf.signature.SignOptions;

PdfSigner signer = PdfSigner.fromPkcs12(Paths.get("cert.p12"), "keystore-pw");
byte[] signed = signer.sign(pdfBytes, SignOptions.builder().withReason("Approved").build());
static PdfSigner fromPkcs12(Path keystore, String password)

Загрузить подписывающий объект из файла хранилища ключей PKCS#12.

static PdfSigner fromPkcs12(byte[] keystoreBytes, String password)

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

byte[] sign(byte[] pdf, SignOptions opts)

Подписать байты PDF настроенным сертификатом и SignOptions; возвращает подписанный PDF.

boolean verify(byte[] pdf)

Проверить подписи, встроенные в PDF; возвращает true, если они действительны.

static SignatureLevel classifyLevel(byte[] pdf)

Определить уровень подписи PAdES у подписанного PDF; возвращает SignatureLevel.


PdfValidator

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

static boolean isPdfA(PdfDocument doc, PdfALevel level)

Быстрая логическая проверка соответствия PDF/A заданному уровню.

static boolean isPdfUa(PdfDocument doc, PdfUaLevel level)

Быстрая логическая проверка соответствия PDF/UA заданному уровню.

static ValidationResult validatePdfA(PdfDocument doc, PdfALevel level)

Проверить соответствие уровню PDF/A; возвращает ValidationResult со списком нарушений.

static ValidationResult validatePdfX(PdfDocument doc, PdfXLevel level)

Проверить соответствие уровню PDF/X.

static ValidationResult validatePdfUa(PdfDocument doc, PdfUaLevel level)

Проверить соответствие уровню PDF/UA.


PdfPolicy

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

static PolicyMode current()

Вернуть текущий активный режим политики.

static void set(PolicyMode mode)

Установить общесистемный режим политики.

static PolicyMode compat()

Вернуть константу разрешающего режима совместимости.

static PolicyMode strict()

Вернуть константу строгого режима.

static PolicyMode fipsStrict()

Вернуть константу строгого режима FIPS.


PdfPage

Ленивый дескриптор страницы, возвращаемый PdfDocument.page(int). Свойства обращаются к родительскому документу при доступе.

PdfDocument parent()

Вернуть владеющий документ.

int index()

Вернуть индекс страницы (с нуля).

BBox mediaBox()

Вернуть MediaBox страницы в виде BBox.

BBox cropBox()

Вернуть CropBox страницы.

double width()
double height()

Вернуть ширину и высоту страницы в пунктах PDF.

int rotation()

Вернуть поворот страницы в градусах (0, 90, 180, 270).

String text()

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

String text(BBox region)

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

List<TextWord> words()

Вернуть текст по словам с ограничивающими прямоугольниками (TextWord).

List<TextLine> lines()

Вернуть текст по строкам (TextLine).

List<TextChar> chars()

Вернуть данные по отдельным символам (TextChar).


Геометрические типы

BBox

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

BBox(double x0, double y0, double x1, double y1)
double x0()
double y0()
double x1()
double y1()
double width()
double height()

Rect

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

Rect(double x, double y, double width, double height)
double x()
double y()
double width()
double height()
BBox toBBox()

Point

Точка в двумерном пространстве.

Point(double x, double y)
double x()
double y()

Color

8-битный цвет RGBA.

Color(int r, int g, int b, int a)
Color(int r, int g, int b)
int r()
int g()
int b()
int a()

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

TextChar

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

TextChar(int codepoint, BBox bbox, float confidence)
int codepoint()
BBox bbox()
float confidence()
String asString()

TextWord

Слово, ограниченное пробелами, с границами и уверенностью.

TextWord(String text, BBox bbox, float confidence)
String text()
BBox bbox()
float confidence()

TextLine

Строка текста, составленная из слов.

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

TextSpan

Фрагмент текста с одинаковым стилем.

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

TextStyle

Метаданные шрифта и стиля для спана.

TextStyle(String font, double size, Color color, boolean bold, boolean italic)
double size()
Color color()
boolean bold()
boolean italic()

Типы таблиц

Table

Обнаруженная таблица с сеткой ячеек.

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

TableCell

Отдельная ячейка, включая информацию об объединении.

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

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

ExtractedImage

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

ExtractedImage(byte[] bytes, ImageFormat format, BBox bbox, int width, int height)
byte[] bytes()
ImageFormat format()
BBox bbox()
int width()
int height()

ImageFormat (enum)

JPEG, PNG, CCITT, RAW.


Типы поиска

SearchOptions

Параметры поиска, настраиваемые через builder.

boolean caseSensitive()
boolean wholeWord()
boolean regex()
Optional<Integer> maxResults()
static SearchOptions.Builder builder()

Builder: withCaseSensitive(boolean), withWholeWord(boolean), withRegex(boolean), withMaxResults(Integer), withMaxResults(int), build().

SearchResult

Полный результат запроса.

SearchResult(String query, List<SearchMatch> matches)
String query()
List<SearchMatch> matches()
int count()
boolean isEmpty()

SearchMatch

Одно совпадение со страницей и местоположением.

SearchMatch(int pageIndex, BBox bbox, String text)
int pageIndex()
BBox bbox()
String text()

Типы форм

FormField

Поле AcroForm.

FormField(String name, FormFieldType type, String value, BBox bbox, int pageIndex)
String name()
FormFieldType type()
Optional<String> value()
Optional<BBox> bbox()
int pageIndex()

FormFieldType (enum)

TEXT, CHECKBOX, RADIO, CHOICE.


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

Annotation

Аннотация на странице.

Annotation(AnnotationType type, int pageIndex, BBox bbox, String contents, String uri)
AnnotationType type()
int pageIndex()
BBox bbox()
Optional<String> contents()
Optional<String> uri()

AnnotationType (enum)

HIGHLIGHT, TEXT, LINK, STAMP, UNDERLINE, STRIKEOUT, SQUIGGLY, FREE_TEXT, LINE, SQUARE, CIRCLE, FILE_ATTACHMENT.


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

DocumentInfo

Стандартные поля словаря информации о документе.

Optional<String> title()
Optional<String> author()
Optional<String> subject()
Optional<String> keywords()
Optional<String> creator()
Optional<String> producer()
Optional<String> creationDate()
Optional<String> modificationDate()

XmpMetadata

Сырой пакет метаданных XMP.

XmpMetadata(String xml)
String xml()
boolean isEmpty()

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

AutoExtractConfig

Неизменяемая конфигурация для AutoExtractor, создаваемая через builder.

Optional<ExtractMode> mode()
Optional<List<Integer>> forceOcrPages()
Optional<Double> minOcrConfidence()
Optional<List<String>> ocrLanguages()
Optional<List<String>> passwords()
Optional<Double> topMarginFraction()
Optional<Double> bottomMarginFraction()
Optional<Boolean> allowSingleColumnTables()
Optional<Boolean> ocrInlineImages()
Optional<String> cancelToken()
static AutoExtractConfig.Builder builder()
AutoExtractConfig.Builder toBuilder()

Методы Builder: withMode(ExtractMode), withForceOcrPages(List<Integer>), withMinOcrConfidence(Double), withOcrLanguages(List<String>), withOcrLanguages(String...), withPasswords(List<String>), withPasswords(String...), withTopMarginFraction(Double), withTopMarginFraction(double), withBottomMarginFraction(Double), withBottomMarginFraction(double), withAllowSingleColumnTables(Boolean), withAllowSingleColumnTables(boolean), withOcrInlineImages(Boolean), withOcrInlineImages(boolean), withCancelToken(String), build().

AutoResult

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

String text()
Optional<String> markdown()
Optional<String> html()
ExtractReason reason()
double confidence()
boolean ocrUsed()
List<RegionResult> regions()
List<Integer> pagesNeedingOcr()

RegionResult

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

int pageIndex()
BBox bbox()
String text()
ExtractReason reason()
double confidence()
boolean ocrUsed()
Optional<Table> table()

ClassifyResult

Результат классификации страниц.

List<PageClass> pages()
List<Integer> pagesNeedingOcr()
List<Integer> pagesWithChart()
List<Integer> pagesEncrypted()

ExtractMode (enum)

TEXT_ONLY, AUTO.

PageClass (enum)

TEXT_LAYER, SCANNED, MIXED.

ExtractReason (enum)

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.


Типы подписей

SignOptions

Параметры подписания для PdfSigner, создаваемые через builder.

SignatureLevel level()
Optional<String> reason()
Optional<String> location()
Optional<String> contactInfo()
Optional<String> tsaUrl()
static SignOptions.Builder builder()

Builder: withLevel(SignatureLevel), withReason(String), withLocation(String), withContactInfo(String), withTsaUrl(String), build().

SignatureLevel (enum)

Базовые уровни PAdES: B_B (базовый), B_T (с доверенной меткой времени).


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

SplitByBookmarksOptions

Параметры разбиения по закладкам, создаваемые через builder.

int level()
Optional<String> filenamePrefix()
static SplitByBookmarksOptions.Builder builder()

Builder: withLevel(int), withFilenamePrefix(String), build().

BookmarkSegment

Запланированный выходной сегмент при разбиении по закладкам.

BookmarkSegment(String title, int firstPage, int lastPage, String filename)
String title()
int firstPage()
int lastPage()
String filename()

Типы редактирования (redaction)

RedactResult

Результат DocumentEditor.applyRedactionsDestructive().

RedactResult(int regionsApplied, boolean oracleVerified)
int regionsApplied()
boolean oracleVerified()

Типы соответствия стандартам

ValidationResult

Результат проверки PdfValidator.

ValidationResult(boolean valid, List<ValidationViolation> violations)
boolean valid()
List<ValidationViolation> violations()

ValidationViolation

Одно нарушение соответствия.

ValidationViolation(String ruleId, String description, Integer pageIndex)
String ruleId()
String description()
Optional<Integer> pageIndex()

PdfALevel (enum)

A_1B, A_1A, A_2B, A_2A, A_2U, A_3B, A_3A, A_3U, A_4, A_4E.

PdfXLevel (enum)

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.

PdfUaLevel (enum)

UA_1, UA_2 — каждый предоставляет int code().


Типы политики

PolicyMode (enum)

COMPAT, STRICT.

SecurityPolicy

Политика безопасности для отдельной операции, создаваемая через builder.

PolicyMode mode()
List<String> additionalAllow()
List<String> additionalDeny()
static SecurityPolicy.Builder builder()

Builder: withMode(PolicyMode), allow(String algId), deny(String algId), build().


Типы рендеринга

PixelFormat (enum)

RGBA_8888, RGB_888, GRAY_8.


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

Все специфичные для PDF сбои выбрасывают PdfException (непроверяемое RuntimeException) или один из его подклассов. Каждое исключение несёт PdfErrorKind kind().

import fyi.oxide.pdf.PdfDocument;
import fyi.oxide.pdf.exception.PdfException;

try (PdfDocument doc = PdfDocument.open("file.pdf")) {
    String text = doc.extractText(0);
} catch (PdfException e) {
    System.err.println(e.kind() + ": " + e.getMessage());
}

PdfException

PdfException(String message)
PdfException(PdfErrorKind kind, String message)
PdfException(PdfErrorKind kind, String message, Throwable cause)
PdfErrorKind kind()

Подклассы

Исключение Выбрасывается, когда
PdfParseException Файл повреждён или не является корректным PDF
PdfEncryptedException PDF зашифрован, а пароль не передан или неверен
PdfPermissionException Запрошенная операция запрещена правами доступа документа
PdfIoException Произошла нижележащая ошибка ввода-вывода
PdfOcrUnavailableException Запрошен OCR, но OCR-бэкенд недоступен
PdfSignatureException Операция подписания или проверки завершилась неудачно
PdfInvalidStateException Операция вызвана на закрытом или недопустимом дескрипторе
PdfUnsupportedException Запрошенная возможность не поддерживается

PdfErrorKind (enum)

PARSE, ENCRYPTED, PERMISSION, IO, OCR_UNAVAILABLE, SIGNATURE, INVALID_STATE, UNSUPPORTED.


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

import fyi.oxide.pdf.PdfDocument;
import fyi.oxide.pdf.DocumentEditor;
import fyi.oxide.pdf.Pdf;
import fyi.oxide.pdf.AutoExtractor;
import fyi.oxide.pdf.auto.AutoResult;
import java.nio.file.Paths;

public class Example {
    public static void main(String[] args) throws Exception {
        // --- Extraction ---
        try (PdfDocument doc = PdfDocument.open(Paths.get("input.pdf"))) {
            System.out.println("Pages: " + doc.pageCount());
            for (int i = 0; i < doc.pageCount(); i++) {
                System.out.println(doc.extractText(i));
            }
            String markdown = doc.toMarkdown();

            // Adaptive extraction with OCR fallback
            AutoResult auto = AutoExtractor.balanced(doc).extractDocument();
            System.out.println("OCR used: " + auto.ocrUsed());
        }

        // --- Creation ---
        try (Pdf pdf = Pdf.fromMarkdown("# Report\n\nGenerated by PDF Oxide.")) {
            pdf.saveTo(Paths.get("report.pdf"));
        }

        // --- Editing ---
        try (DocumentEditor editor = DocumentEditor.open("form.pdf")) {
            editor.setFormField("name", "Jane Doe")
                  .setFormField("subscribe", true)
                  .scrubMetadata()
                  .saveTo(Paths.get("filled.pdf"));
        }
    }
}

Other Language Bindings

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

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