我有一个动态生成PDF的应用程序(通过service / generatePdf访问)。
它返回一个HTTP响应,其内容类型=" application / pdf"并且outputStream设置为二进制内容。
根据业务规范,当用户点击按钮时,我们需要打开一个显示该PDF的新窗口/标签。
提交下面的表格,一切都在Happy Path上精彩地发挥作用,其中响应是实际的PDF。
<form action="service/generatePdf" method="post" name="PdfForm" target="_blank">
然而,不能正常工作的是,无法以任何理由生成PDF。例如,假设HTTP响应outputStream为空。
我想要能够做的是在第一页上显示一条漂亮的错误消息,而不是打开新窗口/标签。
但似乎没有办法做到这一点。你的选择似乎是
我已经尝试过jQuery,Ajax,jQuery Form Plugin,jQuery Download plugin插件,但似乎没有任何效果。
答案 0 :(得分:4)
服务器应通过HTTP状态代码指示错误或成功(例如200 = OK,500 =错误)。这可以通过JQuery
在REST客户端中捕获$.ajax({
url: 'service/generatedPDF',
error: function(jqXHR, textStatus, errorThrown) {
... // show error message
},
).done(function(data) {
// data contains the PDF
}
最好在服务器上创建PDF,将其放在临时存储中,然后在响应中将URL发送到此PDF。客户端下载文件后,或在某次下载后,将从商店中删除PDF。
在这种情况下,您只需打开一个新窗口,其中包含您从服务器收到的URL。
如果服务器在初始请求中提供PDF,您可以将其转换为Data URI并在新窗口中打开该数据URI。
答案 1 :(得分:0)
这是一个相当普遍的要求。您需要使您的REST应用程序更智能一点。它需要检查LiveCycle PDF生成的结果,如果不成功,则返回HTML响应(内容类型为text / html)。
浏览器相当愚蠢。它检查传入响应的内容类型,并根据内容类型启动插件。然后由插件来处理响应。 PDF插件也不那么明亮,它假设传入的数据流是PDF,如果它是空的,则会产生错误。
这里的关键是向浏览器发送正确的内容类型(和内容),这意味着如果PDF结果失败,请检查PDF结果并发送更合适的响应。
我们经常在LiveCycle业务流程中看到这一点。诱惑是将PDF生成为com.adobe.idp.Document对象,然后直接返回该对象。这会导致您描述的类似问题。相反,更好的方法是检查PDF生成的结果。 如果有效,则返回该响应。如果PDF生成失败,则在com.adobe.idp.Document对象(具有相应的text / html内容类型)中构造HTML响应,然后返回该响应。