Geração de PDF em Rust: visão geral das bibliotecas e exemplos práticos
Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para criar aplicações servidoras de alto desempenho, serviços web e ferramentas de linha de comando. Uma das tarefas comuns no desenvolvimento de tais projetos é a geração de documentos PDF: relatórios, faturas, certificados ou simplesmente arquivos de texto com formatação. Neste artigo, vamos analisar as principais bibliotecas para trabalhar com PDF em Rust, seus recursos, exemplos de código e critérios de escolha.
Bibliotecas populares para geração de PDF em Rust
Atualmente, no ecossistema Rust, podemos destacar três bibliotecas principais que são ativamente mantidas e usadas pela comunidade:
- printpdf — biblioteca de baixo nível para criação de documentos PDF com controle total sobre o conteúdo. Suporta texto, imagens, gráficos vetoriais, tabelas e incorporação de fontes.
- genpdf — biblioteca de nível mais alto, construída sobre o printpdf. Fornece abstrações convenientes para trabalhar com texto, parágrafos, tabelas e estilos.
- pdf_writer — outra biblioteca de baixo nível que foca no minimalismo e desempenho. Permite escrever arquivos PDF diretamente, mas exige um conhecimento profundo do formato PDF.
Biblioteca printpdf
printpdf é uma das bibliotecas mais populares para geração de PDF em Rust. Ela fornece uma API para trabalhar com primitivas gráficas, texto e fontes. Principais recursos:
- Criação de documentos com várias páginas;
- Incorporação de fontes TrueType/OpenType;
- Desenho de linhas, retângulos, círculos e outras formas;
- Inserção de imagens (PNG, JPEG);
- Trabalho com cores e transparência;
- Suporte a Unicode e cirílico.
Exemplo de criação de um PDF simples com texto usando printpdf:
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { // Criando um documento no formato A4 let (doc, page1, layer1) = PdfDocument::new( "Exemplo de PDF em Rust", Mm(210.0), Mm(297.0), "Layer 1", );
// Obtendo a fonte atual (Helvetica embutida) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Usando a camada para desenhar let layer = doc.get_page(page1).get_layer(layer1);
// Adicionando texto layer.use_text("Olá, mundo! PDF a partir do Rust", 24.0, Mm(50.0), Mm(250.0), &font);
// Salvando o arquivo let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}Biblioteca genpdf
genpdf é um wrapper sobre o printpdf que fornece uma API de nível mais alto. É ideal para criar documentos com formatação simples: títulos, parágrafos, listas, tabelas. Principais vantagens:
- Gerenciamento automático de quebras de página;
- Suporte a estilos (negrito, itálico, sublinhado);
- Suporte embutido para tabelas com células e bordas;
- Interface simples para adicionar elementos.
Exemplo de criação de PDF com tabela usando genpdf:
use genpdf::*;use genpdf::elements::*;use std::fs::File;
fn main() { // Criando um documento let mut doc = Document::new("Liberation Serif") .expect("Falha ao carregar a fonte");
// Configuração do estilo padrão doc.set_title("Relatório de Vendas");
// Adicionando um parágrafo doc.push(Paragraph::new("Vendas por mês:"));
// Criando uma tabela let mut table = Table::new(vec![2, 3, 2]); table.set_cell_border_style(BorderStyle::Solid); table.push_row(vec![ "Mês".to_string(), "Receita, R$".to_stri Também na biblioteca
Contêineres de Injeção de Dependência para Java: uma visão geral completa
prometheus/client_golang para Go: guia completo com exemplos práticos
Validação de dados em Swift: biblioteca Validator
OpenCV C++: Guia Completo com Exemplos Práticos
Swift Package Manager para Swift: guia completo com exemplos