Skip to content

Changelog

Todas as mudanças relevantes do PDF Oxide estão documentadas aqui.


v0.3.38 – 2026-04-22

O DocumentBuilder chega a todos os bindings; AES-256 no caminho de escrita; verificação de assinatura; WASM multi-alvo; backend purego do Go

Paridade da API de escrita em todos os bindings (#384)

  • DocumentBuilder + FluentPageBuilder + EmbeddedFont agora são disponibilizados em Python, Node/TypeScript, C#, Go e WASM, junto com Rust. Construção de múltiplas páginas com suporte completo a CJK / cirílico / grego por meio de fontes embutidas. Encerra o #382 entre as linguagens.
  • 15 métodos de anotação em todos os bindings: link_url / link_page / link_named, highlight, underline, strikeout, squiggly, nota adesiva, carimbo (14 padrão + personalizado), texto livre, watermark (personalizado / DRAFT / CONFIDENTIAL).
  • 5 tipos de widget de AcroForm em todos os bindings: text_field, checkbox, combo_box, radio_group, push_button.
  • Primitivas gráficas em todos os bindings: rect, filled_rect, line.
  • Pipeline HTML+CSSPdf.from_html_css(...) e from_html_css_with_fonts(...) para cascatas com múltiplas fontes em todos os bindings.

Criptografia AES-256 no caminho de escrita (#386)

  • save_encrypted(path, user_pw, owner_pw) / to_bytes_encrypted(user_pw, owner_pw) no DocumentBuilder em todos os bindings.
  • save_with_encryption no Rust para algoritmo + permissões personalizados.

Subconjunto real de fontes (#385 / FONT-3b)

  • As faces CJK agora são embutidas como um subconjunto em vez da face completa. Um PDF de 5 caracteres construído a partir de uma fonte CJK de ~17 MB normalmente fica abaixo de 100 KB. Fluxos de conteúdo, larguras /W e o CMap ToUnicode são re-mapeados para o espaço de GID do subconjunto; o ida e volta do extract_text permanece inalterado.
  • Mudança na API interna de escrita: EmbeddedFont::encode_string / encode_shaped_run retornam Vec<u16> e build_embedded_font_objects retorna um GlyphRemapper que os chamadores passam para ContentStreamBuilder::build_with_remappers. Sem mudança nas APIs de alto nível.

Verificação de assinatura digital (#208, metade da verificação)

  • Signature.verify() e Signature.verify_detached(pdf_bytes) (e equivalentes nativos do binding) em todos os bindings. Verificações de atributos do signatário da RFC 5652 §5.4 + messageDigest da §11.2.
  • RSA-PKCS#1 v1.5 sobre SHA-1 / SHA-256 / SHA-384 / SHA-512 retorna Valid / Invalid. RSA-PSS e ECDSA aparecem como Unknown / UnsupportedFeatureException; os chamadores ainda podem ler o certificado e executar sua própria verificação.
  • Certificate — inspeção DER (subject, issuer, número de série, validade, is_valid) via x509-parsertodos os bindings.
  • Signature — enumerar + inspecionar + .get_certificate()todos os bindings.
  • Timestamp — análise de TSTInfo da RFC 3161 (hora, número de série, política, nome da TSA, algoritmo de hash, message imprint) — todos os bindings.
  • TsaClient — HTTP POST da RFC 3161 com nonce e autenticação HTTP Basic por trás de uma feature tsa-client do Cargo — todos os bindings exceto WASM. Intencionalmente não conectado no WASM (o ureq é incompatível com wasm).
  • Escritores de metadados DocumentEditor::set_producer / set_creation_date.
  • render_page_region e render_page_fit — superfície de renderização recortada e ajustada.
  • Filtragem bicúbica de imagens (paridade com pdf.js #19978) — páginas digitalizadas / de dois níveis com sobreposições mescladas em modo Multiply não colapsam mais sua faixa de tons de cinza na redução de escala.

A assinatura em si (ao contrário da verificação) não está coberta; o #208 permanece aberto para essa metade.

Empacotamento WASM multi-alvo (#392)

  • O pdf-oxide-wasm agora entrega três builds lado a lado com exportações condicionais no package.json: nodejs/, bundler/ (Vite / webpack / Rollup / esbuild / Bun) e web/ (navegadores / Deno / Cloudflare Workers).
  • Corrige o ReferenceError: Can't find variable: __dirname lançado sob bundlers de navegador.
  • Importações por subcaminho (pdf-oxide-wasm/web, /nodejs, /bundler) estão disponíveis para roteamento manual.

Binding do Go — backend purego + instalação no diretório de cache

  • Um segundo backend via ebitengine/purego faz dlopen de libpdf_oxide.{so,dylib,dll} em tempo de execução. Builds com CGO_ENABLED=0 agora funcionam. A seleção do backend é automática — //go:build cgo → API completa de CGo, //go:build !cgo → purego.
  • Superfície do purego: abertura de PdfDocument (caminho / bytes / senha), contagem de páginas, versão, extração de texto / Markdown / HTML / texto simples, fontes, anotações, elementos da página, busca, dimensões da página, logging, além de PdfCreator.FromMarkdown para fixtures de teste.
  • Somente CGo (erro em tempo de compilação sob !cgo): DocumentEditor, DocumentBuilder, códigos de barras, assinaturas, TSA, renderização, OCR, mutação de formulários.
  • Instalador: a nova flag -shared busca o cdylib em vez do staticlib e imprime CGO_ENABLED=0 + PDF_OXIDE_LIB_PATH=… para exportar.
  • O diretório de instalação foi movido para os.UserCacheDir()~/.cache/pdf_oxide (Linux), ~/Library/Caches/pdf_oxide (macOS), %LocalAppData%\pdf_oxide (Windows). Combina com a própria convenção GOCACHE do Go.
  • Os assets de release agora incluem pdf_oxide-go-ffi-shared-<platform>.tar.gz para cada plataforma Tier-1, ao lado dos arquivos staticlib existentes.

Correções de bugs

  • #395 – O RenderPage não levanta mais SignatureException quando uma página contém metadados de campo de assinatura impossíveis de analisar, mas nenhum widget de assinatura interativo. Relatado por @gevorgter.

Agradecimentos

  • @sparkyandrew – #382 (CJK via DocumentBuilder), #385 (subconjunto de fontes).
  • @arthurlassagne – #392 (quebra do build de navegador).
  • @gevorgter – #395 (exceção de assinatura no RenderPage).

v0.3.37 – 2026-04-20

HTML + CSS → PDF (#248) — o primeiro pipeline crível em Rust puro

Nova API — Pdf::from_html_css

let font = std::fs::read("DejaVuSans.ttf")?;
let pdf = Pdf::from_html_css(
    "<h1>Hello</h1><p>World</p>",
    "h1 { color: blue; font-size: 24pt }",
    font,
)?;
pdf.save("out.pdf")?;

Passe HTML + CSS + bytes de fonte, receba de volta um PDF paginado. Rust puro, apenas MIT/Apache (sem dependências transitivas MPL), o ida e volta do extract_text é byte a byte igual, então os PDFs produzidos participam da infraestrutura de testes existente.

O que foi entregue

  • Subsistema de fontes — embutimento de TTF/OTF com emissão de Type 0 / CIDFontType2 / Identity-H / ToUnicode; latino, cirílico, grego, hebraico, árabe fazem o ida e volta via extract_text. Descoberta de fontes do sistema via fontdb, modelagem de texto (shaping) via rustybuzz.
  • Motor CSS feito à mão (~6.500 linhas de código, zero dependências MPL) – tokenizador, parser, seletores L3+L4 (:is/:where/:not/:has), matcher, cascata, calc() / min() / max() / clamp(), var() com detecção de ciclos, valores de propriedade tipados, at-rules (@media print, @page com :first/:left/:right/:blank, @font-face, @import, @supports), contadores, conteúdo de pseudoelementos.
  • HTML – tokenizador HTML5, DOM em arena plana, extração de folhas de estilo (<style>, <link rel="stylesheet">, style="" inline), extração de recursos (<img> + srcset, <picture>/<source>, <a href>).
  • Layout – block / flex / grid apoiados pelo Taffy, quebra de linha UAX #14, colapso de margens, multicoluna, tabelas (auto + fixed).
  • Pintura – texto + bordas, RTL via rustybuzz, <a href> → anotação /Link, data-URI de <img>/XObject, ::before / ::after, page-break-{before,after}: always, opacity, transform: translate*(), marcadores de lista <ul> / <ol>, fontes embutidas via DocumentBuilder::register_embedded_font (#382).

Cascata com múltiplas fontes

  • Pdf::from_html_css_with_fonts(html, css, Vec<(family, bytes)>) — o font-family CSS em qualquer elemento é resolvido em relação às famílias registradas (sem distinção de maiúsculas/minúsculas, com/sem aspas, multipalavra sem aspas).

Correções de bugs no passe de casos extremos

  • O texto em negrito Base-14 agora renderiza em negrito (incompatibilidade da chave do dicionário de recursos contra Tf /Helvetica-Bold).
  • Fontes de sistema TTC (Helvetica.ttc, msgothic.ttc) agora são resolvidas via Source::SharedFile do fontdb.
  • font-family multipalavra sem aspas agora é tokenizado corretamente.
  • Vazamento de memória nas fábricas de Pdf::from_html_css fechado (quatro pontos de Box::leak substituídos por locais com escopo).
  • Alpha de PNG / máscara suave (SMask) agora renderiza.
  • Texto modelado (shaped) faz o ida e volta via extract_text (encode_shaped_run mapeia clusters de glifos de volta aos pontos de código de origem).
  • O PdfWriter::finish embute fontes em ordem de registro (antes era em ordem aleatória do HashMap).
  • Colisões de nomes de fontes embutidas isoladas por meio de nomes de recurso EFn monotônicos.
  • O Mutex do fontdb não é mais mantido durante o fs::read dos bytes da fonte.

Fora do escopo

Filtros CSS, transformações 3D, animações, SVG em HTML (toda crate de SVG viável em Rust é MPL), MathML, hyphens: auto, shape-outside, JavaScript, transform de matriz completa (scale/rotate), gradientes, box-shadow.

Auditoria de licenças

cargo deny check licenses passa com zero dependências transitivas MPL. A pilha CSS da Mozilla (cssparser, selectors, html5ever, lightningcss, stylo) é toda MPL-2.0; a v0.3.37 escreve à mão os equivalentes para manter o pdf_oxide inteiramente sob MIT/Apache.

Agradecimentos

  • @jmriebold – o #248 (“suporte a CSS”) é a raiz de todo o pipeline HTML+CSS→PDF deste release.

v0.3.36 – 2026-04-19

Extração estrutural de Markdown — emissão de títulos/listas de PDF marcado (tagged), ordem de leitura multicoluna, tratamento de RTL mais seguro

Extração estrutural de Markdown (#377)

O to_markdown() agora conecta o /StructTreeRoot diretamente ao pipeline de markdown em vez de re-derivar níveis de título a partir de heurísticas de tamanho de fonte e marcadores de lista a partir da detecção de glifos:

  • Emissão de títulos e listas a partir de /StructTreeRoot. Novo StructRole (Heading(1..6), ListItem, ListItemLabel, ListItemBody) anexado a cada span. Documentos marcados pelo Word recuperam toda a sua hierarquia de títulos; listas emitem - item com quebras de parágrafo a cada transição de função.
  • Função propagada por MCRs aninhados. Os padrões H1 → Span → MCR e LI → LBody → Span → MCR agora carregam a função semântica correta via InheritedContext { heading_level, list_role }.
  • Limite de bloco por /StructTreeRoot força quebra de parágrafo. O OrderedContent.block_id é incrementado a cada entrada em /P, /H1..6, /LI, /Lbl, /LBody, /Sect, /Div, /Art, /TR, /TH, /TD, /Note, /Reference, /BibEntry, /Code; layouts com espaçamento apertado não se mesclam mais.
  • Comporta de mesma linha de base contra a superfragmentação de títulos de formulário — spans na mesma linha de base se reúnem em um único título.
  • Detecção de calha multicoluna — spans na mesma linha de base separados por > max(3 × font_size, 30 pt) são tratados como entre colunas.
  • Detecção de quebra na ordem de leitura por x reverso — a ordem de leitura por coluna (último span da coluna 1 em x=976 → primeiro span da coluna 2 em x=192 na mesma linha de base) agora quebra parágrafos em vez de juntá-los.
  • Detecção geométrica de título + prefixo de lista para documentos sem marcação. Negrito + acréscimo de 5 % no tamanho promove a H4. O novo is_ordered_list_marker reconhece 1. / 12. / a) / iv. / A. ao mesmo tempo que rejeita legendas de figuras e anos.

Texto RTL — seguro por padrão

  • Marcadores **bold** espúrios ao redor de glifos contextuais do árabe agora são removidos (transições de modelagem invertiam o detector de peso da fonte).
  • A reordenação bidi está DESLIGADA por padrão. Um rascunho anterior executava a reordenação visual→lógica do unicode-bidi em cada linha RTL, o que quebrava PDFs antes corretos em ordem lógica (o nome hebraico בנימין estava sendo invertido). O auxiliar de reordenação permanece em text::bidi::reorder_visual_to_logical para chamadores cuja entrada está em ordem visual.

Saída de Markdown

  • Data URIs base64 de imagens inline limitadas a 200 KB. PDFs com diagramas de alta resolução antes inflavam a saída de markdown em 10–20× (um artigo de 1,9 MB produzia 11,3 MB de markdown). Imagens acima do limite emitem um placeholder em comentário HTML com o tamanho original. A saída de imagens em arquivo (image_output_dir) não é afetada.

Impacto empírico

Validado em relação à v0.3.35 sobre uma regressão de 369 PDFs abrangendo subconjuntos acadêmicos, governamentais, de formulários, jornais, técnicos, teses, IRS, pdfium, pdfjs, safedocs e do corpus lento:

  • 0 regressões catastróficas.
  • Token Jaccard contra pdfium e pdftotext: mediana 1,000, ≥0,95 em 95/106 fixtures.
  • Token Jaccard contra pymupdf4llm: mediana 0,978, ≥0,95 em 65/106 fixtures.
  • ~2× mais títulos emitidos do que o pymupdf4llm ao longo do corpus.

Agradecimentos

  • @Goldziher (kreuzberg) – abriu o #377 com uma metodologia de benchmark de 727 documentos mais 9 PDFs reprodutores. O enquadramento (“TF1 dentro de ±3 %, então o conteúdo textual está bom, a estrutura é o problema”) tornou toda a investigação tratável.

v0.3.35 – 2026-04-19

Preservação de dupletos de glifos estreitos na extração de texto

Correção da extração de texto

  • Dupletos adjacentes de glifos estreitos não colapsam mais em tamanhos de fonte pequenos (#378, PR #379). TextExtractor::deduplicate_overlapping_chars e deduplicate_overlapping_spans usavam um limiar absoluto fixo de 2 pt; para glifos estreitos (l, r, I, i) em fontes compactas em tamanhos pequenos, a largura de avanço por glifo cai para ≤ 2 pt (o l da Helvetica ≈ 2,5 pt a 9 pt), então dupletos adjacentes legítimos a um avanço completo de distância caíam dentro da janela de deduplicação e um dos dois glifos era descartado silenciosamente. A corrupção visível incluía controller → controler, billed → biled, warranty → warrnty, following → folowing, VIII → VII. O limiar agora escala com o próprio advance_width de cada glifo, como min(advance_width * 0.30, 2.0). Os parâmetros ajustáveis foram elevados às constantes associadas TextExtractor::DEDUP_OVERLAP_RATIO / DEDUP_OVERLAP_CAP_PT.

Agradecimentos

  • @Hugues-DTANKOUO – relatou o #378 com análise precisa de causa raiz e escreveu o PR #379 com o limiar escalado por avanço e uma matriz de regressão parametrizada (4 glifos estreitos × 3 tamanhos de texto corrido).

v0.3.34 – 2026-04-17

API de página idiomática em todos os bindings; extração estruturada de tabelas

Novos recursos

  • API de página (#371) – Python, Node.js, C# e Go agora expõem um objeto PdfPage. Itere com for page in doc, for (const p of doc), foreach (var p in doc.Pages) ou doc.Pages(); indexe com doc[i], doc.page(i), doc[i] ou doc.Page(i). Cada página expõe text, markdown(), html(), words, lines, tables, images, paths, annotations, search() de forma preguiçosa, e muito mais.
  • Extração estruturada de tabelas (#289)extract_tables() (Python), ExtractTables() (C#/Go) e extractTables() (Node.js) agora retornam linhas e células com texto mais caixas delimitadoras, não apenas Markdown. Disponível tanto no PdfDocument quanto no novo PdfPage.
  • Paridade do Node.jsextractWords, extractTextLines, extractTables, extractPaths, getEmbeddedImages, ocrExtractText conectados à camada TypeScript (antes apenas nativos).
  • ExtractedTableTable – renomeação no núcleo Rust; o prefixo redundante Extracted foi removido. Tipos voltados para FFI atualizados.

Qualidade da extração de texto

  • Detecção de colunas XY-cut em páginas de layout misto (#319) – a proteção is_multi_column_page foi apertada para exigir pelo menos 15 spans por coluna; spans ordenados por coluna não são mais reordenados pela ordenação com reconhecimento de linha no extract_text.

Agradecimentos

  • @SeanPedersen por propor a API com página em primeiro lugar (#371). @pdenapo por solicitar a extração estruturada de tabelas (#289).

v0.3.33 – 2026-04-16

Correções de extração de texto, correção de imagens e segurança de memória

Correções de bugs

  • Falha no CMap ToUnicode (#363) – fontes Type0 em subconjunto agora emitem U+FFFD quando um CID está ausente do CMap ToUnicode, em vez de cair no texto cifrado Identity-H (por exemplo, %B+$%8A//$2*%01*1%6APP).
  • Kerning TJ intrapalavra não divide mais palavras (#365) – o kerning de pares de letras de 0,10–0,20 em dentro de palavras únicas ([(diffe) -150 (rent)]) não dispara mais a inserção de espaço.
  • Mojibake UTF-8 em cirílico recuperado (#317) – fontes com codificação apenas latina e sequências brutas de bytes UTF-8 agora decodificam corretamente.
  • A recuperação parcial do FlateDecode rejeita saída lixo (#364) – PDFs do MS Reporting Services cujos fluxos de conteúdo falham no meio da descompressão não retornam mais 128 bytes de dados pseudoaleatórios.
  • Paleta Indexed + ICCBased (#373) – referências de stream ICC não resolvidas dentro do array base Indexed não definem mais /N como 3 em vez de 4 do CMYK, corrigindo artefatos de listras diagonais. Relatado por @Charltsing.
  • Paletas Indexed baseadas em Lab → sRGB (#337) – bytes de paleta CIE L*a*b* agora são convertidos Lab→XYZ→sRGB em vez de reinterpretados como RGB bruto.

Memória e desempenho

  • Todos os caches internos limitados (PRs #369, #354) – o cache de objetos (64 MB), os caches de fontes (256–512 entradas), os caches de span/imagem de XObject (1024 entradas) e o cache global de CMap (1024 entradas) agora usam despejo FIFO.
  • OOM de extração de caminhos em PDFs cheios de gráficos corrigido (#369) – adicionada deduplicação de XObject com reconhecimento de CTM, de modo que o mesmo XObject na mesma posição é deduplicado, mas o mesmo XObject em posições diferentes é processado separadamente.
  • Resiliência a envenenamento de MutexMutexExt::lock_or_recover() substitui 72 pontos de chamada .lock().unwrap().

Dependências

  • Ecossistema RustCrypto cipher 0.5 (PRs #352, #295, #291): aes 0.8→0.9, cbc 0.1→0.2, sha2/sha1/md-5 0.10→0.11.

Suíte de testes

  • 13 testes ignorados mortos/obsoletos removidos; 3 testes antes ignorados corrigidos. Testes de regressão adicionados para cada correção de bug acima. A suíte agora tem 6.300 aprovados, 0 falhos, 228 ignorados.

Agradecimentos

  • @Charltsing pelo relato de bug da extração de imagens Indexed + CMYK (#373).
  • @ddxtanx por perfilar o crescimento ilimitado de memória durante a extração de múltiplas páginas (#354).
  • @andrewjradcliffe pelo PR #369: caches FIFO limitados, deduplicação de XObject com reconhecimento de CTM, trait de recuperação de envenenamento MutexExt, fortalecimento do binding Python.

v0.3.32 – 2026-04-15

Correção do pipeline de release para o tarball Go FFI do Windows-x64

Pipeline de release

  • Corrige a falha de build da lib nativa x86_64-pc-windows-gnu que reprovava o release v0.3.31scripts/shrink-staticlib.sh executava objcopy --strip-debug em cada membro do arquivo, mas a toolchain de cross-compilação MinGW emite membros de debug separados .dwo contendo apenas seções DWARF; após o strip, o membro não tinha mais seções e o objcopy abortava o arquivo inteiro. Correção: remover os membros de arquivo .dwo via ar d antes de invocar o objcopy. Sem mudança funcional nos artefatos Rust, Python, Node, WASM ou C# – este release existe unicamente para desbloquear o caminho de instalação do Go no Windows-x64.

v0.3.31 – 2026-04-13

Correções de bugs, mudanças de build do Go, melhorias na infraestrutura de release

Correções de bugs

  • Recuperação de Xref – corrigida a recuperação para objetos de página livre marcados incorretamente e entradas de offset de xref erradas por alguns bytes.

Mudanças incompatíveis

  • Libs nativas do Go – as bibliotecas nativas não são mais commitadas em go/lib/. Os consumidores devem executar go run github.com/yfedoseev/pdf_oxide/go/cmd/install@latest uma vez por máquina.

Infraestrutura de release

  • Reduzidos os staticlibs do Rust em 63% (de 71 MB para 26 MB), feito strip do addon .node do npm, removidos os sourcemaps do npm, corrigido o vazamento de sdist da crate, apertado o empacotamento snupkg do NuGet.

v0.3.27 – 2026-04-12

Staticlib do Go, bindings nativos do Node.js, NativeAOT do C#, OCR FFI, grandes correções de bugs

Novos recursos

  • Migração para staticlib do Go – mudança de cdylib para staticlib para binários Go autocontidos.
  • Bindings nativos do Node.js – subpacotes de plataforma pré-compilados via distribuição no estilo napi-rs.
  • C# LibraryImport – migradas 881 declarações P/Invoke de DllImport para LibraryImport por compatibilidade com NativeAOT.
  • Ponte OCR FFI – suporte a OCR agora disponível nos bindings Go, C# e Node.js.
  • Arnês de regressão – corpus curado de 60 PDFs para testes automatizados de qualidade.

Correções de bugs

  • Imagens em espaço de cor Indexed, criptografia AES-256 (V=5, R=6), ordem de leitura para conteúdo de coluna única e tabular, extração de texto em árabe, separação de palavras, fallback de largura de fonte, invalidação de cache de objetos, melhorias de renderização.

v0.3.24 – 2026-04-09

Bindings oficiais para JavaScript/TypeScript, Go e C#

Novos recursos

  • Bindings JavaScript/TypeScript – publicados no npm com cobertura completa da API.
  • Bindings Go – pacote Go nativo com superfície de API completa.
  • Bindings C# – pacote .NET publicado no NuGet.
  • Camada C FFI – mais de 270 funções extern "C" com cabeçalho pdf_oxide.h compartilhado.
  • Controle global de nível de log – configurável em todos os bindings.

v0.3.23 – 2026-04-09

Correções críticas de estabilidade

Correções de bugs

  • Corrigido SIGABRT em páginas com CTM degenerado de PDFs dvips rotacionados.
  • Corrigida a remoção de imagens/XObjects ao salvar.
  • Corrigida a renderização corrompida em sistemas sem fontes comuns.
  • Corrigido o índice de página de campo de formulário que sempre retornava 0.

v0.3.22 – 2026-04-08

Documentos thread-safe, Python assíncrono, Python free-threaded, ajuste fino de segmentação de palavras/linhas

Novos recursos

  • PdfDocument thread-safeSend + Sync via Mutex (substituiu RefCell).
  • API Python assíncronaAsyncPdfDocument, AsyncPdf, AsyncOfficeConverter.
  • Python free-threaded – suporte a cp314t (builds sem GIL).
  • Limiares de segmentaçãoword_gap_threshold, line_gap_threshold, profile para ajustar a detecção de palavras/linhas.

Correções de bugs

  • Páginas em branco no split/merge da CLI, salto de renderização para imagens malformadas, SIGSEGV de ciclo na árvore de estrutura, comporta de estratégia de tabela.

Desempenho

  • Árvore de estrutura e fluxos de conteúdo descomprimidos em cache, busca de MCID em O(1), travessia da árvore de páginas em O(log n), preenchimento preguiçoso da árvore de páginas.

v0.3.21 – 2026-04-04

Wheels Python multiarquitetura, correção de nível de log

Correções de bugs

  • O nível de log agora é totalmente respeitado no Python (macros encaminhadas para a crate log).

Novos recursos

  • Wheels Python multiarquitetura – Linux aarch64, musl x86_64/aarch64, Windows ARM64; requisito de glibc reduzido para 2_28.

v0.3.20 – 2026-04-04

Grande reescrita da extração de tabelas, melhorias na qualidade do texto, logging silencioso por padrão

Novos recursos

  • Reescrita do motor de extração de tabelas – pipeline de interseção, detecção de borda de texto, grade estendida, detecção de texto com reconhecimento de coluna, reconstituição de linhas pontilhadas/tracejadas, detecção híbrida de linhas.
  • Qualidade da extração de texto – espaçamento entre valores adjacentes, mesclagem de decimais divididos, consolidação de spans em negrito, hierarquia de títulos HTML, pareamento rótulo-valor, mesclagem de grupos colunares.
  • Logging silencioso – o logging agora é silencioso por padrão em todos os bindings; os logs do Python fluem pelo módulo logging via pyo3-log.

Correções de bugs

  • Mensagem de erro clara para PDF criptografado, descriptografia de fluxos ObjStm/XRef, tratamento de quebra de linha final pelo parser de fluxos.

v0.3.19 – 2026-04-02

Extração de página em chamada única, ordem de leitura com reconhecimento de coluna, caixas delimitadoras por caractere

Novos recursos

  • extract_page_text() – DTO de chamada única para extração de página simplificada.
  • Ordem de leitura com reconhecimento de coluna – particionamento espacial XY-Cut para documentos multicoluna.
  • Caixas delimitadoras por caractere – derivadas de métricas de fonte para posicionamento preciso de caracteres.
  • Flag is_monospace – disponível em TextSpan e TextChar.
  • Pdf::from_bytes() – novo construtor em todos os bindings.
  • Operações de caminhoextract_paths() nos bindings Python.

Correções de bugs

  • Pânico UTF-8 em log de depuração multibyte, espaçamento de markdown, /Matrix de Form XObject, matriz de texto rotacionado, perda de CTM no prescan, deduplicação, queda de texto em escala Tm, mesclagem de palavras em markdown, documentos em branco no merge da CLI.

Mudanças incompatíveis

  • WASM – os nomes de campo JSON agora usam camelCase.

v0.3.18 – 2026-04-01

Revisão completa do motor de renderização, novas APIs Python e WASM, Python com tudo incluído

Novos recursos

  • Revisão completa do motor de renderização – espaçamento de caracteres correto, suporte a fontes embutidas, métricas de fontes padrão, preenchimento e traçado, caminho de recorte, sombreamento por gradiente, transparência alfa, máscaras de imagem por estêncil, rotação de página, espaços de cor de separação.
  • Novas APIs Pythonvalidate_pdf_a, validate_pdf_ua, validate_pdf_x, extract_pages, delete_page, move_page, flatten_to_images, construtor com senha, merge.
  • Novas APIs WASMvalidatePdfA, deletePage, extractPages, save, construtor com senha, merge.
  • Python com tudo incluído – renderização, paralelismo, assinaturas e conversão Office habilitados por padrão.

Correções de bugs

  • Aborto por CTM degenerado, proteção contra flate-bomb no FlateDecode (limite de 256 MB), sincronização da pilha de recorte.

v0.3.17 – 2026-03-08

Refinamento da detecção de tabelas, otimização de PDF marcado

Melhorias

  • Detecção de tabelas refinada – exige 2+ colunas, reduzindo falsos positivos.
  • Pipeline de extração de PDF marcado otimizado.

Correções de bugs

  • Corrigido o pânico RefCell already borrowed no processamento recursivo de Form XObject.

v0.3.16 – 2026-03-08

Extração inteligente de tabelas híbridas, stubs de tipo Python, suporte a pathlib

Novos recursos

  • Extração inteligente de tabelas híbridas – clustering Union-Find, análise de linhas visuais, spans/cabeçalhos visuais.
  • Tabelas ASCII profissionais – quebra em múltiplas linhas para saída no terminal.
  • Stubs de tipo Python – gerados automaticamente via mypy stubgen.
  • PdfDocument Python – aceita pathlib.Path e suporta gerenciador de contexto.

Correções de bugs

  • Segfault em Form XObject aninhado, escala de coordenadas no Python, pânico UTF-8 em tabela ASCII.

v0.3.15 – 2026-03-06

Gerenciamento de cabeçalho/rodapé, templates de página, extração com escopo

Novos recursos

  • API de gerenciamento de cabeçalho/rodapé – adicionar, remover e editar artefatos de PDF.
  • Templates de página – placeholders dinâmicos para numeração de páginas, datas etc.
  • Extração com escopo – respeita erase_regions para saída filtrada.
  • PdfDocument.from_bytes() – novo construtor Python.

Correções de bugs

  • Ordem de leitura multicoluna (XY-Cut), colisões de identidade de fonte, falsos positivos da estratégia de tabela Lines.

v0.3.14 – 2026-03-03

Renderização de alto nível, extração de palavras/linhas, primitivas geométricas, tabelas híbridas

Novos recursos

  • API de renderização de alto nívelPdf::render_page em Rust, Python e WASM.
  • Extração de palavras e linhasextract_words, extract_text_lines em todos os bindings.
  • Extração de primitivas geométricasextract_rects, extract_lines.
  • Detecção de tabelas híbridas – dicas de linhas vetoriais melhoram a detecção de limites de tabela.
  • Harmonização da API – padrão fluente .within(page, rect).
  • Comandos da CLI – comandos render e paths com filtragem --area.

Correções de bugs

  • Descoberta de comporta de feature de OCR, envenenamento de cache de span de XObject, filtros de criptografia V=4, CIDToGIDMap criptografado.

v0.3.13 – 2026-03-02

Correções de extração de texto CJK

Correções de bugs

  • Decodificação multibyte em extract_chars para fontes CJK/Type0, precisão melhorada de posicionamento de caracteres, escala de espaçamento de caracteres.

v0.3.12 – 2026-03-01

Qualidade da extração de texto, conversão de markdown, desempenho

Melhorias

  • Qualidade da extração de texto – cálculo de largura de fonte CID, detecção de limite de palavra na mudança de fonte, fallback de mapeamento CID não padrão, direcionalidade de texto RTL.
  • Conversão de markdown – particionamento espacial recursivo XY-Cut, detecção de títulos, reconstrução de listas.

Desempenho

  • Travessia de árvore de páginas sem cópia, cache de árvore de estrutura, saída antecipada por operador BT, buffer de I/O maior, removido o limiar de reconstrução de xref.

v0.3.10 – 2026-02-26

Extração paralela, suporte a WASM/JavaScript, processamento em lote, melhorias na qualidade do texto

Novos recursos

  • Suporte a WASM/JavaScript – bindings WebAssembly via wasm-bindgen. Extração completa de texto, criação de PDF, edição, campos de formulário e busca disponíveis no navegador e no Node.js. Publicado como pdf-oxide-wasm no npm.

  • Extração paralela de páginas – nova flag de feature parallel com extração multithread baseada em rayon. O ParallelExtractor distribui páginas entre threads de trabalho. Um cache global de fontes garante que as fontes sejam analisadas apenas uma vez.

  • API de processamento em lote – novo BatchProcessor para fluxos de trabalho com múltiplos PDFs, com callbacks de progresso e coleta de erros. Suporta processamento sequencial e paralelo.

  • Detecção híbrida de OCR – novo enum PageType (NativeText, ScannedPage, HybridPage) com detecção multi-heurística para fallback inteligente de OCR.

  • Paridade completa da API WASM/Python – 10 novos grupos de métodos nos bindings WASM e Python: get/set de campos de formulário, extração de bytes de imagem, PDF a partir de imagens, achatamento de formulários, mesclagem de PDFs, incorporação de arquivos, rótulos de página, metadados XMP.

Correções de bugs

  • Segfault de XObject circular – corrigido segfault de referências circulares de Form XObject durante a extração de imagens
  • Estouro da cadeia XRef /Prev – a análise da cadeia XRef /Prev foi reescrita de recursiva para iterativa com detecção de ciclos
  • Texto com ligaduras quebradas – o pós-processador repair_ligatures() corrige texto corrompido de PDFs LaTeX
  • Qualidade da extração de texto – extração de texto de anotações, normalização de pontos de preenchimento (leader dots), suporte a CMap Priority 3
  • Extração de tabelas – células mescladas, conteúdo de célula em múltiplas linhas, detecção de cabeçalho baseada em fonte
  • Persistência de campos de formulário – o salvamento incremental agora persiste corretamente as mudanças de valor dos campos de formulário

Desempenho

  • Salto de páginas apenas com imagem – a pré-verificação page_cannot_have_text() pula a descompressão para páginas sem fontes
  • Operandos de operador SmallVec – operandos alocados na pilha eliminam a alocação no heap por operador
  • Cache de fontes entre documentos – cache de fontes LRU em nível de processo compartilhado entre todas as instâncias de PdfDocument

v0.3.9 – 2026-02-24

20+ micro-otimizações – extração de texto 40% mais rápida

Desempenho

  • Correção de concatenação de strings O(n^2) – um Vec<&str> pré-alocado e unido no final substitui a acumulação quadrática de String::push_str()
  • Parser de fluxo de conteúdo apenas de imagens – novo caminho rápido para extract_images() que pula operadores de texto e gráficos (3-5x mais rápido)
  • Cache de fontes baseado em impressão digital – identidade de fonte por hashing de encoding+widths+flags em vez de comparação de struct completa
  • Parser em streaming – operadores de fluxo de conteúdo transmitidos em streaming em vez de coletados em Vec
  • Parser inline rápido para BT/ET – correspondência direta de bytes para operadores de texto comuns
  • Tabela de busca byte-para-char – tabela de busca de 256 entradas substitui o HashMap no caminho quente
  • Tabela de busca de largura – array de tamanho fixo substitui o HashMap para larguras de glifos
  • Redução do enum Operator – de 112 para 40 bytes via boxing das variantes grandes (64% menor)
  • Backend zlib-rs – descompressão de fluxo 15-25% mais rápida via porte do zlib-ng

Correções de bugs

  • Codificação de fonte com programas embutidos – resolução correta da codificação base conforme a especificação PDF
  • Unicode suplementar (U+10000+) – corrigido o truncamento de pontos de código suplementares
  • Mapeamento de ligaduras StandardEncoding – mapeamento correto de fi, fl, ff, ffi, ffl via Adobe Glyph List
  • Normalização de radicais Kangxi – tabela de mapeamento completa U+2F00-U+2FD5
  • Ordem de caracteres de texto RTL – árabe/hebraico extraídos em ordem de leitura lógica
  • Separação de texto multicoluna – detecção de colunas melhorada via análise de espaçamento

Recursos

  • extract_all_text() – novo método de conveniência para extração de texto de todas as páginas
  • source_role para StructElem – preserva o nome de função original do PDF antes do mapeamento de funções

v0.3.8 – 2026-02-20

Parser apenas de texto – páginas pesadas em gráficos 10-30x mais rápidas

Desempenho

  • Parser de fluxo de conteúdo apenas de texto – o novo caminho rápido parse_content_stream_text_only() pula operadores gráficos fora dos blocos BT/ET usando varredura em nível de byte em vez de análise nom completa
  • Scanner gráfico em nível de byte – aritmética de índice bruta substitui o loop de operandos baseado em nom, processando em velocidade próxima a memcpy
  • Salto de operadores de cor – 12 operadores de cor adicionados à lista de salto em nível de byte
  • Emissão diferida de q/cm/Q – operações de estado gráfico são adiadas até que o texto seja confirmado, eliminando ~75% da sobrecarga de backtrack
  • Cache de FontInfo embrulhado em Arc – evita clonar structs FontInfo completas em acertos de cache
  • Construção de mapa de páginas O(n) – travessia em passe único substitui a descida recursiva
  • Cache de nome-para-referência de XObject – elimina a clonagem de dicionários O(n^2) em páginas pesadas em XObject

v0.3.7 – 2026-02-19

Qualidade da extração de texto: de 95,7% para 99,6% de taxa de limpeza

Verificado – Corpus de 3.829 PDFs

Métrica v0.3.6 v0.3.7 Mudança
Taxa de limpeza 95,7% 99,6% 3.812 de 3.829 PDFs
PDFs sujos 165 17 -90%

Adicionado – Parser & Decoders

  • Filtro de fluxo BrotliDecode (PDF 2.0) – novo decoder para fluxos comprimidos com Brotli
  • Seleção de trailer Xref – seleção correta de trailer quando existem múltiplos trailers
  • Recuperação de PDF sem cabeçalho – busca pelo primeiro marcador de objeto quando o cabeçalho %PDF- está ausente

Adicionado – Codificação de fontes

  • Parser de codificação de fontes CFF – analisa programas de fonte CFF/OpenType para codificação de caracteres
  • Parser de codificação de fontes Type1 – analisa programas de fonte Type 1 embutidos para mapeamentos de glifos
  • Mais de 80K mapeamentos CID-para-Unicode – expandidos Adobe-CNS1, Adobe-GB1, Adobe-Japan1, Adobe-Korea1
  • Decodificação Shift-JIS/RKSJ – suporte a fluxos CMap codificados em Shift-JIS japonês
  • Propagação de cmap Identity-H – propaga tabelas cmap TrueType de descendentes CIDFont

Corrigido – Pipeline de extração de texto

  • Flush de buffer Tf – faz flush do texto pendente na troca de fonte para evitar perda de texto
  • Limiar de espaço adaptativo – substitui o limiar fixo de 0,25em por espaçamento baseado em bbox
  • Deduplicação de spans – deduplica spans sobrepostos renderizados para efeitos de negrito/sombra
  • Deduplicação de caracteres – remove caracteres duplicados dentro de 2pt na mesma linha
  • Remoção da verificação de operador BT – corrige a validação incorreta que pulava blocos de texto válidos
  • Decodificação ByteMode – decodificação correta de códigos de caractere de 1 byte, 2 bytes e largura variável
  • Extração de texto de anotações – extrai texto de Widget, FreeText e fluxos de aparência

v0.3.6 – 2026-02-16

10x mais rápido – dois gargalos O(n) eliminados

Desempenho

  • Cache em massa da árvore de páginas – no primeiro acesso a uma página, toda a árvore de páginas é percorrida uma vez e todas as páginas são colocadas em cache. Antes, get_page() percorria a partir da raiz para cada página não cacheada, resultando em O(n) por página e O(n^2) no total para acesso sequencial. Agora é O(1) por página após uma única travessia O(n). Um arquivo de teste veraPDF de 10.000 páginas passou de 55.667ms para 332ms (168x mais rápido).

  • Cache de offset de varredura por objeto – quando objetos estão ausentes da tabela xref, scan_for_object() antes lia o arquivo PDF inteiro para cada objeto ausente. PDFs marcados com centenas de elementos de árvore de estrutura fora do xref disparavam centenas de leituras completas do arquivo. Agora o arquivo é varrido uma vez e todos os offsets de objeto são cacheados. Um PDF marcado de 10 páginas passou de ~10s para 68ms (146x mais rápido). Um PDF acadêmico de 154 páginas com 571 fontes passou de ~18s para 405ms (44x mais rápido).

  • Extração de texto em passe únicoextract_spans() não executa mais dois passes (classificar o tipo de documento, depois extrair). O passe de classificação foi eliminado por completo; limiares adaptativos com reconhecimento de fonte agora produzem resultados iguais ou melhores em um único passe.

  • Pré-alocação de Vec do fluxo de conteúdoparse_content_stream() pré-aloca a capacidade do Vec de operadores com base no tamanho do fluxo, reduzindo realocações para fluxos de conteúdo grandes.

Verificado – Corpus de 3.830 PDFs (da v0.3.5 à v0.3.6)

Métrica v0.3.5 v0.3.6 Mudança
Taxa de aprovação 99,8% 99,8% 3.823 de 3.830 PDFs válidos
Lentos (>5s) 2 0 Eliminados
Média 23,3ms 2,1ms -91%
p50 0,6ms 0,6ms
p90 3,0ms 2,6ms -13%
p99 33,2ms 18,0ms -46%
Máx 68.722ms 625ms -99%
Soma (todos os PDFs) 89,1s 8,0s -91%

A saída de texto foi verificada como byte a byte idêntica em 11 PDFs (862 KB de texto extraído). 4 PDFs mostraram qualidade de extração melhorada pelo espaçamento adaptativo.


v0.3.5 – 2026-02-15

Desempenho, estabilidade em 3.830 PDFs e recuperação de erros

Desempenho

  • Cache de fontes entre páginas – um cache de fontes em nível de documento, indexado por ObjectRef, evita reanalisar fontes compartilhadas em cada página
  • Cache de objetos de páginaget_page() cacheia objetos de página resolvidos, eliminando a travessia repetida da árvore de páginas na extração de múltiplas páginas
  • Cache de árvore de estrutura – o resultado da árvore de estrutura é cacheado após o primeiro acesso, evitando análise redundante em cada chamada de extract_text()
  • Saída antecipada por operador BT – a extração de texto pula o pipeline completo para páginas apenas com imagens que não contêm operadores BT (Begin Text)
  • Buffer de I/O maior para arquivos grandes – a capacidade do BufReader aumentada de 8 KB para 256 KB para arquivos acima de 100 MB
  • Limiar de reconstrução de Xref removido – eliminada a heurística que disparava a reconstrução completa do arquivo em PDFs de portfólio válidos com poucos objetos

Verificado – Corpus de 3.830 PDFs

  • 100% de taxa de aprovação em 3.830 PDFs abrangendo veraPDF (2.907), Mozilla pdf.js (897), SafeDocs (26)
  • Zero timeouts, zero pânicos
  • p50 = 0,6ms, p90 = 3,0ms, p99 = 33ms

Adicionado – Criptografia

  • Autenticação por senha de proprietário – Algoritmo 7 para R<=4, Algoritmo 12 para R>=5
  • Verificação de senha de usuário R>=5 com SASLprep – verificação completa de senha AES-256 usando SHA-256
  • API pública de autenticação por senhaPdf::authenticate(password) e PdfDocument::authenticate(password)

Adicionado – Validação de conformidade PDF/A

  • Validação de metadados XMP – verifica as entradas pdfaid:part e pdfaid:conformance
  • Validação de espaço de cor – varre fluxos de conteúdo de página em busca de operadores de cor dependentes de dispositivo sem output intent
  • Validação de AFRelationship – validação da especificação de arquivos embutidos PDF/A-3

Adicionado – Validação de conformidade PDF/X

  • Identificação XMP PDF/X – valida pdfxid:GTS_PDFXVersion
  • Validação de relação de caixas de página – TrimBox dentro de BleedBox dentro de MediaBox
  • Detecção de transparência ExtGState – verificações de SMask, CA/ca, BM
  • Detecção de cor dependente de dispositivo – sinaliza espaços de cor não suportados
  • Validação de perfil ICC – valida fluxos de perfil ICCBased

Adicionado – Renderização

  • Recorte correto conforme a especificação – estado de recorte com escopo em salvar/restaurar q/Q
  • Cálculo de largura de avanço de glifo – conforme a seção 9.4.4 da especificação PDF
  • Renderização de Form XObject – analisa a transformação /Matrix, usa os /Resources do formulário

Corrigido – Recuperação de erros (28+ PDFs do mundo real)

  • Objetos ausentes resolvem para Null conforme a seção 7.3.10 da especificação PDF
  • Análise leniente da versão do cabeçalho para strings de versão incomuns
  • Correspondência de algoritmo de criptografia não padrão (combinações V=1, R=3)
  • Resources que não são dicionário tratados como vazios em vez de gerar erro
  • Nós Null na árvore de páginas pulados de forma elegante
  • Fluxos de conteúdo corrompidos retornam conteúdo vazio em vez de erros
  • Varredura aprimorada da árvore de páginas com a heurística /Resources+/Parent

Corrigido – Proteção contra DoS

  • A contagem de páginas é validada contra o limite do Anexo C.2 da especificação PDF (8.388.607)

Corrigido – Extração de imagens

  • Extração de imagens do fluxo de conteúdo via operadores Do
  • Imagens de Form XObject aninhadas com detecção de ciclos
  • Imagens inline (sequências BI…ID…EI)
  • Transformações CTM para posicionamento de imagens
  • Resolução de referência indireta de ColorSpace

Corrigido – Robustez do parser

  • Cabeçalhos de objeto em múltiplas linhas (formato 1 0\nobj usado por PDFs gerados pelo Google)
  • Busca de cabeçalho estendida de 1024 para 8192 bytes
  • Análise leniente de versão para cabeçalhos malformados

Corrigido – Robustez do acesso a páginas

  • Páginas sem /Contents retornam conteúdo vazio
  • A detecção de árvore de páginas cíclica previne estouro de pilha
  • Referências de stream Null tratadas de forma elegante
  • Páginas sem entrada /Type encontradas pelas chaves /MediaBox ou /Contents

Corrigido – Robustez da criptografia

  • A descriptografia AES com chaves subdimensionadas retorna erro em vez de pânico
  • Análise de fluxo Xref fortalecida contra entradas malformadas
  • Referências /Encrypt indiretas resolvidas antes da análise

Corrigido – Processamento de fluxo de conteúdo

  • Fallback Dictionary-as-Stream para dicionários nus
  • Nomes de filtro abreviados (AHx, A85, LZW, Fl, RL, CCF, DCT)
  • Limite de operadores de fluxo de conteúdo (padrão 1.000.000)

Corrigido – Qualidade do código

  • Referências de objeto indiretas da árvore de estrutura resolvidas em tempo de análise
  • Desambiguação de tokens R/RG no lexer
  • O corte de espaços em branco do fluxo não remove mais bytes NUL ou espaços de dados binários

Testes

  • 8 testes antes ignorados foram designorados e corrigidos

Removido

  • Stub vazio PdfImage (a extração usa ImageInfo)
  • Bloco de teste comentado DocumentType::detect()

v0.3.4 – 2026-02-12

Robustez de análise, extração de caracteres e caminhos XObject

Mudanças incompatíveis

  • A assinatura de parse_header() mudou de (u8, u8) para (u8, u8, u64) para incluir o offset de byte

Corrigido – Robustez da análise de PDF (Issue #41)

  • PDFs com prefixos binários ou cabeçalhos BOM agora abrem com sucesso
  • A busca de cabeçalho varre os primeiros 1024 bytes pelo marcador %PDF-
  • Suporta BOM UTF-8, cabeçalhos de e-mail e outros dados binários iniciais
  • O modo leniente lida com PDFs malformados do mundo real; o modo estrito para testes de conformidade

Adicionado – Extração de texto em nível de caractere (Issue #39)

  • extract_chars() retorna Vec<TextChar> com posicionamento por caractere
  • Inclui matriz de transformação, ângulo de rotação, largura de avanço
  • Ordenado em ordem de leitura com deduplicação de caracteres sobrepostos
  • 30-50% mais rápido que a extração de spans para casos de uso apenas de caracteres
  • Exposto nas APIs Rust e Python

Adicionado – Extração de caminhos de XObject (Issue #40)

  • extract_paths() processa recursivamente Form XObjects via operador Do
  • Transformações de coordenadas via /Matrix aplicadas corretamente
  • Estado gráfico devidamente isolado (salvar/restaurar)
  • A detecção de XObject duplicado previne loops infinitos
  • XObjects aninhados suportados

Alterado

  • Biblioteca do parser nom atualizada de 7.1 para 8.0

v0.3.3 – 2026-02-11

Suporte a CJK, melhorias na árvore de estrutura e fundamentos de conformidade

Inclui todas as mudanças da v0.2.5 e v0.2.6 como um release consolidado.

Destaques

  • Suporte a TagSuspect/MarkInfo – analisa o dicionário MarkInfo do catálogo do documento
  • Elemento de estrutura Word Break /WB para texto CJK
  • Suporte a CMap predefinidos para Adobe-GB1 (chinês simplificado), Adobe-Japan1 (japonês), Adobe-CNS1 (chinês tradicional), Adobe-Korea1 (coreano)
  • Suporte a expansão de abreviações /E
  • Análise de array Type 0 /W para larguras de glifo de CIDFont
  • Correção do tratamento de hífen suave (U+00AD)
  • Filtragem aprimorada de artefatos com suporte a subtipo
  • Incorporação de imagens na saída HTML e Markdown (data URIs base64)
  • Exportação de arquivo de imagem com embed_images=false e image_output_dir
  • Métodos PdfImage::to_base64_data_uri() e to_png_bytes()

v0.3.2 – 2026-02-01

Edição, criptografia e segurança de documentos

Adicionado – Edição de PDF

  • DocumentEditor para modificar PDFs existentes
  • Suporte completo a anotações (marcação de texto, formas, carimbos, tinta, anexos de arquivo, redações)
  • Criação de campos de formulário interativos (texto, checkbox, rádio, dropdown, lista, botão)
  • Achatamento de formulários
  • Anotações de link (URLs, navegação interna de páginas)
  • Construtor de sumário/marcadores
  • Camadas de PDF (Optional Content Groups)

Adicionado – Criptografia

  • Criptografia na escrita (AES-256, AES-128, RC4-128, RC4-40)
  • Controles de permissão (imprimir, copiar, modificar, anotar)
  • Construtor EncryptionConfig com EncryptionAlgorithm e Permissions
  • Fundamento de assinatura digital

v0.3.1 – 2026-01-14

Campos de formulário, multimídia, ferramentas de criação e busca

Adicionado – Criação de PDF

  • Pdf::from_markdown(), Pdf::from_html(), Pdf::from_text(), Pdf::from_image()
  • Padrão fluente PdfBuilder para configuração de metadados e layout
  • DocumentBuilder para geração programática de PDF
  • Renderização de tabelas com TableRenderer
  • API de gráficos: cores, gradientes, padrões, modos de mesclagem, transparência
  • Templates de página com cabeçalhos, rodapés, numeração de páginas, marcas d’água
  • Geração de códigos de barras (QR, Code128, EAN-13, UPC-A, Code39, ITF)

Adicionado – Busca

  • Busca de texto com regex, sensível/insensível a maiúsculas, palavra inteira, intervalos de página
  • Tipos SearchOptions e SearchResult
  • Rastreamento de posição com página/coordenadas

Adicionado – Cobertura de campos de formulário (95%)

  • Criação hierárquica de campos (estruturas pai/filho com nomes pontuados)
  • Modificação de propriedades de campo (somente leitura, obrigatório, retângulo, tooltip, comprimento máximo, alinhamento, valor padrão)
  • Exportação FDF/XFDF para troca de dados de formulário

Adicionado – Anotações multimídia

  • MovieAnnotation, SoundAnnotation, ScreenAnnotation, RichMediaAnnotation
  • ThreeDAnnotation com suporte aos formatos U3D e PRC

Adicionado – Suporte a formulários XFA

  • XfaExtractor, XfaParser, XfaConverter (conversão de XFA para AcroForm)

Alterado – Bindings Python

  • Suporte verdadeiro a Python 3.8-3.14 via abi3-py38
  • Ferramentas modernas: integração com uv, pdm, ruff

v0.3.0 – 2026-01-10

Fundamento de extração – API unificada e capacidades centrais

Adicionado – API Pdf unificada

  • Pdf::open() para ler PDFs existentes
  • Navegação de páginas estilo DOM com pdf.page(0)
  • Handle de baixo nível PdfDocument para casos de uso avançados

Adicionado – Extração de texto

  • extract_text() – texto simples da página inteira
  • extract_spans() – runs de texto estilizado com metadados de fonte
  • Ordem de leitura baseada na árvore de estrutura para PDFs marcados
  • Detecção inteligente de quebra de linha e espaço para PDFs sem marcação

Adicionado – Extração de imagens

  • extract_images() – extrai todas as imagens de uma página
  • Detecção de formato (JPEG, PNG, TIFF, JBIG2, CCITT)
  • Tratamento de espaço de cor (DeviceRGB, DeviceCMYK, DeviceGray, ICCBased)

Adicionado – Extração de metadados

  • Dicionário de informações do documento (título, autor, assunto, palavras-chave)
  • Leitura/escrita de metadados XMP
  • Informações da página (dimensões, rotação, caixas media/crop/trim)

Adicionado – Extração de formulários

  • extract_form_fields() para enumeração de campos AcroForm
  • Tipos de campo de texto, botão, escolha e assinatura

Adicionado – Conversão

  • to_markdown() – conversão para Markdown em nível de página
  • to_html() – conversão para HTML em nível de página
  • to_plain_text() – saída de texto simples configurável

Adicionado – Conformidade

  • Validação PDF/A (ISO 19005, níveis 1a a 3b)
  • Validação PDF/X (ISO 15930, níveis X-1a a X-6p)
  • Validação PDF/UA (ISO 14289, níveis UA-1 e UA-2)

Adicionado – Renderização (requer a feature rendering)

  • Renderiza páginas para PNG/JPEG via tiny-skia
  • DPI e escala configuráveis

Adicionado – Bindings Python

  • Classe PdfDocument com API de extração completa
  • Classe Pdf com API de criação e de alto nível
  • Baseado em PyO3, publicado no PyPI como pdf_oxide

v0.2.4 – 2026-01-09

  • Correção de transformação CTM para posicionamento de texto
  • Análise de /Alt e /Pg da árvore de estrutura
  • FormulaRenderer para imagens de fórmulas

v0.2.3 – 2026-01-07

  • Reset de matriz BT/ET conforme a especificação PDF
  • Detecção de espaçamento geométrico no conversor de Markdown
  • apply_intelligent_text_processing() para ligaduras e hifenização

v0.2.2 – 2025-12-15

  • Otimização de palavras-chave para descobribilidade

v0.2.1 – 2025-12-15

  • Melhorias na decodificação de fluxos criptografados

v0.1.4 – 2025-12-12

  • Correções na decodificação de fluxos criptografados

v0.1.0 – 2025-11-06

  • Release inicial
  • Extração de texto de PDF com mapeamento Unicode conforme a especificação
  • Detecção inteligente de ordem de leitura
  • Bindings Python via PyO3
  • Suporte a PDF criptografado
  • Extração de campos de formulário
  • Extração de imagens