与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)
答案 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"