我在Spring 3,Java,JSP,javascript和jquery中工作,偶尔使用Ajax。我有生成PDF的服务器功能;我有一个新的要求来显示"预览" PDF文档。
我有生成PDF文档的代码,工作正常。我可以通过黑客来源显示它,在我们通常显示未加水印的已完成文档的地方显示它,所以我知道PDF的生成正在发挥作用。
我现在想要做的是在我们的网页上点击按钮(或链接),在自己的标签中显示PDF。有一些限制:
我有一堆数据要从网页传递给控制器,它是生成PDF所需的数据。我们有通过POST方法执行此操作的代码,并使用Ajax发布必要的数据。
将PDF显示在与单击按钮以显示PDF相同的窗口中是不方便的;询问用户是否想要下载或查看其他地方的弹出窗口很好。用户不够精通,无法依赖他们对“后退”的了解。按钮在这里。所以我们希望PDF显示在其他地方,最好是在窗口中的另一个选项卡上,但另一个整个窗口都可以。
目前我的控制器中有以下内容:
response.setContentLength(pdfGenerated.length);
response.setContentType("application/pdf");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setHeader("Content-Disposition", "attachment;filename=\"Preview.pdf\"");
ServletOutputStream out = response.getOutputStream();
out.write(pdfGenerated); // (encodedPdf);
out.flush();
out.close();
ajax调用如下所示:
$("#generatePDFPreview").live("click", function() {
var gridData = getCorrectedGridData();
var valid = validateContractContent(gridData);
if (valid) {
// the call below saves the contract data and then generates its PDF
$.ajax({
url: getModelObject("generatePDFPreviewURL")
,type:'POST'
,data: {'editedContents':JSON.stringify(gridData)}
,datatype: "application/pdf"
,async: false
,success: function(data) {
if(data != null && data.length>0 && data != "Error") {
//data must be contract id...use it to build the complete URL.
//window.location.href = getModelObject("deliveryScreenURL") + data;
window.open("data:application/pdf;base64, " + data);
} else {
alert("PDF preview not generated...Data returned is not ok. Please try again or contact Sales Support.");
}
}
});
}
});
我在这里尝试了不同的东西;我已经取消了成功'功能完全;我已经尝试编码数据(base64)并返回它,并使用数据:application / pdf等,但失败了 - 我有一些证据表明PDF数据太长了,但我不确定(它是85k-90k,URL字符串停止在32784)。
我并不担心我的用户是否安装了PDF阅读器。他们必须安装它才能使用它和应用程序的其他部分。
如此亲密是令人沮丧的;所有证据都表明我们已经完成了大部分工作,只需要告诉浏览器我们希望它使用PDF阅读器来处理这些字节。
有人能指出我们的方法,或指出我们现在所拥有的错误是什么?