Генерация PDF веб-страницы - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь сгенерировать pdf файл веб-страницы и хочу сохранить его на локальном диске для последующей отправки по электронной почте.

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

Совершенно очевидно, что pdf генерируется до document ready или может быть чем-то другим. Я не могу понять точную проблему. Я просто ищу подход, в котором я могу сохранить вывод веб-страницы как pdf.

Надеюсь, создание pdf веб-страницы более подходит для node, чем php? Если доступно какое-либо решение в php, тогда это будет большой помощью, или даже реализация узла тоже подойдет.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Очень ясно, что 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) или любое другое произвольное количество секунд.

0 голосов
/ 08 мая 2018

Я сделал что-то похожее, используя html-pdf package.

Код прост, вы можете использовать так:

pdf.create(html, options).toFile('./YourPDFName.pdf', function(err, res) {
        if (err) {
          console.log(err);
        }
});

Подробнее об этом можно узнать на странице пакета здесь .

Надеюсь, это поможет вам.

...