当前位置: 首页 > 知识库问答 >
问题:

从客户端下载生成的pdf

云锦
2023-03-14

我是stackoverflow的新手,因此这是我的第一篇文章。请原谅我英语不好。。。我花了几个小时在相关的话题上,但没有一个能满足我的需要。我正在编写一个通讯簿,我希望我的用户能够随时下载pdf联系人列表。一切似乎都很顺利,但实际上客户端从未下载pdf文件,尽管我可以在使用chrome开发者工具的请求中看到它。这是我的密码:

public void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException {

    try {
        Document document = new Document();
        PdfWriter.getInstance( document, response.getOutputStream() );
        document.open();
        document.add( new Paragraph( "You've selected " + request.getParameter("number") + " contacts." ) );

        response.setContentType("application/pdf");
        response.setHeader( "Content-Disposition", "attachment; filename=\"contacts.pdf\"" );

        document.close();
    }
    catch( DocumentException e ) {
        e.printStackTrace();
    }
}

当检查响应时,我得到如下结果:

%PDF-1.4
%����
2 0 obj
>stream
x�+�r
�26S�00S
5 0 obj
>
endobj
6 0 obj
>
endobj
xref
0 7
0000000000 65535 f 
0000000320 00000 n 
0000000015 00000 n 
0000000408 00000 n 
0000000163 00000 n 
0000000459 00000 n 
0000000504 00000 n 
trailer
]/Info 6 0 R/Size 7>>
%iText-5.4.1
startxref
645
%%EOF

有没有人好心告诉我出了什么事?

共有3个答案

厍华清
2023-03-14

我将post请求头设置为“application/x-www-form-urlencoded”。这不是个问题吗?

朱渝
2023-03-14

正如天行者所指出的,您直接向响应OutputStream,在设置响应之前,您需要使用一个中间流(就像他链接的示例中的a),并且最后不要忘记对其进行flush()close()操作。

此外,通过将内容类型设置为Application/pdf,您告诉浏览器处理它想要的流(例如,它可以决定打开pdf,而不是允许您下载它)。为了始终强制浏览器弹出下载对话框,我建议使用应用程序/八位流内容类型。

何乐
2023-03-14

在设置响应头之前,您应该调用document.close(),这里有一个详细的例子,它们显式地写入servlet的输出流

希望能有帮助。

--[编辑]我在itext-2.1.7中运行了与上述相同的代码,但在doGet中对我有效,可能问题在于您使用的是使用POST http请求(doPost)的servlet方法,而如果您直接在服务器中点击基本url,则会发送GET请求。

您可以重写服务方法,或者从doget调用doPost,或者从表单或ajax提交相同的url,以确保超文本传输协议Post调用。

 类似资料:
  • 问题内容: 鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。 我的angular 1.5.X客户端为我提供了标题列表,每个标题都有一个关联的文件。我的Node 4.X / Express 4.X服务器使用该列表,获取文件位置,使用npm中的express-zip创建一个zip文件,然后将该文件流式传输回响应中。然后,我希望我的客户端启动浏览器的“下载文件”选项。 这是我的客户代码

  • 在有人说“重复”之前,我只想确保大家知道,我已经回顾了这些问题: 1) 使用angular和php,不确定这里发生了什么(我不知道php):下载zip文件并从angular方法触发“保存文件”对话框 2) 什么都做不到:如何使用angular下载zip文件 3) 这个人已经可以下载了,这已经超过了我想弄明白的点:从一个按钮动作触发的角度下载外部zip文件 4) 这个问题没有答案:下载。nodejs

  • 问题内容: 我有一个导出功能,可以读取整个数据库并使用所有记录创建一个.xls文件。然后将文件发送到客户端。 当然,导出完整数据库的时间需要很多时间,并且该请求很快会因超时错误而结束。 处理这种情况的最佳解决方案是什么? 例如,我听说过有关使用Redis进行队列的操作,但这需要两个请求:一个用于启动将生成文件的作业,第二个用于下载生成的文件。 来自客户端的单个请求是否可能? 问题答案: Excel

  • 我有一个这样的歌剧API: OpenAPI生成器Maven的插件为schema对象创建了一个请求类“GenerateTokenRequest”,但在API实现类中它没有使用。它生成一个方法,将所有请求的字段作为参数列表。方法如下: 所以,在这种情况下,请求类“GenerateTokenRequest”被生成,但从未使用过。任何人都可以告诉我为什么?有一种使用我的请求类的替代方法吗?我可以在Open

  • 嗯,首先,对不起我的英语不好。 “enderecodao.java”: 和ENDERECO的WebService“servicoEnderEco.java”:

  • 我有一个WildFly集群,它应该将所有主题消息共享给不同的节点,并在一个节点离线时保存它们。< br >在这种情况下,我需要耐用的订阅服务器。 我注意到如果我使用相同的clientID,系统会进行负载平衡。如果我将clientID或认购名称更改为唯一值,它就可以工作。 那么什么时候使用唯一的clientID,什么时候使用subscriptionName 我的答案是,每个节点的唯一clientID