快速业务通道

在Web应用中动态创建PDF文件 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
们的例子应用由一个类组成:PDFServlet。这个servlet采用B技术。输出流OutputStream是java.io.ByteArryOutputStream。用ByteArrayOutputStream,PDF文档字节将存储在内存中。当PDFServlet接收到一个HTTP请求时,它将动态地生成一个PDF文档并将该文档发送到客户端。

PDFServlet类扩展了javax.servlet.http.HttpServlet类并导入了两个iText包:com.lowagie.text和com.lowagie.text.pdf。

doGet方法

大多数servlet覆盖了doPost和doGet方法中的一个方法。我们的servlet没有什么不同。PDFServlet类覆盖了doGet方法。该servlet将在接收到HTTP GET请求后生成一个PDF文件。

在核心部分,servlet的doGet方法做了如下的工作:

1.创建一个包含PDF文档字节的ByteArrayOutputStream对象;

2.在reponse对象上设置HTTP响应头内容;

3.得到servlet输出流;

4.把文档字节写到servlet的输出流中;

5.刷新servlet输出流;

generatePDFDocumentBytes方法

generatePDFDocumentBytes方法负责创建PDF文档。在这个方法中三个最重要的对象是Document对象,ByteArrayOutputStream对象和PdfWriter对象。PdfWriter使用ByteArrayOutputStream关联Document。

Document doc = new Document(); ByteArrayOutputStream baosPDF = new ByteArrayOutputStream(); PdfWriter docWriter = null; docWriter = PdfWriter.getInstance(doc, baosPDF); // ...

用add方法把内容添加到Document中。

doc.add(new Paragraph( "This document was created by a class named: " + this.getClass().getName()));    doc.add(new Paragraph( "This document was created on " + new java.util.Date()));

当你添加完内容后,要关闭Document和PdfWriter对象。

doc.close();

docWriter.close();

当关闭文档后,ByteArrayOutputStream对象返回到调用者。

return baosPDF;

ByteArrayOutputStream包含了PDF文档的所有字节。

在Web应用中动态创建PDF文件(4)

时间:2010-12-23

HTTP响应头

在这个应用中,我们仅仅关注四个HTTP 响应头:Content-type,Content-disposition,Content-length,和Cache-control。如果你从没有使用过HTTP头,请参考HTTP 1.1规范。

研究在PDFServlet中的doGet方法,你会注意到要在任何数据写到servlet输出流之前设置HTTP响应头内容,这是很重要的,也是细微的一点。

让我们更详细地说明一下每个响应头的含义。

Content-type

在servlet中,HttpServletResponse有一个表明响应所包含内容类型的参数。对PDF文件而言,内容类型是application/pdf。如果servlet没有设置类型,web浏览器很难决定如何处理这个文件。

PDFServlet用下边的代码设置内容类型:

resp.setContentType("application/pdf");

Content-disposition

Content-disposition头提供给浏览器确定HTTP响应内容的信息。当浏览器读到这些头信息后,它能确定:

HTTP响应包含一个文件;

包含在响应中的文件名;

该文件是显示在浏览器主窗口中还是要用外部的应用查看;

RFC 2183中有对Content-disposition头完整的解释。

通过合适地设置Content-disposition的值,servlet能指示浏览器是“内嵌”显示文件还是把它当作附件处理。

例1.内嵌显示一个文件

Content-disposition: inline; filename=foobar.pdf

例2.往response里附加一个文件

Content-disposition: attachment; filename=foobar.pdf

下边的伪码说明了如何设置头信息:

public void doGet(HttpServletRequest req, HttpServletResponse resp) { // ... resp.setHeader( "Content-disposition", "inline; filename=foobar.pdf" ); // ... }

Cache-Control

根据你应用的特性不

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号