Génération de rapports PDF en JavaScript (Node.js) : Puppeteer, PDFKit, jsPDF

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Génération de rapports PDF en JavaScript (Node.js) : Puppeteer, PDFKit, jsPDF



La création de documents PDF est l'une des tâches les plus courantes en développement web. Rapports, factures, certificats, documentation — tout cela nécessite un outil fiable pour générer des fichiers côté serveur. Dans l'écosystème Node.js, il existe plusieurs bibliothèques puissantes, chacune résolvant le problème à sa manière. Dans cet article, nous allons examiner trois approches principales : l'émulation de navigateur avec Puppeteer, le travail de bas niveau avec PDF via PDFKit et la solution client-serveur jsPDF.



1. Puppeteer — génération de PDF à partir de HTML/CSS



Puppeteer est une bibliothèque pour contrôler un navigateur Chromium sans tête. Elle permet de charger n'importe quelle page HTML, d'appliquer des styles et de la « photographier » en PDF. C'est le choix idéal si vous avez déjà une mise en page de rapports en HTML/CSS et que vous souhaitez une reproduction exacte en PDF.



Fonctionnalités principales :

  • Prise en charge de toutes les propriétés CSS (Flexbox, Grid, polices, ombres).
  • Interaction avec JavaScript sur la page (graphiques Chart.js, tableaux dynamiques).
  • Configuration du format, des marges, des en-têtes/pieds de page, des arrière-plans.
  • Prise en charge des polices personnalisées (TTF, OTF).


Exemple de génération de rapport :



const puppeteer = require('puppeteer');

async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();

// Charger le HTML directement (ou par URL) await page.setContent(` <html> <head> <style> body { font-family: Arial; padding: 40px; } h1 { color: #2c3e50; } .data { background: #ecf0f1; padding: 20px; } </style> </head> <body> <h1>Rapport de ventes</h1> <div class="data"> <p>Chiffre d'affaires : 1 200 000 roubles</p> <p>Nombre de commandes : 345</p> </div> </body> </html> `, { waitUntil: 'networkidle0' });

await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true, margin: { top: '20mm', bottom: '20mm' } });

await browser.close(); console.log('PDF créé !');}

generateReport();


Avantages : précision de la mise en page, prise en charge des mises en page complexes, travail avec des graphiques.

Inconvénients : consommation mémoire élevée (Chromium pèse ~200 Mo), démarrage lent.



2. PDFKit — création de PDF de bas niveau



PDFKit est une bibliothèque pour manipuler directement la structure PDF. Vous n'utilisez pas de HTML, mais construisez le document par programmation : vous dessinez des lignes, ajoutez du texte, insérez des images. Cela vous donne un contrôle total sur chaque pixel du document.



Fonctionnalités principales :

  • Graphiques vectoriels (lignes, rectangles, courbes).
  • Prise en charge d'Unicode et intégration de polices.
  • Création de tableaux, numérotation des pages.
  • Travail avec des annotations et des liens.


Exemple de création d'une facture simple :



const PDFDocument = require('pdfkit');const fs = require('fs');

const doc = new PDFDocument({ size: 'A4', margin: 50 });doc.pipe(fs.createWriteStream('invoice.pdf'));

// Titredoc.fontSize(24).text('Facture n° 12345', { align: 'center' });doc.moveDown();

// Tableau (manuellement)doc.fontSize(12).text('Désignation', 50, 150);doc.text('Quantité', 350, 150);doc.text('Prix', 450, 150);

doc.moveTo(50, 170).lineTo(550, 170).stroke();

doc.text('Services de développement', 50, 180);doc.text('1', 350, 180);doc.text('150 000 roubles', 450, 180);

doc.moveDown(2);doc.fontSize(16).text('Total : 150 000 roubles',

Recommendations