在新窗口中显示pdf流

我在服务器中生成一个PDF文档,然后我想在客户端显示。 服务器端如下所示:

ByteArrayOutputStream baos = generatePDF(); response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=file.pdf"); response.setContentLength(baos.size()); baos.writeTo(response.getOutputStream()); 

在客户端,我有以下代码来检索PDF:

 $.ajax({ type: "POST", url: url, data: {"data": JSON.stringify(myData)}, success: function(data, textStatus, jqXHR) { window.open("data:application/pdf," + escape(data)); }, error: function(jqXHR) { showError("..."); } }); 

它看起来很好,新窗口打开,但PDF没有显示。 它总是显示为空文档。

然而,如果客户端看起来像以下,它工作正常:

 var form = $("
").attr({ action : myURL, method : "POST" }); var input1 = $("").attr({ "name": "data", value: JSON.stringify(myData) }); form.append(input1); $("body").append(form); form.submit(); form.remove();

但我不能使用第二种方式因为我需要管理错误,我不能使用form.submit()。

关于PDF发生了什么的任何想法?

您可以获取pdf流的base64字符串并将其传递给响应。

你的方法改变了

 $.ajax({ type: "POST", url: url, data: {"data": JSON.stringify(myData)}, success: function(data, textStatus, jqXHR) { var pdfWin= window.open("data:application/pdf;base64, " + data, '', 'height=650,width=840'); // some actions with this win, example print... }, error: function(jqXHR) { showError("..."); } }); 

尝试使用:

 dataType: "application/pdf", success: function(data, textStatus, jqXHR) { window.open(escape(data), "Title", ""); }, 

我不能这样做异步,但是这个js为我返回了附件:

$('').appendTo('body').hide();

然后浏览器触发一个保存/视图弹出窗口,这对我的要求很好; 虽然没有error handling。

我认为在您的服务器端,您可能希望将其作为内联返回,例如response.setHeader("Content-Disposition", "inline; filename=file.pdf");

您正在设置内容长度OK,可能是成功代码将被触发两次,第一次在流的开头,第二次在结束时。

如果你有这个工作,请告诉我们。