Generación de PDF en Rust: revisión de bibliotecas y herramientas
Rust es un lenguaje de programación de sistemas moderno que se utiliza cada vez más para crear aplicaciones de servidor de alto rendimiento, incluida la generación de documentos. En este artículo, revisaremos las principales bibliotecas para crear archivos PDF en Rust, sus capacidades, ejemplos de uso y recomendaciones para elegir.
Bibliotecas principales para trabajar con PDF en Rust
El ecosistema de Rust ofrece varias soluciones maduras para la generación de PDF. Veamos las más populares:
- printpdf — biblioteca de bajo nivel con soporte para gráficos vectoriales, imágenes y fuentes.
- genpdf — biblioteca de alto nivel para crear documentos con una API simple.
- pdf_writer — generador de PDF rápido y seguro con dependencias mínimas.
- wkhtmltopdf — envoltorio sobre la utilidad wkhtmltopdf para convertir HTML a PDF.
Biblioteca printpdf
printpdf es una de las bibliotecas más populares para generar PDF en Rust. Proporciona control total sobre el contenido del documento: texto, líneas, rectángulos, imágenes y fuentes incrustadas.
Instalación
[dependencies]printpdf = "0.7"Ejemplo: creación de un PDF simple con texto
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { // Creamos un documento en formato A4 let (doc, page1, layer1) = PdfDocument::new( "Documento de ejemplo", Mm(210.0), Mm(297.0), "Layer 1" );
// Obtenemos la fuente actual (incorporada) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Dibujamos el texto let current_layer = doc.get_page(page1).get_layer(layer1); current_layer.use_text( "¡Hola, mundo PDF desde Rust!", 24.0, Mm(20.0), Mm(270.0), &font );
// Guardamos en un archivo let file = File::create("example.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}Biblioteca genpdf
genpdf proporciona una API de más alto nivel, similar a trabajar con procesadores de texto. Soporta párrafos, tablas, encabezados y ajuste automático de línea.
Instalación
[dependencies]genpdf = "0.2"Ejemplo: creación de un documento con encabezado y tabla
use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Table, TableLayout};use genpdf::fonts::FontFamily;
fn main() -> Result<(), Box> { // Cargamos la fuente (por ejemplo, DejaVu Sans) let font_family = FontFamily::from_files( "/usr/share/fonts/truetype/dejavu/", "DejaVuSans", None )?;
// Creamos el documento let mut doc = Document::new(font_family, SimplePageSettings::a4());
// Añadimos un encabezado doc.push(Paragraph::new("Informe de ventas").aligned(genpdf::Alignment::Center));
// Creamos una tabla let mut table = Table::new(TableLayout::new(vec![2, 3, 2])); table.row() .element(Paragraph::new("Producto")) .element(Paragraph::new("Cantidad")) .element(Paragraph::new("Precio")); table.row() .element(Paragraph::new("Portátil")) .element(Paragraph::new("10")) .element(Paragraph::new("50 000 RUB")); table.row() .element(Paragraph::new("Ratón")) .element(Paragraph::new("50")) .element(Paragraph::new("1 500 RUB"));
doc.push(table);
// Guardamos doc.render_to_file("report.pdf")?; Ok(())} Biblioteca pdf_writer
pdf_writer es una biblioteca minimalista y rápida, orientada al trabajo de bajo nivel con estructuras PDF. Va
También en la biblioteca
Planificador de tareas en Node.js: node-cron, node-schedule y Bull
Contenedor de Inyección de Dependencias para JavaScript (Node.js): Awilix
Trabajo con Kafka en Kotlin: bibliotecas, configuración y ejemplos