在新窗口中显示pdf流

时间:2013-12-05 13:15:06

标签: javascript jquery spring pdf stream

我正在服务器中生成一个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 target='_blank'>").attr({
    action : myURL,
    method : "POST"
});
var input1 = $("<input type='hidden'>").attr({
    "name": "data",
    value: JSON.stringify(myData)
});

form.append(input1);
$("body").append(form);
form.submit();
form.remove();

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

有关PDF发生了什么的想法吗?

3 个答案:

答案 0 :(得分:6)

您可以获取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("...");
    }
});

答案 1 :(得分:0)

尝试使用:

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

答案 2 :(得分:0)

我无法执行此异步操作,但此js会为我返回附件:

$('<iframe src="url"></iframe>').appendTo('body').hide();

然后浏览器会弹出一个保存/视图弹出窗口,这对我的要求很好;但是没有错误处理。

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

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

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