生成网页的PDF

时间:2018-05-08 13:59:02

标签: node.js pdf phantomjs html-to-pdf webpage-rendering

我正在尝试生成网页的pdf文件,并想要保存到本地磁盘以便稍后发送电子邮件。

我曾尝试this方法,但问题在于,它不适用于像this这样的网页。我能够生成pdf,但它与网页内容不匹配。

非常清楚pdf之前生成document ready或者可能是其他内容。我无法弄清楚确切的问题。我只是在寻找一种可以将网页输出保存为pdf的方法。

我希望在pdf然后node生成php网页更合适?如果php中的任何解决方案可用,那么它将是一个很大的帮助,甚至节点实现也很好。

2 个答案:

答案 0 :(得分:2)

  

非常清楚pdf是在文档准备好之前生成的

非常正确,因此有必要等到脚本加载并执行完毕。

<小时/> 您链接到使用phantom节点模块的答案。

该模块从那时起进行了升级,现在支持async / await函数,使脚本更具可读性。

如果我建议使用async / await version (版本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)或任何其他任意秒数好多了。

答案 1 :(得分:0)

我使用html-pdf package做了类似的事情。

代码很简单,你可以像这样使用:

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

在包页here中查看有关它的更多信息。

希望对你有所帮助。