PDF Oxide — biblioteca PDF em Rust com bindings Python (0.8ms, 100% pass rate, MIT)
Criei uma biblioteca de extração de texto de PDF escrita em Rust com bindings para Python via PyO3. Licença MIT.
O problema: a maioria das bibliotecas PDF em Python te obriga a escolher entre velocidade, confiabilidade e licença permissiva. PyMuPDF é rápido mas AGPL-3.0. pypdf é MIT mas 15× mais lento. pdfplumber é ótimo para tabelas mas lento para processamento em lote.
PDF Oxide resolve isso: 0.8ms de latência média, 100% pass rate em 3.830 PDFs reais, licença MIT.
Benchmarks
Testado em 3.830 PDFs de três suítes públicas (veraPDF, Mozilla pdf.js, DARPA SafeDocs):
| Biblioteca | Média | p99 | Pass Rate | Licença |
|---|---|---|---|---|
| PDF Oxide | 0.8ms | 9ms | 100% | MIT |
| PyMuPDF | 4.6ms | 28ms | 99.3% | AGPL-3.0 |
| pypdfium2 | 4.1ms | 42ms | 99.2% | Apache/BSD |
| pypdf | 12.1ms | 97ms | 98.4% | BSD |
| pdfplumber | 23.2ms | 189ms | 98.8% | MIT |
Instalação
Python:
pip install pdf_oxide
Rust:
cargo add pdf_oxide
Exemplo rápido (Python)
from pdf_oxide import PdfDocument
doc = PdfDocument("documento.pdf")
for i in range(doc.page_count()):
print(doc.extract_text(i))
Exemplo rápido (Rust)
use pdf_oxide::PdfDocument;
let mut doc = PdfDocument::open("documento.pdf")?;
for i in 0..doc.page_count()? {
println!("{}", doc.extract_text(i)?);
}
Conversão para Markdown
from pdf_oxide import PdfDocument
doc = PdfDocument("relatorio.pdf")
for i in range(doc.page_count()):
print(doc.to_markdown(i)) # preserva headings, bold, listas
O que faz
- Extração de texto com decodificação completa de fontes (Latin, CJK, árabe, fontes customizadas)
- Conversão para Markdown com detecção de headings
- Extração de imagens
- Criação de PDF a partir de Markdown e HTML
- Manipulação de páginas (merge, split, rotação)
- Preenchimento de formulários
- OCR integrado (PaddleOCR via ONNX Runtime)
- Criptografia/descriptografia
Por que 100% pass rate importa
Com 98.4% de pass rate (pypdf), você perde ~60 documentos em 3.830. Em um pipeline processando 50K documentos, são ~800 falhas silenciosas — documentos que retornam texto vazio ou corrompido. Em pipelines RAG, isso significa documentos que nunca entram no índice vetorial.
Arquitetura
Escrito do zero em Rust — sem MuPDF, sem Poppler. Parser construído com nom (parser combinators), extração de texto conforme a especificação PDF (operadores Tc/Tw/Tz), gap statistics adaptativo para detecção de espaçamento, XY-Cut para layout multi-coluna, cadeia de fallback multi-nível para decodificação de fontes.
A jornada de otimização: 23.3ms → 0.8ms. Cache bulk do page tree transformou um PDF de 10.000 páginas de 55s para 332ms (O(n²) → O(1)).
GitHub: https://github.com/yfedoseev/pdf_oxide
Docs: https://oxide.fyi
Se quiserem testar com PDFs que outras bibliotecas não conseguem processar, adoraria ouvir o feedback.
Fonte: https://oxide.fyi