Geração de PDF em Rust: visão geral das bibliotecas e ferramentas
A linguagem Rust, conhecida por seu desempenho e segurança, oferece várias bibliotecas poderosas para criar documentos PDF. Ao contrário do Python, onde dominam reportlab e fpdf, o ecossistema Rust fornece soluções leves, mas funcionais. Neste artigo, examinaremos três bibliotecas principais: printpdf, genpdf e pdf-writer, além de abordar abordagens de baixo nível.
1. printpdf — biblioteca básica, mas flexível
printpdf é uma das bibliotecas mais populares para geração de PDF em Rust. Ela fornece acesso de baixo nível à estrutura do PDF, permitindo criar documentos com posicionamento arbitrário de elementos. A biblioteca suporta incorporação de fontes, trabalho com imagens e primitivas gráficas básicas.
Exemplo de uso:
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { let (doc, page1, layer1) = PdfDocument::new("Documento PDF", Mm(210.0), Mm(297.0), "Camada 1");
let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Adiciona texto doc.use_text("Olá, mundo!", 24.0, Mm(20.0), Mm(280.0), &font);
// Desenha uma linha let layer = doc.get_page(page1).get_layer(layer1); layer.set_color(Color::Rgb(Rgb::new(0.0, 0.0, 0.0), None)); layer.add_line(Point::new(Mm(20.0), Mm(270.0)), Point::new(Mm(100.0), Mm(270.0)));
// Salva let file = File::create("example.pdf").unwrap(); doc.save(&mut BufWriter::new(file)).unwrap();}Vantagens:
- Controle total sobre a estrutura do PDF
- Suporte para incorporação de fontes TrueType
- Trabalho com imagens (PNG, JPEG)
- Suporte para gráficos SVG (através de
printpdf-svg)
Desvantagens:
- Sem layout automático de texto
- Necessidade de gerenciar o posicionamento manualmente
- Falta de suporte para tabelas e layouts de várias páginas
2. genpdf — para documentos simples com layout
genpdf é uma biblioteca de nível mais alto que automatiza o processo de layout. Ela é ideal para criar relatórios, cartas e outros documentos com estrutura simples. A biblioteca suporta quebra de linhas, alinhamento de texto e elementos básicos de design.
Exemplo de criação de um documento simples:
use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Break, Image};use genpdf::fonts::FontFamily;
fn main() -> Result<(), Box> { let font_family = FontFamily::from_files( "fonts/", "LiberationSans", None )?;
let mut doc = Document::new(font_family); doc.set_title("Exemplo de documento");
// Adiciona elementos doc.push(Paragraph::new("Título").bold()); doc.push(Break::new(5.0)); doc.push(Paragraph::new("Texto principal com quebra automática de linhas. " .to_string() + "A biblioteca genpdf calcula as posições automaticamente."));
// Salva doc.render_to_file("output.pdf")?; Ok(())} Vantagens:
- Layout automático de texto
- Suporte para quebras e alinhamento
- API simples para adicionar elementos
- Possibilidade de criar documentos de várias páginas
Desvantagens:
- Suporte limitado a gráficos
- Sem suporte nativo para tabelas
- Menos controle sobre o posicionamento
3. pdf-writer — desempenho de baixo nível
pdf-writer é uma biblioteca minimalista para escrita direta de objetos PDF. Ela