在新窗口中显示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 = $("
但我不能使用第二种方式因为我需要管理错误,我不能使用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,可能是成功代码将被触发两次,第一次在流的开头,第二次在结束时。
如果你有这个工作,请告诉我们。