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

Inb*_*ano 5 html javascript pdf node.js 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>";
    })
Run Code Online (Sandbox Code Playgroud)

但是,每当我尝试以编程方式对其进行自定义时:

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;
        })
    },
Run Code Online (Sandbox Code Playgroud)

它失败并给我这条消息:

幻像标准输出:语法错误:意外的 EOF

如何将带有一些自定义数据的自定义 HTML 代码放入标题中?

jth*_*_92 2

因此 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))
                    }
                })
            });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我发现的第二个问题是,如果 ejs 文件中有换行符,它将无法工作。另请注意,样式不适用,因此您必须添加内联样式(如果有)。