使用PhantomJS呈现带有图像的HTML

使用PhantomJS呈现带有图像的HTML,phantomjs,Phantomjs,我正在尝试使用PhantomJS(版本1.9.7)从HTML文本创建PDF。我写了一个非常简单的脚本(由于错误回调等而变得更加复杂) phantom.onError=函数(消息,跟踪){ var msgStack=['PHANTOM ERROR:'+msg]; if(trace&&trace.length){ msgStack.push('TRACE:'); trace.forEach(函数(t){ msgStack.push('->'+(t.file | | t.sourceURL)+':'+

我正在尝试使用PhantomJS(版本1.9.7)从HTML文本创建PDF。我写了一个非常简单的脚本(由于错误回调等而变得更加复杂)

phantom.onError=函数(消息,跟踪){
var msgStack=['PHANTOM ERROR:'+msg];
if(trace&&trace.length){
msgStack.push('TRACE:');
trace.forEach(函数(t){
msgStack.push('->'+(t.file | | t.sourceURL)+':'+t.line+(t.function?'(在函数'+t.function+'):'');
});
}
system.stdout.write(msgStack.join('\n'));
幻影。出口(1);
};
var page=require('webpage')。create();
page.viewportSize={宽度:800,高度:600};
page.paperSize={格式:“A4”,方向:“纵向”,边距:“1cm”};
page.onResourceRequested=函数(requestData、networkRequest){
log('Request(#'+requestData.id+):'+JSON.stringify(requestData));
};
page.onResourceReceived=函数(响应){
log('Response(#'+Response.id+',stage'+Response.stage+'):'+JSON.stringify(Response));
};
page.onResourceError=函数(resourceError){
console.log('无法加载资源(#'+resourceError.id+'URL:'+resourceError.URL+'));
console.log('错误代码:'+resourceError.errorCode+'。说明:'+resourceError.errorString);
};
page.onError=函数(消息,跟踪){
var msgStack=['ERROR:'+msg];
if(trace&&trace.length){
msgStack.push('TRACE:');
trace.forEach(函数(t){
msgStack.push(“->”+t.file+”:“+t.line+(t.function?”(在函数“+t.function+”):”)中);
});
}
console.error(msgStack.join('\n'));
};
page.content=“测试”;
页面呈现('tmp.pdf');
setTimeout(函数(){
phantom.exit();
}, 5000);
我设置页面,将简单的HTML字符串分配给content属性,并将其呈现为PDF

此脚本不生成任何输出

我已将问题缩小到
元素,当该元素被删除时,将按预期生成PDF。我可以从回调函数中看到,请求了映像,收到了响应,并且没有报告错误。我尝试过渲染到PNG,但也没有输出


我已经探讨了这可能是代理问题,但是该示例运行时没有任何问题。

当页面完全加载时,您必须调用render。请记住,通过
page.open
page.content
加载页面始终是异步的

将您的代码更改为此

page.content = "<html><body><b>test</b><img src=\"http://www.google.co.uk/images/srpr/logo11w.png\" alt=\"\" border=\"0\" /></body></html>";
setTimeout(function() {
    page.render('tmp.pdf');
    phantom.exit();
}, 5000);
page.content=“测试”;
setTimeout(函数(){
页面呈现('tmp.pdf');
phantom.exit();
}, 5000);

当然可以!在页面加载所有资源之前调用Render。我还找到了
页面。onLoadFinished
回调,这比使用
setTimeout
要好。
page.content = "<html><body><b>test</b><img src=\"http://www.google.co.uk/images/srpr/logo11w.png\" alt=\"\" border=\"0\" /></body></html>";
setTimeout(function() {
    page.render('tmp.pdf');
    phantom.exit();
}, 5000);