POST XML到服务器,接收PDF

时间:2010-05-27 23:46:29

标签: jquery xml ajax pdf post

this question类似,我们正在开发一个Web应用程序,客户端单击按钮以从服务器接收PDF。现在我们正在使用带有jQuery的.ajax()方法来发布后端需要的数据,以便在按下按钮时生成PDF(我们发送XML),然后后端生成完全在内存中的PDF并在HTTP响应中将其作为application / pdf发回。

该问题的一个答案要求服务器端将PDF保存到磁盘,以便它可以将客户端的URL返回给GET。但我根本不希望后端缓存内容。

另一个答案建议使用jQuery插件,但是当你查看它的代码时,它实际上生成了一个form元素,然后提交了form。该方法对我们不起作用,因为我们在HTTP请求的主体中发送XML数据。

有没有办法让浏览器在不缓存PDF服务器端的情况下打开PDF,而不需要我们抛弃使用发送数据到服务器的XML解决方案?

(我希望浏览器的行为与提交form元素时的行为相同 - 发出POST,然后浏览器查看Content-type标题以确定下一步做什么,就像在浏览器窗口中加载PDF一样,la Safari)

4 个答案:

答案 0 :(得分:1)

我看到了一些解决方案:

1)将其提交给一个简单的servlet,通过xslt处理器(例如saxon)将文件转换为xsl-fo(一种xml页面描述语言),可以使用FOP或RenderX将其转换为PDF。

2)提交给servlet,解析bean数组中的xml或者可以由报告引擎处理的任何适当结构化的数据模型,然后将其传递给报告引擎(例如Birt,JasperReports,......) PDF渲染作为标准输出格式。如果XML很小,您可以将其完全传递给报告引擎servlet,并在报告本身内部进行处理。我知道其中一个有一个可以进行转换的Javascript数据源。

3)使用iText从servlet中解析的xml生成PDF,但我之前从未使用过,所以我不知道它是如何工作的。

答案 1 :(得分:1)

以下是一个示例表单,允许您输入一些文本,并在浏览器中显示PDF。嗯,它对我有用。我所做的就是在内存中创建PDF,将响应体设置为PDF,将响应头设置为application / pdf。就是这样。

有关工作示例,请参阅http://129.33.194.254:8080/makepdf.rsp

如果它不起作用,请使用wireshark跟踪http事务。

<html>
<body>
<%
    either none? text: select request/content 'data [
        %>
        <strong> PDF Test </strong>
        <form method="post">
        Enter some text:
        <input type="text" name="data" value="">
        <input type="submit" value="Submit">
        </form>
        <%
    ][
    if not exists? %pdf-maker.r [
        write %pdf-maker.r read http://www.colellachiara.com/soft/Misc/pdf-maker.r
    ]
    if not value? 'layout-pdf [
        *do %pdf-maker.r
    ]
    response/buffer: layout-pdf compose/deep [[textbox [(dehex text)]]]
    response/set-header 'Content-type "application/pdf"
    ]
%>
</body>
</html>

答案 2 :(得分:0)

只需创建相应的内容标题,然后在回复中写回PDF。您不需要以不需要缓存动态生成的html或图像的方式缓存您创建的PDF。

答案 3 :(得分:0)

我遇到了同样的问题,唯一的区别是:我使用JSON将数据发布到服务器。我的解决方案是:

使用输入字段(#printdata)在页面上创建隐藏表单(#printform)并将参数提交为字符串:

  $("#printdata").val(JSON.stringify(my_json_data_object));
  $("#printform").submit();

在my_json_data_object中,我存储了pdf创建的所有必要数据。在服务器上,我必须使用JSON.parse(...)将参数解析回JSON对象。使用此解决方案,我可以创建pdf文件并将其传输到客户端,而无需将其保存在服务器上。不要忘记在响应中设置以下标题:

content-type: application/json
content-disposition: attachment; filename="output.pdf"