我这里有一个巨大的问题。我想使用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代码添加到标题中?
答案 0 :(得分:1)
因此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))
}
})
});