Geração de relatórios PDF em Rust: visão geral das bibliotecas e exemplos práticos
Rust é uma linguagem de programação de sistemas moderna que está ganhando popularidade no desenvolvimento web, inclusive para criação de aplicações servidoras e ferramentas de geração de documentos. Se você precisa gerar relatórios PDF em Rust, está no lugar certo. Neste artigo, veremos as principais bibliotecas para trabalhar com PDF, suas funcionalidades e apresentaremos exemplos práticos de código.
Por que gerar PDF em Rust?
PDF é um formato universal para troca de documentos, relatórios e faturas. Rust oferece:
- Alto desempenho e baixo consumo de memória.
- Segurança no gerenciamento de memória sem coletor de lixo.
- Fácil integração com frameworks web (Actix, Rocket, Axum).
- Multiplataforma (Windows, Linux, macOS).
Principais bibliotecas para PDF em Rust
1. printpdf — trabalho de baixo nível com PDF
printpdf é a biblioteca mais popular para criar documentos PDF "do zero". Ela permite desenhar linhas, texto, imagens e tabelas, controlando cada pixel. Adequada para relatórios complexos com layout personalizado.
Instalação:
[dependencies]printpdf = "0.7"Exemplo: PDF simples com texto
use printpdf::*;use std::fs::File;
fn main() { let (doc, page1, layer1) = PdfDocument::new( "Meu primeiro relatório", Mm(210.0), Mm(297.0), "Layer 1", );
let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
let current_layer = doc.get_page(page1).get_layer(layer1); current_layer.use_text("Olá, mundo!", 24.0, Mm(20.0), Mm(280.0), &font);
doc.save(&mut File::create("output.pdf").unwrap()).unwrap();}2. genpdf — geração de relatórios de alto nível
genpdf é construído sobre o printpdf e fornece uma API conveniente para criar documentos com tabelas, cabeçalhos, parágrafos e estilos. Ideal para relatórios onde a estrutura é importante, e não o posicionamento manual.
Instalação:
[dependencies]genpdf = "0.3"Exemplo: relatório com tabela
use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Table, TableLayout};use genpdf::fonts::FontFamily;
fn main() { let font_family = FontFamily::from_files( "/usr/share/fonts/truetype/dejavu/", "DejaVuSans", None, ).unwrap();
let mut doc = Document::new(font_family); doc.set_title("Relatório de vendas");
let mut table = Table::new(TableLayout::new(vec![2, 3, 3])); table.row() .element(Paragraph::new("Produto")) .element(Paragraph::new("Quantidade")) .element(Paragraph::new("Preço"));
table.row() .element(Paragraph::new("Notebook")) .element(Paragraph::new("10")) .element(Paragraph::new("1200$"));
doc.push(table); doc.render_to_file("report.pdf").unwrap();}3. wkhtmltopdf — HTML para PDF via WebKit
Se você prefere criar relatórios em HTML/CSS, use o wrapper sobre o utilitário wkhtmltopdf. Ele converte um template HTML em PDF, suportando estilos, imagens e JavaScript.
Instalação:
[dependencies]wkhtmltopdf = "0.4"Exemplo: conversão de HTML
use wkhtmltopdf::*;
fn main() { let html = r#" <h1>Relatório do mês</h1> <p>Vendas: <strong>150 000 ₽</strong></p> <table border="1"> <tr><td>Janeiro</td><td>50 000</td></tr> <tr><td>Fevereiro</td><td>100 000</td></tr&g Também na biblioteca
gRPC para Go (Golang): bibliotecas, exemplos e guia prático
Processamento de Markdown em Rust: bibliotecas, parsers e ferramentas
Parsing de HTML em Rust: bibliotecas e exemplos práticos