Génération de rapports PDF en Rust avec la bibliothèque printpdf
Dans le développement web moderne, la création de documents PDF reste une tâche courante – de la génération de factures et de rapports à l'exportation de données. Si votre projet est écrit en Rust ou si vous l'utilisez pour le backend, la bibliothèque printpdf sera un outil fiable pour la génération de PDF. Dans cet article, nous explorerons les capacités de printpdf, montrerons des exemples de code et discuterons de la manière de l'intégrer dans un projet éducatif.
Qu'est-ce que printpdf ?
printpdf est une bibliothèque Rust pure pour la création de documents PDF sans dépendances externes. Elle permet de :
- Créer des documents multipages avec un contenu arbitraire
- Ajouter du texte avec différentes polices (y compris TrueType et OpenType)
- Dessiner des lignes, des rectangles, des ellipses et des chemins complexes
- Intégrer des images (JPEG, PNG)
- Travailler avec des tableaux et des grilles
- Gérer les espaces colorimétriques (RVB, CMJN, Niveaux de gris)
Le principal avantage est l'autonomie totale : aucune installation de LaTeX, wkhtmltopdf ou d'autres systèmes n'est nécessaire. Cela fait de printpdf un choix idéal pour le site éducatif pythonlib.ru, où la simplicité de déploiement et la reproductibilité des exemples sont importantes.
Installation et premier document
Ajoutez la dépendance dans Cargo.toml :
[dependencies]printpdf = "0.7"Créons un PDF très simple avec du texte :
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 premier PDF", Mm(210.0), Mm(297.0), "Layer 1" );
// Obtenir la police par défaut let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Ajouter du texte let current_layer = doc.get_page(page1).get_layer(layer1); current_layer.use_text( "Bonjour, PythonLib!", 24.0, Mm(10.0), Mm(280.0), &font );
// Enregistrer le fichier let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut writer).unwrap();
println!("PDF créé : hello.pdf");}Ce code crée un PDF d'une seule page avec un texte. Notez que use_text accepte les coordonnées en millimètres et la taille de la police en points.
Travailler avec les graphiques et les couleurs
printpdf prend en charge le dessin de primitives. Créons un rapport avec une ligne et un rectangle rempli :
use printpdf::*;
fn create_report() -> (PdfDocumentReference, PdfPageIndex, PdfLayerIndex) { let (doc, page, layer) = PdfDocument::new( "Rapport", Mm(210.0), Mm(297.0), "Data" );
let layer = doc.get_page(page).get_layer(layer);
// Dessiner une ligne rouge 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);
// Rectangle bleu rempli 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)}Les couleurs sont définies dans une plage de 0,0 à 1,0. Pour le CMJN, utilisez Color::Cmyk(Cmyk::new(0.0, 1.0, 0.0, 0.0)).
Intégration d'images
Ajoutons un logo au rapport :
use printpdf::*;use std::fs::Fi