Si l’on souhaite générer des PDF « riches » sur un projet utilisant NodeJs et ExpressJs, en particulier des PDF affichant des tableaux, le plus simple est d’utiliser pdfmake. On commence donc par installer la dépendance :
npm install pdfmake
La suite est juste un exemple concret d’utilisation sur une URL affichant directement le document PDF. Car je n’ai pas trouvé la documentation claire à ce sujet. Une fois que vous avez cette base il devient simple de mettre en page les éléments comme on le souhaite en utilisant les exemples de la documentation
router.get('/pdf', function (req, res) {
//on importe les font à utiliser, voir https://pdfmake.github.io/docs/fonts/standard-14-fonts/ pour les font disponible par défaut
var fonts = {Helvetica: {normal: 'Helvetica', bold: 'Helvetica-Bold', italics: 'Helvetica-Oblique', bolditalics: 'Helvetica-BoldOblique'}, };
//exemple de contenu du PDF
var dd = {
//les differents contenus
content: [
{
//en premier 2 colonnes contenant une imag et un texte
columns: [
{image: './chemin/vers/mon-image.jpg', width: 100},//attention si l'image n'existe pas ça plante
//un texte avec différents style
{text: [
'MON TITRE ',
{text: 'N° 999', color: 'red'}//on indique directement la proriété de style color
],
style: 'titleStyle'//style définis plus bas
}
]
},
'\n\n', //sauts de ligne
{text: 'titre du tableau', style: 'tableHeader'},
{style: 'tableExample',
table: {
body: [
[{text: 'titre de colonne 1', style: 'tableHeader'}, {text: 'titre de colonne 2', style: 'tableHeader'}, ],
['contenus de ma colonne', 'un autre contenu'],
]
}
},
],
//les différents styles à appliquer
styles: {
tableExample: {margin: [0, 5, 0, 15]},
tableHeader: {bold: true, fontSize: 12, color: 'black'},
titleStyle: {bold: true, fontsize: 14, alignment: 'right'}
},
defaultStyle: {font: 'Helvetica', columnGap: 20}
};
//on apelle pdfmake
var PdfPrinter = require('pdfmake/src/printer');
//avec les fonts à utiliser
var printer = new PdfPrinter(fonts);
//on passe notre contenu
let pdf = printer.createPdfKitDocument(dd);
//on termine et on envoie les bon headers
pdf.pipe(res);
pdf.end();
res.statusCode = 200;
res.setHeader('Content-type', 'application/pdf');
});
//on importe les font à utiliser, voir https://pdfmake.github.io/docs/fonts/standard-14-fonts/ pour les font disponible par défaut
var fonts = {Helvetica: {normal: 'Helvetica', bold: 'Helvetica-Bold', italics: 'Helvetica-Oblique', bolditalics: 'Helvetica-BoldOblique'}, };
//exemple de contenu du PDF
var dd = {
//les differents contenus
content: [
{
//en premier 2 colonnes contenant une imag et un texte
columns: [
{image: './chemin/vers/mon-image.jpg', width: 100},//attention si l'image n'existe pas ça plante
//un texte avec différents style
{text: [
'MON TITRE ',
{text: 'N° 999', color: 'red'}//on indique directement la proriété de style color
],
style: 'titleStyle'//style définis plus bas
}
]
},
'\n\n', //sauts de ligne
{text: 'titre du tableau', style: 'tableHeader'},
{style: 'tableExample',
table: {
body: [
[{text: 'titre de colonne 1', style: 'tableHeader'}, {text: 'titre de colonne 2', style: 'tableHeader'}, ],
['contenus de ma colonne', 'un autre contenu'],
]
}
},
],
//les différents styles à appliquer
styles: {
tableExample: {margin: [0, 5, 0, 15]},
tableHeader: {bold: true, fontSize: 12, color: 'black'},
titleStyle: {bold: true, fontsize: 14, alignment: 'right'}
},
defaultStyle: {font: 'Helvetica', columnGap: 20}
};
//on apelle pdfmake
var PdfPrinter = require('pdfmake/src/printer');
//avec les fonts à utiliser
var printer = new PdfPrinter(fonts);
//on passe notre contenu
let pdf = printer.createPdfKitDocument(dd);
//on termine et on envoie les bon headers
pdf.pipe(res);
pdf.end();
res.statusCode = 200;
res.setHeader('Content-type', 'application/pdf');
});