我正在尝试在phantomjs示例中创建自定义页脚:https://github.com/ariya/phantomjs/blob/master/examples/printheaderfooter.js
这是我的代码:
var phantom = require('node-phantom');
phantom.create(function (err, ph) {
ph.createPage(function (err, page) {
page.set('paperSize', {
format: 'A4',
orientation: 'portrait',
footer: {
contents: ph.callback(function (pageNum, numPages) {
if (pageNum == 1) {
return "";
}
return "<h1>Header <span style='float:right'>" + pageNum + " / " + numPages + "</span></h1>";
})
}
}, function () {
page.open('http://www.google.com', function () {
})
})
})
});
但不幸的是我收到以下错误:
TypeError: Object #<Object> has no method 'callback';
是不是ph不暴露回调方法的错误?
答案 0 :(得分:6)
您的脚本中存在两个问题:
ph
不是经典的幻像对象,而是代理对象。 node-phantom
使用Web套接字来调用phantomjs。当然,使用此实现会丢失一些功能。 page.set
时,打印自定义页眉/页脚还需要调用phantom.callback。此方法未记录,因此node-phantom
未公开(并且不能)。我们需要找到一种方法在这个包中应用这个方法。
有很多解决方案。这是我可能的解决方案:
在脚本中的字符串中序列化您的函数
var phantom = require('node-phantom');
phantom.create(function (err, ph) {
ph.createPage(function (err, page) {
page.set('paperSize', {
format: 'A4',
orientation: 'portrait',
header: {
height: "1cm",
contents: 'function(pageNum, numPages) { return pageNum + "/" + numPages; }'
},
footer: {
height: "1cm",
contents: 'function(pageNum, numPages) { return pageNum + "/" + numPages; }'
}
}, function () {
page.open('http://www.google.fr', function () {
page.render('google.pdf');
ph.exit();
})
})
})
});
编辑bridge.js并添加phantom.callback + eval。这允许我们重新插入页眉/页脚.contents。
case 'pageSet':
eval('request[4].header.contents = phantom.callback('+request[4].header.contents+')');
eval('request[4].footer.contents = phantom.callback('+request[4].footer.contents+')');
page[request[3]]=request[4];
respond([id,cmdId,'pageSetDone']);
break;
正如你所看到的那样有效! (谷歌法语)
答案 1 :(得分:1)
不幸的是,node-phantom似乎不支持phantom.callback
。由于该项目已停用超过一年,我认为不太可能在不久的将来更新。
另一方面,phantomjs-node支持phantom.callback()
版本0.6.6。您可以像这样使用它:
var phantom = require('phantom');
phantom.create(function (ph) {
ph.createPage(function (page) {
page.open("http://www.google.com", function (status) {
var paperConfig = {
format: 'A4',
orientation: 'portrait',
border: '1cm',
header: {
height: '1cm',
contents: ph.callback(function(pageNum, numPages) {
return '<h1>My Custom Header</h1>';
})
},
footer: {
height: '1cm',
contents: ph.callback(function(pageNum, numPages) {
return '<p>Page ' + pageNum + ' / ' + numPages + '</p>';
})
}
};
page.set('paperSize', paperConfig, function() {
// render to pdf
page.render('path/to/file.pdf', function() {
page.close();
ph.exit();
});
});
});
});
});
您还可以在this gist上看到。
答案 2 :(得分:0)
node phantom似乎通过create函数公开这个代理对象(这应该是你的ph-object):
var proxy={
createPage:function(callback){
request(socket,[0,'createPage'],callbackOrDummy(callback));
},
injectJs:function(filename,callback){
request(socket,[0,'injectJs',filename],callbackOrDummy(callback));
},
addCookie: function(cookie, callback){
request(socket,[0,'addCookie', cookie],callbackOrDummy(callback));
},
exit:function(callback){
request(socket,[0,'exit'],callbackOrDummy(callback));
},
on: function(){
phantom.on.apply(phantom, arguments);
},
_phantom: phantom
};
这意味着你可以像这样访问幻像回调:
ph._phantom.callback
答案 3 :(得分:0)
我在这里访问了phantom.callback:
将此添加到node-phantom.js第202行:
callback: function(callback){
request(socket,[0,'callback'],callbackOrDummy(callback));
},
在_phantom: phantom
并将其添加到bridge.js第45行:
case 'callback':
phantom.callback(request[3]);
break;
希望它有所帮助!