如何将变量放入PhantomJS生成的HTML标题中进行PDF转换?

时间:2015-11-25 22:48:37

标签: javascript html node.js pdf phantomjs

我这里有一个巨大的问题。我想使用express.js,phantomjs和EJS从带有自定义页眉和页脚的HTML模板自动生成PDF文件。

任何"硬编码"我都没有任何问题。 PhantomJS中的HTML字符串生成了页脚标题(它们有效):

footer: {
    height: "3cm",
    contents: ph.callback(function(pageNum, numPages) {
        return "<div style='padding: .2em; font-size: 10pt;border-top: 1px solid #ccc; color: #999;'> FOOTER <span style='float:right'> Página " + pageNum + " / " + numPages + "</span></div>";
    })

但是,每当我尝试以编程方式自定义它时:

var pdfHeader = ejs.compile(fs.readFileSync(path.join('server/components/mail/html-templates/pdf-header.html'), 'utf8'));
    pdfHeader = pdfHeader({info: info});

    header: {
        height: "3cm",
        contents: ph.callback(function(pageNum, numPages) {
            if (pageNum == numPages) {
                return "";
            }
            return pdfHeader;
        })
    },

它失败并给我这条消息:

  

幻像标准输出:SyntaxError:意外的EOF

如何将包含一些自定义数据的自定义HTML代码添加到标题中?

1 个答案:

答案 0 :(得分:1)

因此phatomjs内容回调有几个方面。

  1. ph.callback中的函数有自己的上下文。因此,它无法看到自身范围之外的变量。见https://github.com/amir20/phantomjs-node/issues/224。 @zgotts在Git问题中提供的示例对我有用。

    var headerHtml = ejs.compile(fs.readFileSync(path.join('server/components/mail/html-templates/pdf-header.html'), 'utf8'));
    var createHeader = function(html) {
            return function (pageNum, numPages) {
                //console.log(html);
                console.log('Header set!');
                return '%HTML%';
            }.toString().replace(/%HTML%/, html);
        };
    
        renderSession.createPage()
            .then(function(_page) {
                page = _page;
                var file = 'file.pdf';
    
                page.property('paperSize', {
                    format: 'Letter',
                    header: {
                        height: "3.75cm",
                        contents: renderSession.callback(createHeader(headerHtml))
                    }
                })
            });
    
  2. 我发现的第二个问题是,如果ejs文件中有换行符,它就不会起作用。作为注释,样式也不适用,因此如果有样式,您必须添加样式内联。