Generación de PDF en Rust: revisión de bibliotecas y herramientas
El lenguaje Rust, conocido por su rendimiento y seguridad, ofrece varias bibliotecas potentes para crear documentos PDF. A diferencia de Python, donde dominan reportlab y fpdf, el ecosistema de Rust proporciona soluciones ligeras pero funcionales. En este artículo, analizaremos tres bibliotecas clave: printpdf, genpdf y pdf-writer, y también abordaremos enfoques de bajo nivel.
1. printpdf — una biblioteca básica pero flexible
printpdf es una de las bibliotecas más populares para generar PDF en Rust. Proporciona acceso de bajo nivel a la estructura del PDF, permitiendo crear documentos con posicionamiento arbitrario de elementos. La biblioteca admite la incrustación de fuentes, el trabajo con imágenes y primitivas gráficas básicas.
Ejemplo 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), "Capa 1");
let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Agregamos texto doc.use_text("¡Hola, mundo!", 24.0, Mm(20.0), Mm(280.0), &font);
// Dibujamos una línea 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)));
// Guardamos let file = File::create("example.pdf").unwrap(); doc.save(&mut BufWriter::new(file)).unwrap();}Ventajas:
- Control total sobre la estructura del PDF
- Soporte para incrustación de fuentes TrueType
- Trabajo con imágenes (PNG, JPEG)
- Soporte para gráficos SVG (a través de
printpdf-svg)
Desventajas:
- Sin maquetación automática de texto
- Necesidad de gestionar el posicionamiento manualmente
- Falta de soporte para tablas y diseños de varias páginas
2. genpdf — para documentos simples con maquetación
genpdf es una biblioteca de más alto nivel que automatiza el proceso de maquetación. Es ideal para crear informes, cartas y otros documentos con estructura simple. La biblioteca admite saltos de línea, alineación de texto y elementos básicos de diseño.
Ejemplo de creación de un documento simple:
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("Ejemplo de documento");
// Agregamos elementos doc.push(Paragraph::new("Título").bold()); doc.push(Break::new(5.0)); doc.push(Paragraph::new("Texto principal con salto de línea automático. " .to_string() + "La biblioteca genpdf calcula las posiciones por sí misma."));
// Guardamos doc.render_to_file("output.pdf")?; Ok(())} Ventajas:
- Maquetación automática de texto
- Soporte para saltos de línea y alineación
- API simple para agregar elementos
- Posibilidad de crear documentos de varias páginas
Desventajas:
- Soporte limitado para gráficos
- Sin soporte integrado para tablas
- Menos control sobre el posicionamiento
3. pdf-writer — rendimiento de bajo nivel
pdf-writer es una biblioteca minimalista para la escritura directa de objetos PDF. P
También en la biblioteca
Validación de datos en Swift (iOS/macOS): herramientas y práctica
Zod — una potente biblioteca para la validación de datos en TypeScript
Colas de tareas en C# (.NET): System.Threading.Channels y TPL Dataflow
golangci-lint para Go: guía completa con ejemplos
RxJava para Java: guía completa con ejemplos prácticos