【问题标题】:Show a pdf stream in a new window在新窗口中显示 pdf 流
【发布时间】:2013-12-22 10:52:18
【问题描述】:

我正在服务器中生成一个 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 发生了什么吗?

【问题讨论】:

    标签: javascript jquery spring pdf stream


    【解决方案1】:

    尝试使用:

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

    【讨论】:

      【解决方案2】:

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

      $('&lt;iframe src="url"&gt;&lt;/iframe&gt;').appendTo('body').hide();

      然后浏览器会触发保存/查看弹出窗口,这符合我的要求;不过没有错误处理。

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

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

      如果您成功了,请告诉我们。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • Chrome 会阻止窗口,直到允许为止。
        • @crush,不仅chrome而且还可以
        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2016-09-15
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多