Génération de rapports PDF en JavaScript (Node.js) : Guide complet
La création de documents PDF est l'une des tâches les plus demandées en développement web. Qu'il s'agisse d'exporter des factures, de générer des rapports analytiques ou de créer des certificats, un outil fiable est indispensable. Dans l'écosystème Node.js, il existe plusieurs bibliothèques puissantes qui permettent de résoudre cette tâche rapidement et avec flexibilité. Dans cet article, nous analyserons trois approches principales et montrerons comment choisir l'outil adapté à votre projet sur PythonLib.
Pourquoi générer des PDF sur le serveur ?
La génération côté client (navigateur) est souvent limitée : l'utilisateur peut perdre des données lors du rafraîchissement de la page, et les appareils mobiles ne traitent pas toujours correctement les mises en page complexes. L'approche serveur avec Node.js offre un contrôle total sur la structure du document, protège la logique commerciale et permet d'intégrer la génération dans les pipelines CI/CD.
Top 3 des bibliothèques pour travailler avec les PDF dans Node.js
1. PDFKit — travail de bas niveau avec le contenu
PDFKit est la bibliothèque la plus populaire pour créer des PDF à partir de zéro. Elle ne nécessite pas l'installation de dépendances supplémentaires (comme Chromium) et permet de contrôler chaque pixel du document.
- Avantages : légère (quelques mégaoctets seulement), liberté totale de mise en page, prise en charge des polices, images, graphiques vectoriels.
- Inconvénients : nécessite beaucoup de code pour les mises en page complexes, pas de retour à la ligne automatique.
Exemple de création d'une facture simple :
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument({ margin: 50 });
doc.pipe(fs.createWriteStream('invoice.pdf'));
// Titredoc.fontSize(25).text('Facture n°123', { align: 'center' });doc.moveDown();
// Tableaudoc.fontSize(12).text('Produit : Consultation', { continued: true }) .text('Prix : 5000 RUB', { align: 'right' });
doc.moveDown();doc.text('Total : 5000 RUB', { align: 'right' });
doc.end();2. Puppeteer — génération à partir de HTML/CSS
Puppeteer lance un navigateur headless Chromium et convertit une page HTML en PDF. C'est le choix idéal si vous avez déjà des modèles en HTML avec des styles CSS.
- Avantages : mise en page simple via HTML, prise en charge de toutes les propriétés CSS (flex, grid, @media print), possibilité d'ajouter des en-têtes et pieds de page.
- Inconvénients : dépendance lourde (~300 Mo de Chromium), démarrage lent, ne convient pas aux documents simples.
Exemple de conversion HTML en PDF :
const puppeteer = require('puppeteer');
async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();
await page.setContent(`<h1 style="color: blue;">Rapport pour mars 2025</h1> <p>Chiffre d'affaires total : <strong>1 200 000 RUB</strong></p>`);
await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true, margin: { top: '20px', bottom: '20px' } });
await browser.close();}
generateReport();3. jsPDF — outil universel (client + serveur)
jsPDF est une bibliothèque qui fonctionne à la fois dans le navigateur et dans Node.js. Elle fournit des méthodes de haut niveau pour créer des tableaux, des graphiques et même intégrer des polices.
- Avantages : API simple, prise en charge intégrée des tableaux (via un plugin), poids léger.
- Inconvénients : sur le serveur, nécessite une configuration manuelle des polices (tous les caractères cyrilliques ne sont pas présents par défaut).
Exemple avec un tableau :
const { jsPDF } = require("jspdf");require("jspdf-autotable");
const doc = new jsPDF();
doc.text("Statistiques des ventes", 14, 20);
doc.autoTable({ head: [['Mois', 'Ventes', 'Bénéfice']], body: [ ['Janvier', '100', '20 000'], Aussi dans la bibliothèque
Planificateur de tâches en C++ : créer un Task Scheduler de zéro
Travailler avec CSV en PHP : lecture, écriture et traitement des données
GraphQL en TypeScript : Bibliothèques pour des API typés sécurisés