javascript - 打开 servlet 提供的 PDF

标签 javascript java ajax pdf servlets

尝试将 PDF 从 servlet 发送到客户端。客户端通过 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 ...

最佳答案

我不是 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 编码

关于javascript - 打开 servlet 提供的 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42615428/

相关文章:

java - Hibernate刷新不会为陈旧对象抛出StalestateException(除了第一次刷新调用)

java - 按 Enter 键提交表单 - 文本字段值为 Null

javascript - 如何在带有 Moovweb SDK 的 Javascript 中移动 AJAX 内容?

javascript - 使用 ajax 和 data-* 属性更新按钮

javascript - 跨源策略错误

java - 正则表达式非选择器

ajax - 访问以 AJAX 加载的 HTML

javascript - javascript 中的变量与命名空间

javascript - 使用 jQuery 触发相邻表格单元格中的链接

java - org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'signupController' defined in file