Generare PDF dinamici con Node.js ed Express

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.

Torna su