I'm dealing with high volume data. I want to generate a PDF report which contains 1 year data. I'm using html-pdf to do that. The problem is that it is taking around 20 minutes to generate the PDF. Can I decrease it?
I don't want to make my user wait for 20 minutes.
Note:I want to generate PDF on server side only and I want to mail that to user.
I tried for some solutions,but I didn't fond any. But what I observed is that when I'm downloading some file from google, the workflow is very smooth.
I want to know how can I make my workflow smooth
app.post('/api', (req, res) => {
var json = req.body;
var sqlGet = 'SELECT StationId,TimeStamp,data->>"$.temperature" as temperature,data->"$.humidity" as humidity,data->"$.so2" as so2,data->"$.no2" as no2,data->"$.co" as co,data->"$.o3" as o3,data->"$.co2" as co2,data->"$.pm10" as pm10,data->"$.noise" as noise,data->"$.rain" as rain,data->"$.wdir" as wdir,data->"$.wspeed" as wspeed,data->"$.press" as press FROM TwentyStationFiveYearData WHERE StationId = ' + json.stationid + ' AND TimeStamp >= ' + json.start + ' AND TimeStamp <= ' + json.end;
console.log('' + sqlGet);
connection.query(sqlGet, function(err, result) {
if (err) {
console.log('error' + err);
} else {
var htmlCode = generateTable(result, 15);
//var output = fs.createWriteStream('reports/' + json.start + '-' + json.end + '.pdf');
pdf.create(htmlCode, {
orientation: 'landscape',
type: 'pdf',
timeout: '1800000'
}).toStream(function(err, stream) {
if (err) {
console.log('stream did not work ' + err);
} else {
stream.pipe(fs.createWriteStream('output.pdf'));
console.log('pdf generated');
res.send("report will be mailed");
}
});
}
});
});
function generateTable(jsonData, columns) {
var tab = '';
var headers = ['StationId', 'TimeStamp', 'temperature', 'humidity', 'so2', 'no2', 'co', 'o3', 'co2', 'pm10', 'noise', 'rain', 'wdir', 'wspeed', 'press'];
tab += '<tr>';
for (var c = 0; c < columns; c++) {
tab += '<th>';
tab += headers[c];
tab += '</th>';
}
tab += '<tr>';
jsonData.forEach(obj => {
tab += '<tr>';
for (var c = 0; c < columns; c++) {
tab += '<td>';
tab += obj[headers[c]];
tab += '</td>';
}
tab += '</tr>';
});
tab = '<table border = "1">' + tab + '</table>';
return html(tab);
}
function html(table) {
var htmlCode = '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Title</title></head><body>' + table + '</body></html>';
return htmlCode;
}
I want to make my workflow smoother and to decrease the time taken for PDF report generation