Generación de informes PDF en Rust con la biblioteca printpdf
En el desarrollo web moderno, la creación de documentos PDF sigue siendo una tarea demandada, desde la generación de facturas e informes hasta la exportación de datos. Si su proyecto está escrito en Rust o lo utiliza para el backend, la biblioteca printpdf será una herramienta confiable para la generación de PDF. En este artículo, analizaremos las capacidades de printpdf, mostraremos ejemplos de código y discutiremos cómo integrarla en un proyecto educativo.
¿Qué es printpdf?
printpdf es una biblioteca pura de Rust para crear documentos PDF sin dependencias externas. Permite:
- Crear documentos de varias páginas con contenido arbitrario
- Añadir texto con diferentes fuentes (incluyendo TrueType y OpenType)
- Dibujar líneas, rectángulos, elipses y trazados complejos
- Incrustar imágenes (JPEG, PNG)
- Trabajar con tablas y cuadrículas
- Gestionar espacios de color (RGB, CMYK, Grayscale)
La principal ventaja es la total autonomía: no requiere instalación de LaTeX, wkhtmltopdf u otros sistemas. Esto hace que printpdf sea una opción ideal para el sitio educativo pythonlib.ru, donde la simplicidad de implementación y la reproducibilidad de los ejemplos son importantes.
Instalación y primer documento
Añada la dependencia en Cargo.toml:
[dependencies]printpdf = "0.7"Creemos un PDF muy 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( "Mi primer PDF", Mm(210.0), Mm(297.0), "Layer 1" );
// Obtenemos la fuente por defecto let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Añadimos texto let current_layer = doc.get_page(page1).get_layer(layer1); current_layer.use_text( "¡Hola, PythonLib!", 24.0, Mm(10.0), Mm(280.0), &font );
// Guardamos el archivo let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut writer).unwrap();
println!("PDF creado: hello.pdf");}Este código crea un PDF de una página con un texto. Tenga en cuenta: use_text acepta coordenadas en milímetros y el tamaño de la fuente en puntos.
Trabajo con gráficos y color
printpdf admite el dibujo de primitivas. Creemos un informe con una línea y un rectángulo relleno:
use printpdf::*;
fn create_report() -> (PdfDocumentReference, PdfPageIndex, PdfLayerIndex) { let (doc, page, layer) = PdfDocument::new( "Informe", Mm(210.0), Mm(297.0), "Data" );
let layer = doc.get_page(page).get_layer(layer);
// Dibujamos una línea roja let points = vec![ (Point::new(Mm(20.0), Mm(250.0)), false), (Point::new(Mm(190.0), Mm(250.0)), false), ]; let line = Line { points, is_closed: false, }; layer.set_color(Color::Rgb(Rgb::new(1.0, 0.0, 0.0))); layer.add_line(line);
// Rectángulo azul relleno let rect = Polygon { vertices: vec![ (Point::new(Mm(50.0), Mm(200.0)), false), (Point::new(Mm(150.0), Mm(200.0)), false), (Point::new(Mm(150.0), Mm(180.0)), false), (Point::new(Mm(50.0), Mm(180.0)), false), ], is_closed: true, }; layer.set_color(Color::Rgb(Rgb::new(0.0, 0.0, 1.0))); layer.add_polygon(rect);
(doc, page, layer)}Los colores se definen en el rango 0.0–1.0. Para CMYK use Color::Cmyk(Cmyk::new(0.0, 1.0, 0.0, 0.0)).
Incrustación de imágenes
Añadamos un logotipo al informe:
use printpdf::*;use std::fs::Fi También en la biblioteca
Migraciones de bases de datos en Swift: herramientas y prácticas para iOS/macOS
Cliente Redis para Swift (iOS/macOS) – RediStack
Trabajo con CSV en Rust: bibliotecas csv, serde y procesamiento eficiente de datos
Registro en Kotlin: mejores bibliotecas y herramientas para el desarrollo
Análisis de HTML en C# (.NET): bibliotecas HtmlAgilityPack y AngleSharp