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

我这里有一个很大的问题.我想使用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;
        })
    },

它失败并给我这个消息:

phantom stdout: SyntaxError: Unexpected EOF

如何使用一些自定义数据将自定义HTML代码放入标题?

最佳答案 所以phatomjs内容回调有几个方面.

> 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))
                }
            })
        });

>我发现的第二个问题是,如果ejs文件中有换行符,它将无效.作为注释,样式也不适用,因此如果有样式,您必须添加样式内联.

点赞