PDF Oxide agora tem bindings para Go, C#/.NET e Node — mesmo motor Rust, licença MIT
Faz uns seis meses publiquei o pdf_oxide — biblioteca PDF com motor em Rust. Na época só tinha binding Python. Nos últimos dois meses portei pra Go, C#/.NET e Node/TypeScript. Agora estão os quatro no ar.
O que o toolkit entrega em cada linguagem: extração de texto (plain, markdown, HTML) com estrutura de títulos e parágrafos preservada, texto estruturado (palavras, linhas, chars com coordenadas), extração de tabelas, busca full-text, extração de imagens, leitura e edição de campos de formulário, anotações, renderização de páginas pra PNG/JPEG ou thumbnails, e um DocumentEditor separado pra metadados, rotação / mover / deletar páginas, crop, flatten de anotações e salvar com criptografia. Também dá pra criar PDFs a partir de markdown, HTML, texto puro ou imagens, além de merge de múltiplos arquivos.
Instalação:
Node
npm install pdf-oxide
C# / .NET
dotnet add package PdfOxide
Go
go get github.com/yfedoseev/pdf_oxide/go
uma vez por máquina — busca a staticlib nativa do GitHub Releases:
go run github.com/yfedoseev/pdf_oxide/go/cmd/install@latest
Node e .NET já vêm com as bibliotecas nativas empacotadas (x64 + ARM64 pra Linux, macOS, Windows). No Go a staticlib é grande demais pro módulo, então é fetch-on-demand via installer — o script imprime as variáveis CGO_CFLAGS / CGO_LDFLAGS pra exportar.
Exemplo em Go:
doc, _ := pdfoxide.Open("paper.pdf")
defer doc.Close()
text, _ := doc.ExtractText(0)
md, _ := doc.ToMarkdown(0)
GitHub: https://github.com/yfedoseev/pdf_oxide
Docs: https://oxide.fyi
Média de 0.8ms por documento, p99 de 9ms, 100% de pass rate num corpus de 3.830 PDFs reais (veraPDF, Mozilla pdf.js, DARPA SafeDocs). O parser é Rust, então não tem gerenciamento manual de memória no caminho de input não-confiável. Overhead do cgo no Go é ~15% sobre chamadas Rust diretas em fixtures reais.
Benchmark:
| Biblioteca | Média | p99 | Pass Rate | Licença |
|---|---|---|---|---|
| pdf_oxide | 0.8ms | 9ms | 100% | MIT / Apache-2.0 |
| PyMuPDF | 4.6ms | 28ms | 99.3% | AGPL-3.0 |
| pypdfium2 | 4.1ms | 42ms | 99.2% | Apache-2.0 |
| pypdf | 12.1ms | 97ms | 98.4% | BSD-3 |
| pdfplumber | 23.2ms | 189ms | 98.8% | MIT |
Essa é a primeira release pública dos três novos bindings, então feedback de quem desenvolve em Go, C# ou Node seria bem útil — se a API parece idiomática na linguagem, se os padrões de erro fazem sentido (sentinelas com errors.Is no Go, exceções no .NET, erros síncronos no Node), como é a experiência de build e deploy nos seus ambientes (Alpine, Lambda, containers AOT, scratch images), e qualquer PDF real que quebra o parser. Abram issues no GitHub ou respondam aqui.