Skip to content

Referência da API Java

O PDF Oxide oferece bindings Java nativos por meio de uma camada JNI sobre o núcleo em Rust. A biblioteca nativa embutida é carregada automaticamente no momento de carga da classe; binários nativos pré-compilados são distribuídos para Linux, macOS e Windows (x86_64 e ARM64).

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

Todas as classes vivem no pacote fyi.oxide.pdf e em seus subpacotes (fyi.oxide.pdf.geometry, fyi.oxide.pdf.text, fyi.oxide.pdf.form, etc.).

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

Ciclo de vida. PdfDocument, DocumentEditor e Pdf são donos de memória nativa e implementam AutoCloseable. Sempre use try-with-resources. close() é idempotente; um backstop via Cleaner libera handles vazados, mas não se deve depender dele para uma limpeza pontual.

Thread safety. Instâncias de documento não são thread-safe — abra uma por worker. Os helpers estáticos sem estado (MarkdownConverter, PdfValidator, PdfPolicy) são thread-safe.

Para a API Rust, veja a Referência da API Rust. Para a API Python, veja a Referência da API Python.


PdfDocument

O ponto de entrada principal e somente leitura para um PDF — abre, extrai, renderiza e converte. Implementa 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));
}

Abertura (métodos de fábrica estáticos)

static PdfDocument open(Path path)

Abre um PDF a partir de um caminho no sistema de arquivos.

static PdfDocument open(String path)

Abre um PDF a partir de uma string de caminho.

static PdfDocument open(byte[] bytes)

Abre um PDF a partir de bytes em memória (por exemplo, baixados do S3 ou via HTTP).

static PdfDocument open(Path path, String password)

Abre um PDF criptografado a partir de um caminho com uma senha de usuário ou de proprietário.

static PdfDocument open(String path, String password)

Abre um PDF criptografado a partir de uma string de caminho com uma senha.

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

Abre um PDF criptografado a partir de bytes com uma senha.

static PdfDocument open(InputStream stream)

Abre um PDF lendo todos os bytes de um InputStream.

Helpers estáticos de uma chamada

static String extractText(String path)

Abre, extrai todo o texto e fecha em uma única chamada (string de caminho).

static String extractText(Path path)

Abre, extrai todo o texto e fecha em uma única chamada (Path).

Autenticação

boolean authenticate(String password)

Autentica um PDF criptografado após a abertura; retorna true em caso de sucesso.

boolean authenticate(byte[] password)

Autentica com uma senha em bytes brutos.

Informações do documento

int pageCount()

Retorna o número de páginas do documento.

boolean isOpen()

Retorna true se o handle do documento ainda estiver aberto.

Extração de texto

String extractText(int pageIndex)

Extrai texto puro de uma única página indexada a partir de zero.

String extractTextAuto(int pageIndex)

Extrai texto de uma página, recorrendo automaticamente ao OCR para páginas digitalizadas.

String extractStructured(int page)

Extrai o conteúdo estruturado da página (spans, linhas, layout) como uma string JSON.

Conversão

String toMarkdown()

Converte o documento inteiro para Markdown.

String toMarkdown(int pageIndex)

Converte uma única página para Markdown.

String toHtml()

Converte o documento inteiro para HTML.

String toHtml(int pageIndex)

Converte uma única página para HTML.

Acesso ao DOM

PdfPage page(int index)

Retorna um handle lazy de PdfPage para o índice baseado em zero informado.

Renderização

byte[] render(int pageIndex)

Renderiza uma página para bytes PNG no DPI padrão.

byte[] render(int pageIndex, int dpi)

Renderiza uma página para bytes PNG no DPI informado.

Ciclo de vida

void close()

Libera o handle nativo subjacente. Idempotente.


DocumentEditor

Sessão de edição mutável sobre um PDF: preenchimento de formulários, redação, limpeza de metadados e salvamento. Os mutadores retornam this para encadeamento fluente. Implementa 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"));
}

Abertura (métodos de fábrica estáticos)

static DocumentEditor open(Path path)

Abre um PDF para edição a partir de um Path.

static DocumentEditor open(String path)

Abre um PDF para edição a partir de uma string de caminho.

static DocumentEditor open(byte[] bytes)

Abre um PDF para edição a partir de bytes em memória.

Campos de formulário

DocumentEditor setFormField(String name, String value)

Define o valor de um campo de formulário de texto ou de escolha pelo nome; retorna this.

DocumentEditor setFormField(String name, boolean checked)

Define um campo de formulário do tipo checkbox / radio pelo nome; retorna this.

Redação

DocumentEditor addRedaction(int pageIndex, BBox region)

Enfileira uma redação sobre uma região retangular de uma página; retorna this.

int redactionCount(int pageIndex)

Retorna o número de redações pendentes em uma página.

int redactionCount()

Retorna o número total de redações pendentes em todo o documento.

RedactResult applyRedactionsDestructive()

Aplica todas as redações enfileiradas, removendo permanentemente o conteúdo coberto; retorna um RedactResult.

Metadados

DocumentEditor scrubMetadata()

Remove as informações do documento e os metadados XMP; retorna this.

Salvamento

byte[] save()

Serializa o documento editado em um novo array de bytes (reescrita completa).

void saveTo(Path out)

Grava o documento editado em um arquivo (reescrita completa).

byte[] saveIncremental()

Serializa usando uma atualização incremental, preservando os bytes originais.

void saveIncrementalTo(Path out)

Grava uma atualização incremental em um arquivo.

Ciclo de vida

boolean isOpen()
void close()

Verifica se o editor está aberto e libera seu handle nativo.


Pdf

Cria novos PDFs a partir de Markdown, HTML ou imagens, e divide PDFs existentes. Implementa AutoCloseable.

import fyi.oxide.pdf.Pdf;

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

Criação (métodos de fábrica estáticos)

static Pdf fromMarkdown(String markdown)

Cria um PDF a partir de conteúdo Markdown.

static Pdf fromHtml(String html)

Cria um PDF a partir de conteúdo HTML.

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

Cria um PDF de várias páginas, uma página por imagem (bytes JPEG/PNG).

Divisão

List<BookmarkSegment> planSplitByBookmarks(SplitByBookmarksOptions opts)

Calcula o plano de BookmarkSegment para divisão em um nível de marcador sem gravar a saída.

List<byte[]> splitByBookmarks(SplitByBookmarksOptions opts)

Divide o PDF no nível de marcador configurado, retornando um array de bytes por segmento.

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

Retorna quantos segmentos uma divisão por nível de marcador produziria, sem abrir um Pdf.

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

Divide os bytes do PDF de origem no nível de marcador informado em uma única chamada estática.

Salvamento e ciclo de vida

byte[] save()

Serializa o PDF em um array de bytes.

void saveTo(Path out)

Grava o PDF em um arquivo.

boolean isOpen()
void close()

Verifica se o handle está aberto e libera os recursos nativos.


AutoExtractor

Extração adaptativa que classifica cada página (camada de texto vs. digitalizada) e aplica OCR onde necessário. Construído a partir de um PdfDocument aberto.

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());
}

Construção (métodos de fábrica estáticos)

static AutoExtractor of(PdfDocument doc)

Cria um extrator com a configuração padrão.

static AutoExtractor of(PdfDocument doc, AutoExtractConfig config)

Cria um extrator com um AutoExtractConfig explícito.

static AutoExtractor fast(PdfDocument doc)

Cria um extrator otimizado para velocidade (camada de texto primeiro).

static AutoExtractor balanced(PdfDocument doc)

Cria um extrator com um preset equilibrado entre velocidade e fidelidade.

static AutoExtractor highFidelity(PdfDocument doc)

Cria um extrator otimizado para máxima fidelidade (OCR agressivo).

Extração

String extractText()

Extrai texto puro de todo o documento.

String extractTextForPage(int pageIndex)

Extrai texto puro de uma única página.

AutoResult extractDocument()

Executa a extração adaptativa completa sobre o documento; retorna um AutoResult.

AutoResult extractAutoDocument()

Alias de extractDocument(), retornando o resultado completo do documento.

AutoResult extractPage(int pageIndex)

Executa a extração adaptativa para uma única página.

AutoResult extractAutoPage(int pageIndex)

Alias de extractPage() para uma única página.

Classificação

ClassifyResult classifyDocument()

Classifica todas as páginas sem extrair; retorna um ClassifyResult.

ClassifyResult classifyPage(int pageIndex)

Classifica uma única página.

Saída JSON

String extractDocumentJson()

Extrai todo o documento e serializa o resultado em JSON.

String extractPageJson(int pageIndex)

Extrai uma página e serializa o resultado em JSON.

Acessadores

PdfDocument document()

Retorna o PdfDocument subjacente.

AutoExtractConfig config()

Retorna a configuração ativa.


MarkdownConverter

Helpers estáticos sem estado e thread-safe para conversão de Markdown e HTML.

static String toMarkdown(PdfDocument doc, int pageIndex)

Converte uma única página para Markdown.

static String toMarkdown(PdfDocument doc)

Converte o documento inteiro para Markdown.

static String toHtml(PdfDocument doc, int pageIndex)

Converte uma única página para HTML.

static String toHtml(PdfDocument doc)

Converte o documento inteiro para HTML.


PdfSigner

Assinatura e verificação digital usando um keystore 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)

Carrega um signatário a partir de um arquivo de keystore PKCS#12.

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

Carrega um signatário a partir de bytes de keystore PKCS#12 em memória.

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

Assina os bytes do PDF com o certificado configurado e SignOptions; retorna o PDF assinado.

boolean verify(byte[] pdf)

Verifica as assinaturas embutidas em um PDF; retorna true se válidas.

static SignatureLevel classifyLevel(byte[] pdf)

Classifica o nível de assinatura PAdES de um PDF assinado; retorna um SignatureLevel.


PdfValidator

Validação de conformidade PDF/A, PDF/X e PDF/UA, sem estado e thread-safe.

static boolean isPdfA(PdfDocument doc, PdfALevel level)

Verificação booleana rápida de conformidade PDF/A em um determinado nível.

static boolean isPdfUa(PdfDocument doc, PdfUaLevel level)

Verificação booleana rápida de conformidade PDF/UA em um determinado nível.

static ValidationResult validatePdfA(PdfDocument doc, PdfALevel level)

Valida contra um nível PDF/A; retorna um ValidationResult com violações.

static ValidationResult validatePdfX(PdfDocument doc, PdfXLevel level)

Valida contra um nível PDF/X.

static ValidationResult validatePdfUa(PdfDocument doc, PdfUaLevel level)

Valida contra um nível PDF/UA.


PdfPolicy

Política de segurança válida para todo o processo, que controla quais algoritmos criptográficos são permitidos. Acessadores estáticos thread-safe.

static PolicyMode current()

Retorna o modo de política atualmente ativo.

static void set(PolicyMode mode)

Define o modo de política para todo o processo.

static PolicyMode compat()

Retorna a constante do modo de compatibilidade permissivo.

static PolicyMode strict()

Retorna a constante do modo estrito.

static PolicyMode fipsStrict()

Retorna a constante do modo FIPS-strict.


PdfPage

Um handle lazy de página retornado por PdfDocument.page(int). As propriedades são despachadas para o documento pai no momento do acesso.

PdfDocument parent()

Retorna o documento proprietário.

int index()

Retorna o índice de página baseado em zero.

BBox mediaBox()

Retorna o MediaBox da página como um BBox.

BBox cropBox()

Retorna o CropBox da página.

double width()
double height()

Retorna a largura e a altura da página em pontos PDF.

int rotation()

Retorna a rotação da página em graus (0, 90, 180, 270).

String text()

Extrai todo o texto puro da página.

String text(BBox region)

Extrai o texto dentro de uma região retangular.

List<TextWord> words()

Retorna o texto por palavra com bounding boxes (TextWord).

List<TextLine> lines()

Retorna o texto por linha (TextLine).

List<TextChar> chars()

Retorna os dados por caractere (TextChar).


Tipos de geometria

BBox

Bounding box imutável e alinhado aos eixos em coordenadas PDF.

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

Rect

Retângulo de posição e tamanho (origem + largura/altura).

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

Point

Um ponto 2-D.

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

Color

Cor RGBA de 8 bits.

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

Tipos de texto

TextChar

Um único caractere decodificado com posição e confiança de OCR.

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

TextWord

Uma palavra delimitada por espaços em branco com limites e confiança.

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

TextLine

Uma linha de texto composta por palavras.

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

TextSpan

Um trecho de texto com estilo idêntico.

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

TextStyle

Metadados de fonte e estilo de um span.

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

Tipos de tabela

Table

Uma tabela detectada com grade de células.

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

TableCell

Uma única célula, incluindo informações de span.

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()

Tipos de imagem

ExtractedImage

Uma imagem raster extraída de uma página.

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.


Tipos de busca

SearchOptions

Parâmetros de busca configurados por 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

O resultado completo de uma consulta.

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

SearchMatch

Uma única ocorrência com página e localização.

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

Tipos de formulário

FormField

Um campo de 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.


Tipos de anotação

Annotation

Uma anotação de página.

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.


Tipos de metadados

DocumentInfo

Campos padrão do dicionário de informações do documento.

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

Pacote bruto de metadados XMP.

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

Tipos de extração automática

AutoExtractConfig

Configuração imutável, construída por builder, para o AutoExtractor.

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()

Métodos do 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

Resultado de uma extração adaptativa.

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

RegionResult

Resultado de extração por região.

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

ClassifyResult

Resultado da classificação de páginas.

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.


Tipos de assinatura

SignOptions

Parâmetros de assinatura construídos por builder para o PdfSigner.

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)

Níveis baseline PAdES: B_B (básico), B_T (com timestamp confiável).


Tipos de divisão

SplitByBookmarksOptions

Opções construídas por builder para divisão baseada em marcadores.

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

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

BookmarkSegment

Um segmento de saída planejado a partir de uma divisão por marcadores.

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

Tipos de redação

RedactResult

Resultado de DocumentEditor.applyRedactionsDestructive().

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

Tipos de conformidade

ValidationResult

Resultado de uma verificação do PdfValidator.

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

ValidationViolation

Uma única violação de conformidade.

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 — cada um expõe int code().


Tipos de política

PolicyMode (enum)

COMPAT, STRICT.

SecurityPolicy

Política de segurança por operação, construída por builder.

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

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


Tipos de renderização

PixelFormat (enum)

RGBA_8888, RGB_888, GRAY_8.


Tratamento de erros

Todas as falhas específicas de PDF lançam PdfException (uma RuntimeException não verificada) ou uma de suas subclasses. Toda exceção carrega um 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()

Subclasses

Exceção Lançada quando
PdfParseException O arquivo está malformado ou não é um PDF válido
PdfEncryptedException O PDF está criptografado e nenhuma senha (ou uma senha inválida) foi fornecida
PdfPermissionException A operação solicitada é negada pelas permissões do documento
PdfIoException Ocorreu um erro de I/O subjacente
PdfOcrUnavailableException O OCR foi solicitado, mas o backend de OCR está indisponível
PdfSignatureException Uma operação de assinatura ou verificação falhou
PdfInvalidStateException Uma operação foi chamada em um handle fechado ou inválido
PdfUnsupportedException Um recurso solicitado não é suportado

PdfErrorKind (enum)

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


Exemplo completo

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

O PDF Oxide oferece bindings nativos para todos os principais ecossistemas: Rust, Python, Node.js, WASM, C#, Golang, PHP, Ruby, C++, Swift, Kotlin, Dart, R, Julia, Zig, Scala, Clojure, Objective-C e Elixir.

Próximos passos