Skip to content

Referência da API PHP

A PDF Oxide oferece um binding em PHP puro, construído sobre a extensão FFI nativa do PHP. O código PHP é uma camada fina sobre a mesma cdylib libpdf_oxide usada pelos bindings de Python, Node, Go, C#, Ruby e Java.

composer require oxide/pdf-oxide

Todas as classes ficam sob o namespace PdfOxide\. É necessário PHP 8.2+ com ext-ffi habilitado. O hook de pós-instalação do Composer baixa a biblioteca nativa pré-compilada correspondente; defina PDF_OXIDE_CDYLIB_PATH para apontar para uma build personalizada, ou PDF_OXIDE_SKIP_DOWNLOAD=1 para pular o download.

Para a API Rust, consulte a Referência da API Rust. Para a API Python, consulte a Referência da API Python. Para a API JavaScript, consulte a Referência da API JavaScript (Node.js) ou a Referência da API JavaScript (WASM).

O binding expõe 10 classes:

Classe Finalidade
PdfOxide\PdfDocument Abrir, ler, extrair e iterar páginas de PDFs
PdfOxide\Pdf Criar PDFs (Markdown para PDF, HTML para PDF), versão, prefetch de modelos
PdfOxide\PdfPage Visão leve por página
PdfOxide\MarkdownConverter Conversão estática para Markdown / HTML / texto puro
PdfOxide\AutoExtractor Extração com motivo tipado e classificação de páginas
PdfOxide\AutoExtractResult Objeto de valor somente leitura, resultado de AutoExtractor
PdfOxide\DocumentEditor Editar, limpar metadados, redação destrutiva, salvar
PdfOxide\PdfSigner Assinatura PAdES B-B / B-T / B-LT / B-LTA
PdfOxide\PdfValidator Verificações de conformidade PDF/A, PDF/UA e PDF/X
PdfOxide\PdfPolicy Política de governança criptográfica global do processo, definida uma única vez

PdfDocument

A classe principal para abrir, ler e extrair arquivos PDF.

use PdfOxide\PdfDocument;

Construtores / Métodos de fábrica

PdfDocument::open(string $path): self

Abre um PDF a partir de um caminho de arquivo.

PdfDocument::openBytes(string $bytes): self

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

PdfDocument::extractTextOnce(string $path): string

Abre um arquivo, extrai todo o texto em uma única chamada e libera o handle.

Informações do documento

$doc->pageCount(): int

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

$doc->version(): array

Retorna a versão do PDF como um array de inteiros [major, minor].

$doc->hasStructureTree(): bool

Verifica se o documento é um PDF marcado (Tagged PDF) com árvore de estrutura.

$doc->hasFormFields(): bool

Verifica se o documento contém campos de formulário AcroForm.

$doc->hasSignatures(): bool

Verifica se o documento contém assinaturas digitais.

$doc->getSourcePath(): ?string

Retorna o caminho do arquivo de origem a partir do qual o documento foi aberto, ou null para documentos carregados a partir de bytes.

Extração de texto

$doc->extractText(int $pageIndex): string

Extrai texto puro de uma única página com índice baseado em zero.

$doc->extractStructured(int $page): array

Extrai o conteúdo estruturado da página (spans, caracteres e dimensões) como um array associativo.

$doc->extractTextAuto(int $pageIndex): string

Extrai texto de uma página usando seleção automática entre texto nativo e OCR.

Conversão

$doc->toMarkdown(int $pageIndex = 0): string

Converte uma única página para Markdown.

$doc->toMarkdownAll(): string

Converte o documento inteiro para Markdown.

$doc->toHtml(int $pageIndex = 0): string

Converte uma única página para HTML.

Acesso a páginas

$doc->page(int $index): PdfPage

Retorna uma visão leve PdfPage para o índice baseado em zero informado.

$doc->pages(): array

Retorna todas as páginas como um array de objetos PdfPage.

$doc->pagesIter(): \Generator

Itera de forma preguiçosa sobre as páginas, produzindo uma PdfPage por vez.

Ciclo de vida

$doc->isOpen(): bool

Retorna se o handle nativo ainda está aberto.

$doc->close(): void

Libera o handle nativo. Também é chamado automaticamente por __destruct().

$doc->getHandle(): CData

Retorna o handle FFI bruto (uso avançado / interoperabilidade).


Pdf

Cria novos PDFs a partir de conteúdo de origem e dá acesso a helpers de nível de biblioteca.

use PdfOxide\Pdf;

Métodos de fábrica

Pdf::fromMarkdown(string $markdown): self

Cria um PDF a partir de conteúdo Markdown.

Pdf::fromHtml(string $html): self

Cria um PDF a partir de conteúdo HTML.

Pdf::fromText(string $text): self

Cria um PDF a partir de texto puro.

Salvando

$pdf->save(): string

Renderiza o PDF e retorna seus bytes como uma string.

$pdf->saveTo(string $path): void

Renderiza o PDF e o grava em um caminho de arquivo.

Helpers de biblioteca

Pdf::version(): string

Retorna a string de versão da biblioteca nativa subjacente.

Pdf::prefetchAvailable(): bool

Retorna se o prefetch de modelos de OCR está disponível nesta build.

Pdf::prefetchModels(array $languages): string

Faz o prefetch dos modelos de OCR para os códigos de idioma informados; retorna uma string de status.

Pdf::VERSION  // string constant, e.g. "0.3.69"

Ciclo de vida

$pdf->isOpen(): bool
$pdf->close(): void
$pdf->getHandle(): CData

Inspeciona, libera ou acessa o handle nativo bruto.


PdfPage

Uma visão leve por página retornada por PdfDocument::page(), pages() ou pagesIter().

use PdfOxide\PdfPage;

Métodos

$page->parent(): PdfDocument

Retorna o PdfDocument proprietário.

$page->index(): int

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

$page->text(): string

Extrai texto puro desta página.

$page->textAuto(): string

Extrai texto desta página usando seleção automática entre texto nativo e OCR.

$page->toMarkdown(): string

Converte esta página para Markdown.

$page->toHtml(): string

Converte esta página para HTML.

$page->__toString(): string

Retorna o texto puro da página quando o objeto é usado em contexto de string.


MarkdownConverter

Helpers estáticos para converter um PdfDocument aberto em Markdown, HTML ou texto puro.

use PdfOxide\MarkdownConverter;

Métodos

MarkdownConverter::toMarkdown(PdfDocument $doc, int $pageIndex): string

Converte uma única página para Markdown.

MarkdownConverter::toMarkdownAll(PdfDocument $doc): string

Converte o documento inteiro para Markdown.

MarkdownConverter::toHtml(PdfDocument $doc, int $pageIndex): string

Converte uma única página para HTML.

MarkdownConverter::toPlainText(PdfDocument $doc, int $pageIndex): string

Converte uma única página para texto puro.


AutoExtractor

Extração com motivo tipado, seleção entre texto nativo e OCR e classificação do documento por página.

use PdfOxide\AutoExtractor;

Constantes

Constante Valor Significado
AutoExtractor::MODE_AUTO 0 Seleciona automaticamente texto nativo ou OCR
AutoExtractor::MODE_TEXT_ONLY 1 Apenas texto nativo, nunca OCR
AutoExtractor::MODE_FORCE_OCR 2 Sempre executa OCR

Métodos de fábrica

AutoExtractor::of(PdfDocument $doc, int $mode = self::MODE_AUTO): self

Cria um extrator sobre um documento com um modo explícito.

AutoExtractor::fast(PdfDocument $doc): self

Cria um extrator otimizado para velocidade.

AutoExtractor::balanced(PdfDocument $doc): self

Cria um extrator que equilibra velocidade e fidelidade.

AutoExtractor::highFidelity(PdfDocument $doc): self

Cria um extrator otimizado para máxima fidelidade.

Extração

$ex->extractText(): string

Extrai texto do documento inteiro.

$ex->extractTextForPage(int $pageIndex): string

Extrai texto de uma única página.

$ex->extractAutoPage(int $pageIndex): AutoExtractResult

Extrai uma única página, retornando um AutoExtractResult tipado com motivo e confiança.

$ex->extractAutoDocument(): AutoExtractResult

Extrai o documento inteiro, retornando um AutoExtractResult tipado.

$ex->extractPageJson(int $pageIndex): string

Extrai uma única página como uma string JSON.

$ex->extractDocumentJson(): string

Extrai o documento inteiro como uma string JSON.

Classificação

$ex->classifyPageKind(int $pageIndex): string

Classifica uma única página (por exemplo, text_layer, scanned, image_text, mixed, empty).

$ex->classifyDocumentKinds(): array

Classifica todas as páginas, retornando um array de strings de tipo de página.

Acessores

$ex->document(): PdfDocument

Retorna o PdfDocument subjacente.

$ex->mode(): int

Retorna a constante do modo de extração ativo.


AutoExtractResult

Objeto de valor somente leitura retornado por AutoExtractor::extractAutoPage() e extractAutoDocument().

use PdfOxide\AutoExtractResult;

Propriedades

Propriedade Tipo Descrição
text string Texto extraído
reason string Uma das constantes REASON_*
confidence float Confiança em [0.0, 1.0]
ocrUsed bool Se o OCR foi executado para este resultado
regions array Detalhamento rico por região
pagesNeedingOcr array Índices de páginas que ainda precisam de OCR

Constantes

Constante de motivo Valor
REASON_OK ok
REASON_NATIVE_TEXT_HIGH_CONFIDENCE native_text_high_confidence
REASON_NO_TEXT_LAYER_PRESENT no_text_layer_present
REASON_OCR_REQUESTED_BUT_UNAVAILABLE ocr_requested_but_unavailable
REASON_OCR_LOW_CONFIDENCE_FALLBACK ocr_low_confidence_fallback
REASON_IMAGE_TABLE_RECONSTRUCTED image_table_reconstructed
REASON_EMPTY empty
Constante de tipo Valor
KIND_TEXT_LAYER text_layer
KIND_SCANNED scanned
KIND_IMAGE_TEXT image_text
KIND_MIXED mixed
KIND_EMPTY empty

Métodos

$result->isOk(): bool

Retorna se a extração foi bem-sucedida sem degradação.

$result->isOcrFallback(): bool

Retorna se um caminho de fallback de OCR indisponível ou de baixa confiança foi acionado.


DocumentEditor

Edita um PDF in place: limpa metadados, aplica redações destrutivas, define o producer e salva.

use PdfOxide\DocumentEditor;

Construtor

DocumentEditor::open(string $path): self

Abre um PDF para edição.

Redação

$editor->addRedaction(int $pageIndex, float $x1, float $y1, float $x2, float $y2): self

Enfileira uma região retangular de redação (coordenadas em pontos PDF). Fluente — retorna $this.

$editor->redactionCount(int $pageIndex): int

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

$editor->applyRedactionsDestructive(bool $scrubMetadata = true): int

Aplica permanentemente todas as redações enfileiradas (falha fechando em caso de erro). Retorna o número aplicado; opcionalmente limpa os metadados.

Metadados

$editor->scrubMetadata(): self

Remove os metadados do documento. Fluente — retorna $this.

$editor->getProducer(): string

Retorna a string Producer do documento.

$editor->setProducer(string $producer): self

Define a string Producer do documento. Fluente — retorna $this.

Informações do documento

$editor->version(): array

Retorna a versão do PDF como um array [major, minor].

$editor->pageCount(): int

Retorna o número de páginas.

$editor->isModified(): bool

Retorna se o documento tem modificações não salvas.

$editor->sourcePath(): string

Retorna o caminho do arquivo de origem.

Salvando

$editor->saveTo(string $path): void

Grava o PDF editado em um caminho de arquivo.

$editor->save(): string

Renderiza o PDF editado e retorna seus bytes como uma string.

Ciclo de vida

$editor->isOpen(): bool
$editor->close(): void
$editor->getHandle(): CData

Inspeciona, libera ou acessa o handle nativo bruto.


PdfSigner

Assinatura digital PAdES com os níveis de conformidade B-B, B-T, B-LT e B-LTA.

use PdfOxide\PdfSigner;

Constantes

Constante Valor Nível
PdfSigner::LEVEL_B_B 0 PAdES B-B (baseline)
PdfSigner::LEVEL_B_T 1 PAdES B-T (com timestamp)
PdfSigner::LEVEL_B_LT 2 PAdES B-LT (longo prazo)
PdfSigner::LEVEL_B_LTA 3 PAdES B-LTA (longo prazo com timestamp de arquivamento)

Construtor / Fábrica

PdfSigner::fromPkcs12(string $keystorePath, string $password): self

Cria um signer a partir de um keystore PKCS#12 (.p12 / .pfx).

Assinatura

$signer->sign(
    string $pdfBytes,
    string|int $level = self::LEVEL_B_B,
    ?string $tsaUrl = null,
    ?string $reason = null,
    ?string $location = null,
): string

Assina os bytes do PDF e retorna os bytes do PDF assinado. Níveis acima de B-B exigem uma tsaUrl. $level aceita o ordinal LEVEL_B_* ou uma tag curta ('b', 't', 'lt', 'lta').

PdfSigner::signWithHandle(
    string $pdfBytes,
    CData $certificateHandle,
    string|int $level,
    ?string $tsaUrl = null,
    ?string $reason = null,
    ?string $location = null,
): string

Conveniência estática: assina sem construir uma instância de signer gerenciada. O chamador mantém a propriedade de $certificateHandle.

Verificação

PdfSigner::verify(string $pdfBytes): bool

Retorna se os bytes do PDF carregam um dicionário de assinatura e um byte range.

Ciclo de vida

$signer->isOpen(): bool
$signer->close(): void

Inspeciona ou libera as credenciais de assinatura.


PdfValidator

Verificações estáticas de conformidade PDF/A, PDF/UA e PDF/X contra um PdfDocument aberto.

use PdfOxide\PdfValidator;

Constantes

Constante PDF/A Valor Constante PDF/UA Valor
PDFA_1B 0 PDFUA_1 1
PDFA_1A 1 PDFUA_2 2
PDFA_2B 2
PDFA_2A 3
PDFA_2U 4
PDFA_3B 5
PDFA_3A 6
PDFA_3U 7

Métodos

PdfValidator::isPdfA(PdfDocument $doc, int $level = self::PDFA_1B): bool

Retorna se o documento está em conformidade com o nível PDF/A informado.

PdfValidator::isPdfUa(PdfDocument $doc, int $level = self::PDFUA_1): bool

Retorna se o documento está em conformidade com o nível PDF/UA informado.

PdfValidator::isPdfX(PdfDocument $doc): bool

Não implementado — o pdf_oxide atualmente não expõe nenhum validador de PDF/X público na ABI C. Chamar este método sempre lança BadMethodCallException.

PdfValidator::validatePdfA(PdfDocument $doc, int $level = self::PDFA_1B): array

Executa uma validação PDF/A completa e retorna um array de resultado estruturado (flag de conformidade mais quaisquer violações).


PdfPolicy

Política de governança criptográfica global do processo, definida uma única vez. Deve ser configurada antes de abrir qualquer PDF.

use PdfOxide\PdfPolicy;

Constantes

Constante Valor
PdfPolicy::COMPAT compat
PdfPolicy::STRICT strict
PdfPolicy::FIPS_STRICT fips_strict

Métodos

PdfPolicy::current(): string

Retorna o modo de política ativo.

PdfPolicy::set(string $mode): void

Define a política global do processo (uma das constantes de política). Definida uma única vez por processo.

PdfPolicy::fipsAvailable(): bool

Retorna se um provedor de criptografia validado por FIPS está disponível.

PdfPolicy::activeProvider(): string

Retorna o nome do provedor de criptografia ativo.

PdfPolicy::compat(): string
PdfPolicy::strict(): string
PdfPolicy::fipsStrict(): string

Acessores de conveniência que retornam a string de modo de política correspondente.


Tratamento de erros

Todos os erros específicos de PDF estendem PdfOxide\Exceptions\PdfException. Subclasses especializadas permitem capturar categorias de falha mais restritas.

use PdfOxide\PdfDocument;
use PdfOxide\Exceptions\PdfException;

try {
    $doc = PdfDocument::open('file.pdf');
    echo $doc->extractText(0);
} catch (PdfException $e) {
    error_log("PDF error: {$e->getMessage()}");
}
Exceção (sob PdfOxide\Exceptions\) Causa
PdfException Classe base para todos os erros de PDF
ParseException PDF malformado ou não analisável
IoException Falha de leitura/gravação de arquivo
NotFoundException Arquivo, página ou objeto ausente
EncryptionException Falha de criptografia / senha
ValidationException Argumento ou entrada inválida
SignatureException Falha de assinatura ou de verificação de assinatura
RedactionException Falha de redação
SearchException Falha de busca
OptimizationException Falha de otimização
ComplianceException Falha de conformidade PDF/A ou PDF/UA
AccessibilityException Falha de acessibilidade / marcação (tagging)
UnsupportedException Recurso ou operação não suportada
InvalidStateException Operação sobre um handle fechado ou inválido
InternalError Erro nativo interno

Exemplo completo

use PdfOxide\PdfDocument;
use PdfOxide\Pdf;
use PdfOxide\AutoExtractor;
use PdfOxide\DocumentEditor;
use PdfOxide\PdfSigner;
use PdfOxide\PdfValidator;

// --- Extraction ---
$doc = PdfDocument::open('input.pdf');
echo $doc->pageCount(), " pages\n";

for ($i = 0; $i < $doc->pageCount(); $i++) {
    echo "Page {$i}: ", strlen($doc->extractText($i)), " chars\n";
}
echo $doc->toMarkdownAll();

// --- Auto-extraction with typed reasons ---
$ex = AutoExtractor::of($doc);
$result = $ex->extractAutoPage(0);
if (!$result->isOk()) {
    error_log("degraded extraction: {$result->reason}");
}
$doc->close();

// --- Creation ---
$pdf = Pdf::fromMarkdown("# Invoice\n\n**Total:** \$42.00\n");
$pdf->saveTo('invoice.pdf');
$pdf->close();

// --- Destructive redaction ---
$editor = DocumentEditor::open('in.pdf');
$editor->addRedaction(0, 100.0, 700.0, 300.0, 720.0);
$editor->applyRedactionsDestructive();
$editor->saveTo('redacted.pdf');
$editor->close();

// --- PAdES B-T signature ---
$signer = PdfSigner::fromPkcs12('certs/sign.p12', 'p12-password');
$signed = $signer->sign(
    pdfBytes: file_get_contents('contract.pdf'),
    level:    PdfSigner::LEVEL_B_T,
    tsaUrl:   'https://freetsa.org/tsr',
    reason:   'Final contract',
);
file_put_contents('signed.pdf', $signed);
$signer->close();

// --- Compliance check ---
$doc = PdfDocument::open('archive.pdf');
var_dump(PdfValidator::isPdfA($doc, PdfValidator::PDFA_2B));
$doc->close();

Other Language Bindings

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

Próximos passos