我有一个servlet,它将pdf文件作为ByteArrayOutputStream写入servlet的输出流。 如果我打开servlet URL,浏览器将打开该文件。 但是如果在servlet上发生错误,浏览器会打开一个带有错误消息的空pdf。 通过ServletResponse发送错误,浏览器将打开默认错误页面。
我想发送错误消息,而不会重定向到错误页面或打开无效的pdf文件。
我试过了:
new Ajax.Request('/pdfservlet', {
onSuccess: function(response) {
docWindow = window.open('','title');
docWindow.document.open('application/pdf');
docWindow.document.write(response);
docWindow.document.close();
},
onFailure: function(response) {
alert(response);
}
});
但是,onSuccess打开一个页面 [对象对象]
如何使用JavaScript打开PDF文件?
答案 0 :(得分:10)
注意:我假设您正在使用Ajax.Request
调用中的Prototype框架。
response object并不是直接编写的,但它具有responseText
属性,该属性应包含返回的PDF。
你试过了吗?
new Ajax.Request('/pdfservlet', {
onSuccess: function(response) {
docWindow = window.open('','title');
docWindow.document.open('application/pdf');
document.write(response.responseText);
docWindow.document.close();
},
onFailure: function(response) {
alert(response);
}
});
(注意添加的.responseText
)
编辑:好的,这样做无效......试试这样的事情:
new Ajax.Request('/pdfservlet', {
onSuccess: function(response) {
window.open('/pdfservlet');
},
onFailure: function(response) {
alert(response);
}
});
这样做是创建ajax请求,如果成功则在新窗口中打开它。打开新窗口应该很快,实际上并不需要再次请求PDF,因为浏览器应该在Ajax.Request调用期间缓存它。
答案 1 :(得分:2)
你可以尝试“两次通过”的方法。您使用Ajax来调用servlet(如果它在运行中生成PDF,请将其缓存)。如果成功,则使用参数将用户重定向到servlet以加载缓存的PDF。
还有其他选项,但这取决于您使用PDF的方式。
我的0.02美元..
答案 2 :(得分:0)
由于您似乎将PDF发送为“内联”而不是“附件”,因此您可以将PDF的网址放入动态创建的iframe中,然后将该iframe附加到叠加层。那会有用。
-jP
答案 3 :(得分:0)
但是如果在servlet上发生错误,浏览器会打开一个带有错误消息的空pdf。
在我看来,尝试在服务器端修复此问题比使用AJAX和缓存的所有这些脆弱的东西更好。为什么servlet错误仍然设置'Content-Type:application / pdf'标头及其错误消息?检查servlet中发送内容的顺序;在您成功创建PDF并准备好返回之前,请不要发送“内容类型”。