Node.js: esportare i dati in formato PDF

Node.js: esportare i dati in formato PDF

In Node.js possiamo esportare i dati in formato PDF utilizzando dei moduli specifici.

Installiamo i moduli richiesti:


npm install phantomjs-prebuilt --save
npm install html-pdf --save
npm install express-pdf --save

Possiamo creare una classe helper per l'esportazione. Dobbiamo tenere presente che occorre utilizzare URL assoluti nel contenuto HTML, sia per il file CSS usato per il rendering sia per le eventuali immagini.


'use strict';

class PDF {
    constructor() {
        this.css = '';
        this.html = '';
    }


    setCSS(path) {
        // URL assoluto
        this.css = '<link rel="stylesheet" href="' + path + '" />';
    }

    build(str) {
        this.html += '<html><head>' + this.css + '</head><body><div id="pageContent">';
        this.html += str;
        this.html += '</div></body></html>';
    }
}

module.exports = PDF;

Quindi avremo:


'use strict';

const express = require('express');
const pdf = require('express-pdf');
const mongoose = require('mongoose');

mongoose.Promise = Promise;
mongoose.connect('mongodb://user:password@127.0.0.1/db');

const Documents = require('./models/Documents');
const pdfClass = require('./lib/pdf');
const port = process.env.PORT || 8383;
const app = express();

app.use(pdf);

app.get('/export/:id', function(req, res) {
    let id = req.params.id;
    Documents.findById(id).then(function(doc) {
    
      let renderer = new pdfClass();
      
      let html = doc.content;
      
      renderer.setCSS('http://site.com/styles/pdf.css');
      renderer.build(html);

      res.pdfFromHTML({
          filename: doc.title + '.pdf',
          htmlContent: renderer.html
      });
    }).catch(function(err) {
        // Errore
    });
});

app.listen(port);

Il foglio di stile CSS è un foglio di stile per la stampa. Floating e posizionamento sono supportati ma occorre utilizzare unità di misura specifiche. Ad esempio:


@media print {
    body {
        font-family: sans-serif;
        font-size: 12px;
    }
    p, pre, ol, ul, dl, blockquote {
        line-height: 20px;
        page-break-inside: avoid;
    }

    img {
        display: block;
        max-width: 100%;
        height: auto;
    }

    #pageContent {
        padding: 0 20pt;
    }
}

Torna su