Очень ясно, что pdf генерируется до того, как документ готов
Очень верно, поэтому необходимо дождаться окончания загрузки и выполнения скриптов.
Вы связались с ответом, в котором используется модуль узла
фантом .
С тех пор модуль был обновлен и теперь поддерживает функции async / await, которые делают сценарий намного более читабельным.
Если я могу предложить решение, которое использует асинхронную / ожидающую версию (версия 4.x, требуется узел 8 +) .
const phantom = require('phantom');
const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));
(async function() {
const instance = await phantom.create();
const page = await instance.createPage();
await page.property('viewportSize', { width: 1920, height: 1024 });
const status = await page.open('http://www.chartjs.org/samples/latest/charts/pie.html');
// If a page has no set background color, it will have gray bg in PhantomJS
// so we'll set white background ourselves
await page.evaluate(function(){
document.querySelector('body').style.background = '#fff';
});
// Let's benchmark
console.time('wait');
// Wait until the script creates the canvas with the charts
while (0 == await page.evaluate(function(){ return document.querySelectorAll("canvas").length }) ) {
await timeout(250);
}
// Make sure animation of the chart has played
await timeout(500);
console.timeEnd('wait');
await page.render('screen.pdf');
await instance.exit();
})();
На моем компьютере разработчика требуется 600 мс, чтобы дождаться готовности графика. Гораздо лучше, чем await timeout(3000)
или любое другое произвольное количество секунд.