Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 生成网页的PDF_Node.js_Pdf_Phantomjs_Html To Pdf_Webpage Rendering - Fatal编程技术网

Node.js 生成网页的PDF

Node.js 生成网页的PDF,node.js,pdf,phantomjs,html-to-pdf,webpage-rendering,Node.js,Pdf,Phantomjs,Html To Pdf,Webpage Rendering,我正在尝试生成网页的pdf文件,并希望保存到本地磁盘,以便稍后发送电子邮件 我曾尝试过这种方法,但问题是,它不适用于这样的页面。我能够生成pdf,但它与网页内容不匹配 很明显,pdf是在documentready之前生成的,或者可能是其他内容。我想不出确切的问题。我只是在寻找一种方法,可以将网页输出保存为pdf 我希望在节点中生成网页的pdf比在php中更合适?如果php中有任何解决方案可用,那么它将是一个很大的帮助,甚至节点实现也很好。我使用html-pdf包做了类似的事情 代码很简单,您可以

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

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

很明显,
pdf
是在
documentready
之前生成的,或者可能是其他内容。我想不出确切的问题。我只是在寻找一种方法,可以将网页输出保存为
pdf


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

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

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

pdf.create(html, options).toFile('./YourPDFName.pdf', function(err, res) {
        if (err) {
          console.log(err);
        }
});
请在软件包页面中查看更多信息

希望对你有帮助

很明显,pdf是在文档准备就绪之前生成的

非常正确,因此必须等到脚本加载并执行之后。
您已链接到使用节点模块的答案

该模块从那时起升级,现在支持异步/等待函数,使脚本更具可读性

如果我可以建议一个使用async/await版本(版本4.x,需要节点8+)的解决方案


在我的开发机器上,等待图表准备就绪需要600毫秒。比等待超时(3000)
或任何其他任意秒数要好得多。

您可以共享代码吗?您可能需要设置超时以确保整个页面,包括javascript生成的部分在呈现之前已经准备好了…@xybrek我在发布这个问题之前已经尝试过setTimeout,但也没有use@Vaviloff我尝试了与“c”中提到的相同的代码片段,只是我更改了您可以选择生成屏幕截图的位置。我试过了,它似乎只适用于本地html文件,而不适用于远程URL。谷歌图表没有反映到PDF中。有什么方法可以转换图表吗?但我认为这不是理想的解决方案,因为我们不知道页面加载的确切时间!有这方面的活动吗?有。为了简化示例,我没有使用它,但为了节省时间,您肯定应该将主登录名移动到此回调中。我曾尝试过
onLoadFinished
,但页面在加载之前呈现,示例代码是不是我的错,
onLoadFinished
与此无关-我们必须等待脚本完成其工作。所以我改变了答案,只等待必要的时间,不再等待。
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();
})();