Génération de PDF en Rust : aperçu des bibliothèques et exemples pratiques
Rust est un langage de programmation système de plus en plus utilisé pour créer des applications serveur hautes performances, des services web et des outils en ligne de commande. L'une des tâches courantes lors du développement de tels projets est la génération de documents PDF : rapports, factures, certificats ou simplement fichiers texte formatés. Dans cet article, nous examinerons les principales bibliothèques pour travailler avec les PDF en Rust, leurs fonctionnalités, des exemples de code et des critères de sélection.
Bibliothèques populaires pour la génération de PDF en Rust
Actuellement, dans l'écosystème Rust, on peut distinguer trois bibliothèques principales qui sont activement maintenues et utilisées par la communauté :
- printpdf — une bibliothèque de bas niveau pour créer des documents PDF avec un contrôle total sur le contenu. Prend en charge le texte, les images, les graphiques vectoriels, les tableaux et l'intégration de polices.
- genpdf — une bibliothèque de plus haut niveau, construite sur la base de printpdf. Elle fournit des abstractions pratiques pour travailler avec le texte, les paragraphes, les tableaux et les styles.
- pdf_writer — une autre bibliothèque de bas niveau qui se concentre sur le minimalisme et les performances. Elle permet d'écrire des fichiers PDF directement, mais nécessite une compréhension approfondie du format PDF.
Bibliothèque printpdf
printpdf est l'une des bibliothèques les plus populaires pour la génération de PDF en Rust. Elle fournit une API pour travailler avec des primitives graphiques, du texte et des polices. Principales fonctionnalités :
- Création de documents multipages ;
- Intégration de polices TrueType/OpenType ;
- Dessin de lignes, rectangles, cercles et autres formes ;
- Insertion d'images (PNG, JPEG) ;
- Gestion des couleurs et de la transparence ;
- Prise en charge d'Unicode et du cyrillique.
Exemple de création d'un PDF simple avec du texte en utilisant printpdf :
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( "Exemple PDF en Rust", Mm(210.0), Mm(297.0), "Layer 1", );
// Obtenir la police actuelle (Helvetica intégrée) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();
// Utiliser le calque pour dessiner let layer = doc.get_page(page1).get_layer(layer1);
// Ajouter du texte layer.use_text("Bonjour le monde ! PDF depuis Rust", 24.0, Mm(50.0), Mm(250.0), &font);
// Enregistrer le fichier let file = File::create("hello.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();}Bibliothèque genpdf
genpdf est une surcouche de printpdf qui fournit une API de plus haut niveau. Elle est idéale pour créer des documents avec une mise en forme simple : titres, paragraphes, listes, tableaux. Principaux avantages :
- Gestion automatique des sauts de page ;
- Prise en charge des styles (gras, italique, souligné) ;
- Prise en charge intégrée des tableaux avec cellules et bordures ;
- Interface simple pour ajouter des éléments.
Exemple de création d'un PDF avec un tableau en utilisant genpdf :
use genpdf::*;use genpdf::elements::*;use std::fs::File;
fn main() { // Créer un document let mut doc = Document::new("Liberation Serif") .expect("Échec du chargement de la police");
// Configuration du style par défaut doc.set_title("Rapport de ventes");
// Ajouter un paragraphe doc.push(Paragraph::new("Ventes par mois :"));
// Créer un tableau let mut table = Table::new(vec![2, 3, 2]); table.set_cell_border_style(BorderStyle::Solid); table.push_row(vec![ "Mois".to_string(), "Chiffre d'affaires, RUB".to_stri