Génération de rapports PDF en Rust : aperçu des bibliothèques et exemples pratiques
Rust est un langage de programmation système moderne qui gagne en popularité dans le développement web, notamment pour la création d'applications serveur et d'outils de génération de documents. Si vous devez générer des rapports PDF en Rust, vous êtes au bon endroit. Dans cet article, nous examinerons les principales bibliothèques pour travailler avec les PDF, leurs fonctionnalités et fournirons des exemples de code fonctionnels.
Pourquoi générer des PDF en Rust ?
Le PDF est un format universel pour l'échange de documents, rapports et factures. Rust offre :
- Des performances élevées et une faible consommation de mémoire.
- Une sécurité de la mémoire sans ramasse-miettes.
- Une intégration facile avec les frameworks web (Actix, Rocket, Axum).
- Une multi-plateforme (Windows, Linux, macOS).
Principales bibliothèques PDF en Rust
1. printpdf — travail de bas niveau avec les PDF
printpdf est la bibliothèque la plus populaire pour créer des documents PDF "à partir de zéro". Elle permet de dessiner des lignes, du texte, des images et des tableaux, en contrôlant chaque pixel. Idéale pour les rapports complexes avec une mise en page personnalisée.
Installation :
[dependencies]printpdf = "0.7"Exemple : un PDF simple avec du texte
use printpdf::*;use std::fs::File;
fn main() { let (doc, page1, layer1) = PdfDocument::new( "Mon premier rapport", Mm(210.0), Mm(297.0), "Layer 1", );
let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
let current_layer = doc.get_page(page1).get_layer(layer1); current_layer.use_text("Bonjour le monde !", 24.0, Mm(20.0), Mm(280.0), &font);
doc.save(&mut File::create("output.pdf").unwrap()).unwrap();}2. genpdf — génération de rapports de haut niveau
genpdf est construit au-dessus de printpdf et fournit une API pratique pour créer des documents avec des tableaux, des titres, des paragraphes et des styles. Idéal pour les rapports où la structure est importante, plutôt que le positionnement manuel.
Installation :
[dependencies]genpdf = "0.3"Exemple : rapport avec un tableau
use genpdf::{Document, SimplePageSettings};use genpdf::elements::{Paragraph, Table, TableLayout};use genpdf::fonts::FontFamily;
fn main() { let font_family = FontFamily::from_files( "/usr/share/fonts/truetype/dejavu/", "DejaVuSans", None, ).unwrap();
let mut doc = Document::new(font_family); doc.set_title("Rapport de ventes");
let mut table = Table::new(TableLayout::new(vec![2, 3, 3])); table.row() .element(Paragraph::new("Produit")) .element(Paragraph::new("Quantité")) .element(Paragraph::new("Prix"));
table.row() .element(Paragraph::new("Ordinateur portable")) .element(Paragraph::new("10")) .element(Paragraph::new("1200 $"));
doc.push(table); doc.render_to_file("report.pdf").unwrap();}3. wkhtmltopdf — HTML vers PDF via WebKit
Si vous préférez concevoir des rapports en HTML/CSS, utilisez l'encapsulation de l'utilitaire wkhtmltopdf. Il convertit un modèle HTML en PDF, prenant en charge les styles, les images et JavaScript.
Installation :
[dependencies]wkhtmltopdf = "0.4"Exemple : conversion HTML
use wkhtmltopdf::*;
fn main() { let html = r#" <h1>Rapport mensuel</h1> <p>Ventes : <strong>150 000 ₽</strong></p> <table border="1"> <tr><td>Janvier</td><td>50 000</td></tr> <tr><td>Février</td><td>100 000</td></tr&g