Génération de rapports PDF en Rust avec la bibliothèque printpdf
Dans le monde moderne de la programmation, Rust est de plus en plus utilisé pour créer des applications serveur haute performance et des outils en ligne de commande. L'une des tâches courantes est la génération de rapports PDF — qu'il s'agisse de tableaux de bord analytiques, de factures ou de documentation. La bibliothèque printpdf offre un moyen léger et fiable de créer des documents PDF en Rust pur, sans dépendances externes (comme LaTeX ou wkhtmltopdf).
Qu'est-ce que printpdf ?
printpdf est une bibliothèque pure-Rust pour générer des documents PDF à partir de zéro. Elle prend en charge :
- Du texte avec différentes polices (y compris les polices TrueType/OpenType intégrées).
- Des graphiques vectoriels (lignes, rectangles, ellipses).
- Des images (PNG, JPEG) avec transparence.
- Des tableaux et un formatage complexe via un positionnement manuel.
- Des pages de toutes tailles (A4, Letter, personnalisées).
La bibliothèque n'utilise pas de processus externes, ce qui la rend idéale pour l'intégration dans des services web, des utilitaires CLI ou des applications de bureau en Rust.
Installation
Ajoutez dans Cargo.toml :
[dependencies]printpdf = "0.7"Vous aurez également besoin de la crate rusttype pour travailler avec les polices (elle est automatiquement incluse comme dépendance).
Exemple de base : création d'un rapport simple
Écrivons un programme qui crée un PDF avec un titre, du texte et une ligne. Le résultat sera enregistré dans le fichier report.pdf.
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn main() { // Créer un document au format A4 let (doc, page1, layer1) = PdfDocument::new( "Mon rapport", Mm(210.0), Mm(297.0), "Layer 1", );
// Obtenir la police (Helvetica intégrée) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Commencer à dessiner sur le premier calque let current_layer = doc.get_page(page1).get_layer(layer1);
// Texte : titre current_layer.use_text( "Rapport des ventes", 24.0, Mm(20.0), Mm(270.0), &font, );
// Texte : normal current_layer.use_text( "Date du rapport : 2025-03-15", 12.0, Mm(20.0), Mm(250.0), &font, );
// Dessiner une ligne de séparation current_layer.set_outline_color(Color::Rgb(Rgb::new(0.5, 0.5, 0.5))); current_layer.set_stroke_width(1.0); current_layer.add_line( Point::new(Mm(20.0), Mm(240.0)), Point::new(Mm(190.0), Mm(240.0)), );
// Enregistrer dans un fichier let file = File::create("report.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();
println!("Rapport PDF créé : report.pdf");}Ce code crée un PDF d'une page avec un titre, une date et une ligne grise. Toutes les coordonnées sont données en millimètres (vous pouvez également utiliser des points).
Ajout d'un tableau avec des données
Pour les rapports, les tableaux sont souvent nécessaires. printpdf n'a pas de structures de tableau prêtes à l'emploi, mais il est facile de les implémenter manuellement :
use printpdf::*;use std::fs::File;use std::io::BufWriter;
fn draw_table( layer: &PdfLayerReference, font: &IndirectFontRef, data: Vec<[&str; 3]>, start_x: Mm, start_y: Mm,) { let col_widths = [Mm(40.0), Mm(60.0), Mm(50.0)]; let row_height = Mm(10.0); let header_bg = Color::Rgb(Rgb::new(0.9, 0.9, 0.9));
for (row_idx, row_data) in data.iter().enumerate() { let y = start_y - row_height * (row_idx as f32);
// Fond pour l'en-tête if row_idx == 0 { layer.set_fill_color(header_bg); layer.add_rectangle( start_x, y - row_height, Aussi dans la bibliothèque
Travailler avec Excel en C# (.NET) : bibliothèques EPPlus, ClosedXML et NPOI
mimalloc pour C++ : guide complet avec exemples
Authentification et autorisation en C++ : bibliothèques et implémentation