【问题标题】:Opening PDF served from servlet打开从 servlet 提供的 PDF
【发布时间】:2017-07-25 17:18:11
【问题描述】:

尝试从 servlet 向客户端发送 PDF。客户端通过 AJAX 发送 POST 请求,该请求由 servlet 处理生成 PDF 并将 PDF 作为响应发送给客户端。

我尝试了此处发布的选项无济于事(获得空/不可打开的 pdf):Opening PDF String in new window with javascript

任何帮助将不胜感激!

到目前为止,我只能使用以下代码在浏览器控制台中打印格式化的 PDF 字符串:

Java Servlet:

    response.setContentType("application/pdf");
    response.setHeader("Content-disposition","attachment; filename=ProgressReport.pdf");
    response.setContentLength((int) pdfFile.length());

    OutputStream out = response.getOutputStream();
    FileInputStream in = new FileInputStream(pdfFile);
    byte[] buffer = new byte[1024];
    int length =0;
    while ((length = in.read(buffer)) != -1){
       out.write(buffer, 0, length);
       System.out.println(buffer);
    }
    in.close();
    out.flush();

JS

                $.ajax({
                url : "GenerateReport",
                data : {
                         ...
                },
                type : "POST",
                success : function(result) {
                    console.log(result);
                    //window.open("data:application/pdf, " + encodeURI(result)); 
                    //download(result);
                },
                error : function(result) {
                    ...
                }
            })

浏览器控制台中的 PDF 字符串

%PDF-1.4 %����3 0 obj<</Filter/FlateDecode/Length 238>>streamx��QMO�@��x��(��D��!A�x�R��T�-�n��{�5LDB�e2�y�>2�l�Y$1�:a�i.�"�~f ...

【问题讨论】:

    标签: javascript java ajax pdf servlets


    【解决方案1】:

    我不是 100%,但你的 window.open 并不是最好的,因为弹出窗口阻止程序可能会阻止它,因为它不是用户操作,称它是 AJAX 响应。

    更好的方法是this answer中列出的方法

    var hiddenElement = document.createElement('a');
    
    hiddenElement.href = 'data:attachment/text,' + encodeURI(result);
    hiddenElement.target = '_blank';
    hiddenElement.download = 'myFile.txt';
    hiddenElement.click();
    

    另一种选择是使用 Base64 编码并使用 "data:image/png;base64,"+result,在您的 C# 中,您需要创建文件大小的缓冲区,然后对整个缓冲区进行 base64 编码

    【讨论】:

    • 嗨,我已经编辑了我的 servlet 代码以将文件编码为 Base64,并使用`"data:application/pdf;base64"+result;` 但是,这只是下载一个空白 PDF。你知道为什么会这样吗?
    • 如果我首先使用window.atob(result) 解码结果并使用"data:application/pdf;"+result; 传递它,它也会打开一个空白PDF
    • 很抱歉,如果您在此主机上解码 base64 并保存文件大小是否正确,我不确定会发生什么?
    • 最后一个建议是不要使用FileInputStream 使用BinaryReaderBinaryWriter 你应该能够将你的流转换为它们
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2013-03-07
    • 2014-02-09
    • 2015-01-31
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多