Générer un PDF avec Node.js et Puppeteer
Vous en avez marre de maintenir votre script de génération de fiche produit PDF (ou votre CV), générez les directement à partir de votre site avec Node.js et Puppeteer.
Pire que la mise en page d'un fichier Word, la mise en page d'un PDF généré par un script... Simplifiez-vous la vie en convertissant directement vos pages web en PDF.
Introduction
Nous allons voir ici comment créer un script Node.js qui vous permettra de générer un PDF à partir d'une page de votre site, dans mon exemple, cela sera ma page CV. Le script tournera en local, mais vous pouvez l'intégrer de manière automatique dans votre CI/CD, je ferai un article plus tard sur le sujet.
Installation
La seule dépendance dont vous avez besoin, Puppeteer qui est un navigateur headless (ou plutôt, il contrôle votre navigateur).
npm install -D puppeteer
Attention si vous utilisez PhantomJS ! La librairie est officiellement stoppée car elle génére de trop grosses failles de sécurité.
Le script complet
tools/pdf-generator.js
// Chargement des dépendances
const puppeteer = require('puppeteer');
(async () => {
// Lancement de Puppeteer
const browser = await puppeteer.launch({
headless: true
});
// Ouverture et navigation vers la page à convertir
const page = await browser.newPage();
await page.goto('http://localhost/ma-super-page-a-convertir', {waitUntil: 'networkidle2'});
// Génération du PDF
await page.pdf({
// Chemin vers le PDF relatif à la racine de votre projet
path: 'src/pdf/mon-super-pdf.pdf',
format: 'A4',
// N'oubliez pas de forcer le printBackground à true
// Car il est possible que dans votre style CSS cela soit l'inverse pour plus d'éfficacité
// Mais là on veut du beau
printBackground: true,
margin: {
top: '0.5cm',
right: '0.5cm',
bottom: '0.5cm',
left: '0.5cm'
}
});
// Fermeture du navigateur et fin du script
await browser.close();
})();
Lancement du script
Pour que le script fonctionne, il faut que votre site soit lancé et l'URL en localhost accessible.
Pour plus de praticité, pensez à ajouter le script dans votre package.json
.
{
"scripts": {
"pdf:build": "node tools/pdf-generator.js"
}
}
Conclusion
Avec ceci, vous avez la possibilité de faire de beaux PDFs rapidement, automatiquement mis à jour et ne nécessitant pas une énième source de données et d'erreur.
Le style de vos PDFs sera logiquement basé sur votre feuille de style avec la media query print
.
C'est parfait, vous avez déjà cela d'implémenté sur votre site... N'est-ce pas ???
Et si vous voulez voir ce que cela donne, il y a un lien en haut à droite sur ma page CV et ce PDF est bien généré via ce script, tout comme ses versions anonymisées.