La generazione di PDF dinamici con Node.js può essere gestita facilmente utilizzando Express come framework web e librerie come pdfkit
per la creazione del documento. In questo articolo vedremo come creare un endpoint REST capace di generare PDF in memoria con layout personalizzato, includendo header, logo e testo.
Prerequisiti
Assicurati di avere Node.js installato e aggiungi le dipendenze necessarie:
npm init -y
npm install express pdfkit body-parser
Struttura dell'applicazione
L'applicazione prevede:
- Un endpoint
POST
per ricevere i dati da inserire nel PDF. - Un generatore PDF che costruisce header, logo e testo.
- Invio del PDF in streaming direttamente nella risposta HTTP.
Codice di esempio
const express = require('express');
const bodyParser = require('body-parser');
const PDFDocument = require('pdfkit');
const app = express();
app.use(bodyParser.json());
function generatePDF(title, content, res) {
const doc = new PDFDocument({ margin: 50 });
// Header con logo e titolo
doc.image('logo.png', 50, 45, { width: 50 })
.fontSize(20)
.text(title, 110, 57)
.moveDown();
// Data in alto a destra
doc.fontSize(12)
.text(new Date().toLocaleDateString(), 400, 65, { align: 'right' });
doc.moveTo(50, 100)
.lineTo(550, 100)
.stroke();
doc.moveDown();
// Corpo del testo
doc.fontSize(12);
content.forEach(paragraph => {
doc.text(paragraph, { align: 'left' });
doc.moveDown();
});
doc.end();
doc.pipe(res);
}
app.post('/generate-pdf', (req, res) => {
const { title, content } = req.body;
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'inline; filename="custom-report.pdf"');
generatePDF(title, content, res);
});
app.listen(3000, () => {
console.log('Server in ascolto su http://localhost:3000');
});
Test dell'endpoint
Puoi testare il servizio con un comando curl, salvando direttamente il PDF generato:
curl -X POST http://localhost:3000/generate-pdf \
-H "Content-Type: application/json" \
-d '{
"title": "Report Mensile",
"content": [
"Benvenuto al nostro report mensile.",
"Le vendite sono aumentate del 15% rispetto al mese scorso.",
"Grazie per l’attenzione."
]
}' --output report.pdf
Considerazioni finali
Con pdfkit
ed Express è possibile generare PDF completamente in memoria e trasmetterli in streaming al client. Questo approccio evita di scrivere file su disco e permette una risposta rapida e dinamica. L'esempio può essere esteso con elementi grafici aggiuntivi, tabelle, piè di pagina e stili personalizzati. Per layout HTML complessi si può considerare l'uso di puppeteer
per generare PDF a partire da pagine HTML con CSS.