Changelog
Todas as mudanças relevantes do PDF Oxide estão documentadas aqui.
v0.3.38 – 2026-04-22
O
DocumentBuilderchega 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+EmbeddedFontagora 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+CSS —
Pdf.from_html_css(...)efrom_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)noDocumentBuilderem todos os bindings.save_with_encryptionno 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
/We o CMapToUnicodesão re-mapeados para o espaço de GID do subconjunto; o ida e volta doextract_textpermanece inalterado. - Mudança na API interna de escrita:
EmbeddedFont::encode_string/encode_shaped_runretornamVec<u16>ebuild_embedded_font_objectsretorna umGlyphRemapperque os chamadores passam paraContentStreamBuilder::build_with_remappers. Sem mudança nas APIs de alto nível.
Verificação de assinatura digital (#208, metade da verificação)
Signature.verify()eSignature.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 +messageDigestda §11.2.- RSA-PKCS#1 v1.5 sobre SHA-1 / SHA-256 / SHA-384 / SHA-512 retorna
Valid/Invalid. RSA-PSS e ECDSA aparecem comoUnknown/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) viax509-parser— todos os bindings.Signature— enumerar + inspecionar +.get_certificate()— todos os bindings.Timestamp— análise deTSTInfoda 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 featuretsa-clientdo 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_regionerender_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-wasmagora entrega três builds lado a lado com exportações condicionais nopackage.json:nodejs/,bundler/(Vite / webpack / Rollup / esbuild / Bun) eweb/(navegadores / Deno / Cloudflare Workers). - Corrige o
ReferenceError: Can't find variable: __dirnamelanç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
dlopendelibpdf_oxide.{so,dylib,dll}em tempo de execução. Builds comCGO_ENABLED=0agora 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 dePdfCreator.FromMarkdownpara 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
-sharedbusca o cdylib em vez do staticlib e imprimeCGO_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çãoGOCACHEdo Go. - Os assets de release agora incluem
pdf_oxide-go-ffi-shared-<platform>.tar.gzpara cada plataforma Tier-1, ao lado dos arquivos staticlib existentes.
Correções de bugs
- #395 – O
RenderPagenão levanta maisSignatureExceptionquando 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 viaextract_text. Descoberta de fontes do sistema viafontdb, modelagem de texto (shaping) viarustybuzz. - 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,@pagecom: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 viaDocumentBuilder::register_embedded_font(#382).
Cascata com múltiplas fontes
Pdf::from_html_css_with_fonts(html, css, Vec<(family, bytes)>)— ofont-familyCSS 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::SharedFiledofontdb. font-familymultipalavra sem aspas agora é tokenizado corretamente.- Vazamento de memória nas fábricas de
Pdf::from_html_cssfechado (quatro pontos deBox::leaksubstituí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_runmapeia clusters de glifos de volta aos pontos de código de origem). - O
PdfWriter::finishembute 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
EFnmonotônicos. - O Mutex do
fontdbnão é mais mantido durante ofs::readdos 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. NovoStructRole(Heading(1..6),ListItem,ListItemLabel,ListItemBody) anexado a cada span. Documentos marcados pelo Word recuperam toda a sua hierarquia de títulos; listas emitem- itemcom quebras de parágrafo a cada transição de função. - Função propagada por MCRs aninhados. Os padrões
H1 → Span → MCReLI → LBody → Span → MCRagora carregam a função semântica correta viaInheritedContext { heading_level, list_role }. - Limite de bloco por
/StructTreeRootforça quebra de parágrafo. OOrderedContent.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_markerreconhece1./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-bidiem 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 emtext::bidi::reorder_visual_to_logicalpara 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_charsededuplicate_overlapping_spansusavam 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 (olda 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íacontroller → controler,billed → biled,warranty → warrnty,following → folowing,VIII → VII. O limiar agora escala com o próprioadvance_widthde cada glifo, comomin(advance_width * 0.30, 2.0). Os parâmetros ajustáveis foram elevados às constantes associadasTextExtractor::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 comfor page in doc,for (const p of doc),foreach (var p in doc.Pages)oudoc.Pages(); indexe comdoc[i],doc.page(i),doc[i]oudoc.Page(i). Cada página expõetext,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) eextractTables()(Node.js) agora retornam linhas e células com texto mais caixas delimitadoras, não apenas Markdown. Disponível tanto noPdfDocumentquanto no novoPdfPage. - Paridade do Node.js –
extractWords,extractTextLines,extractTables,extractPaths,getEmbeddedImages,ocrExtractTextconectados à camada TypeScript (antes apenas nativos). ExtractedTable→Table– renomeação no núcleo Rust; o prefixo redundanteExtractedfoi 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_pagefoi 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 noextract_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
/Ncomo 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 Mutex –
MutexExt::lock_or_recover()substitui 72 pontos de chamada.lock().unwrap().
Dependências
- Ecossistema RustCrypto cipher 0.5 (PRs #352, #295, #291):
aes0.8→0.9,cbc0.1→0.2,sha2/sha1/md-50.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-gnuque reprovava o release v0.3.31 –scripts/shrink-staticlib.shexecutavaobjcopy --strip-debugem cada membro do arquivo, mas a toolchain de cross-compilação MinGW emite membros de debug separados.dwocontendo 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.dwoviaar dantes de invocar oobjcopy. 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 executargo run github.com/yfedoseev/pdf_oxide/go/cmd/install@latestuma vez por máquina.
Infraestrutura de release
- Reduzidos os staticlibs do Rust em 63% (de 71 MB para 26 MB), feito strip do addon
.nodedo 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çalhopdf_oxide.hcompartilhado. - 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-safe –
Send + Syncvia Mutex (substituiu RefCell). - API Python assíncrona –
AsyncPdfDocument,AsyncPdf,AsyncOfficeConverter. - Python free-threaded – suporte a
cp314t(builds sem GIL). - Limiares de segmentação –
word_gap_threshold,line_gap_threshold,profilepara 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
loggingvia 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 emTextSpaneTextChar. Pdf::from_bytes()– novo construtor em todos os bindings.- Operações de caminho –
extract_paths()nos bindings Python.
Correções de bugs
- Pânico UTF-8 em log de depuração multibyte, espaçamento de markdown,
/Matrixde 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 Python –
validate_pdf_a,validate_pdf_ua,validate_pdf_x,extract_pages,delete_page,move_page,flatten_to_images, construtor com senha,merge. - Novas APIs WASM –
validatePdfA,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 borrowedno 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.Pathe 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_regionspara 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ível –
Pdf::render_pageem Rust, Python e WASM. - Extração de palavras e linhas –
extract_words,extract_text_linesem todos os bindings. - Extração de primitivas geométricas –
extract_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
renderepathscom 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_charspara 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-wasmno npm. -
Extração paralela de páginas – nova flag de feature
parallelcom extração multithread baseada em rayon. OParallelExtractordistribui 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
BatchProcessorpara 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
/Prevfoi 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 deString::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áginassource_rolepara 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 único –
extract_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údo –
parse_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ágina –
get_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 senha –
Pdf::authenticate(password)ePdfDocument::authenticate(password)
Adicionado – Validação de conformidade PDF/A
- Validação de metadados XMP – verifica as entradas
pdfaid:partepdfaid: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\nobjusado 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 usaImageInfo) - 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()retornaVec<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=falseeimage_output_dir - Métodos
PdfImage::to_base64_data_uri()eto_png_bytes()
v0.3.2 – 2026-02-01
Edição, criptografia e segurança de documentos
Adicionado – Edição de PDF
DocumentEditorpara 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
EncryptionConfigcomEncryptionAlgorithmePermissions - 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
PdfBuilderpara configuração de metadados e layout DocumentBuilderpara 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
SearchOptionseSearchResult - 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
PdfDocumentpara casos de uso avançados
Adicionado – Extração de texto
extract_text()– texto simples da página inteiraextract_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áginato_html()– conversão para HTML em nível de páginato_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
PdfDocumentcom API de extração completa - Classe
Pdfcom 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
/Alte/Pgda á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