Generación de informes PDF en Rust: biblioteca printpdf

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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                    

Recommendations