Как уменьшить время, затрачиваемое html-pdf на генерацию отчета? - PullRequest
1 голос
/ 08 июня 2019

Я имею дело с данными большого объема.Я хочу создать отчет в формате PDF, который содержит данные за 1 год.Я использую HTML-PDF, чтобы сделать это.Проблема в том, что создание PDF занимает около 20 минут.Могу ли я уменьшить его?

Я не хочу, чтобы мой пользователь ждал 20 минут.

Примечание. Я хочу создать PDF только на стороне сервера и отправить его пользователю по почте..

Я пытался найти некоторые решения, но не нашел ничего.Но я заметил, что когда я скачиваю какой-то файл из Google, рабочий процесс очень плавный.

Я хочу знать, как мне сделать мой рабочий процесс плавным

 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;

}

Я хочучтобы сделать мой рабочий процесс более плавным и сократить время, затрачиваемое на создание отчета в формате PDF

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

npm's html-pdf использует phantomjs. Когда вы используете его, он создает в подпроцессе экземпляр веб-браузера без отображения, затем использует его для визуализации предоставленных вами html-данных, а затем использует тот же экземпляр для печати его в файл PDF. Это работает. Но, как вы обнаружили, это медленно, когда вы даете ему большой HTML-объект.

Тем не менее, 20 минут - это много. Возможно ли, что ваша машина ограничена в ОЗУ? Подпроцесс phantomjs не хватает оперативной памяти и работает?

Возможно pdf-puppeteer быстрее. Это стоит попробовать, и это более перспективно, чем полагаться на фантомные игры , которые уже устарели .

Вы можете попробовать PDFKit . Он генерирует PDF-файлы непосредственно из вашей программы узла. Это будет быстрее, потому что он не требует подпроцесса. Но вы должны переработать свою программу отчетов, чтобы она использовала API PDFKit, а не экземпляр браузера.

Существует несколько решений типа «программное обеспечение как услуга», которые работают как html-pdf, но быстрее. Вы могли бы рассмотреть возможность использования одного из них, особенно если быстрая доставка файлов PDF имеет решающее значение для вашего бизнеса.

Наконец, даже если вы не хотите этого делать, вы можете написать свой HTML и CSS, чтобы он отлично справлялся с форматированием печати. И попросите своего пользователя распечатать.

0 голосов
/ 08 июня 2019

Вы сузили трудоемкие операции?Является ли это PDF-рендеринг наиболее трудоемким?

Что я хотел бы сделать, это проверить необработанный запрос, чтобы увидеть, сколько времени требуется для выполнения.

Во-вторых, я бы проверить размеррезультата и, если это можно как-то сжать и, наконец, я бы проверил рендеринг PDF.

Я использовал dompdf для PHP, и была проблема с производительностью, когда я рендерил png вместо jpg, но я полагаю, что этодело не в этом, поскольку я не вижу рендеринга изображений.

Так что, если вы можете использовать другую библиотеку, то вам лучше сделать это, либо проверить настройку производительности в той, которую вы используете.

Iпредположим, что отрисовка шрифта может занять много времени.

Надеюсь, я дал вам несколько подсказок!

...