将标题添加到Node Webshot生成的PDF中

时间:2014-11-16 20:21:05

标签: javascript node.js pdf phantomjs

我正在尝试为使用node-webshot生成的PDF添加标题,但没有显示任何内容。

我正在使用此代码:

webshot('https://www.google.com', 'google.pdf', options, function (err) {
    if(err) throw err;
    console.log('Saved to PDF');
});

使用这样的选项对象:

var options = {
        "paperSize": {
            "format": "A4", 
            "orientation": "portrait", 
            "border": "0.25cm",
            "header": {
                "height": "2cm",
                "contents": function () {
                    return phantom.callback(function(pageNum, numPages) {
                        return '<h1>' + pageNum + ' / ' + numPages + '</h1>';
                    });
                }
            }
        }
    };

我尝试在PhantomJS documentation上显示它的内容功能,但它不起作用,因为没有定义幻像。我找不到任何使用webshot添加页眉/页脚的示例。

PDF正确生成,但标题为空白,未写入任何内容。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我知道这个问题已经超过一年了,但对于那些遇到与上述相同问题的人来说,eval()并不适用于我。我最终做的是在同一地点添加以下代码:

if (key === "paperSize" && page[key] && page[key].header && page[key].header.contents) {
    var header = {
      "height": page[key].header.height,
      "contents": phantom.callback(function() {return options.paperSize.header.contents;})
    }
    page.paperSize.header = header;
  }
  if (key === "paperSize" && page[key] && page[key].footer && page[key].footer.contents) {
    var footer = {
      "height": page[key].footer.height,
      "contents": phantom.callback(function() {return options.paperSize.footer.contents;})
    }
    page[key].footer = footer
  }
  if (key === "paperSize") {
    page.paperSize = {
      "format": options.paperSize.format,
      "orientation": options.paperSize.orientation,
      "margin": options.paperSize.margin,
      "header": header,
      "footer": footer
    }
  }

这样做的原因是webshot字符串化了options对象中的所有数据,因此使用phantomjs呈现页眉和页脚所需的phantom.callback不能正确地进行字符串化。相反,您需要在选项对象中添加要在页眉/页脚中使用的html,然后将其插入到上面代码中的phantom.callback中。这种方法的唯一问题是你不能将numPages和pageNum参数与回调一起使用。

答案 1 :(得分:0)

由于选项作为对象传递到webshot中并且“回调”是直接的,因此无法修改webshot。

所以将行从here(文件node-webshot / lib / webshot.phantom.js)更改为:

optUtils.phantomPage.forEach(function(key) {
  if (toOverwrite[key]) page[key] = toOverwrite[key];
  if (key === "paperSize" && page[key] && page[key].header && page[key].header.contents) {
    page[key].header.contents = eval(page[key].header.contents);
  }
  if (key === "paperSize" && page[key] && page[key].footer && page[key].footer.contents) {
    page[key].footer.contents = eval(page[key].footer.contents);
  }
});

前提是您将标题内容函数组成一个字符串,如下所示:

"contents": "phantom.callback(function(pageNum, numPages) { return '<h1>' + pageNum + ' / ' + numPages + '</h1>'; })";

它不能作为函数传递,因为在整个选项对象的方式中,它会删除所有函数。