中华网通行证
用户名 密码

怎样在Web应用中动态创建PDF文件(2)
中华网科技 http://tech.china.com 2005-05-27 17:25:38
进入BBS】【进入聊天室】【 推荐给朋友 】【浏览字号: 】【关闭窗口

  
  3、在Web应用中使用iText

  在设计阶段,你必须决定如何使用iText。我们使用了下边的技术开发了我们的Web应用。

  1.A技术

  在服务器文件系统上创建PDF文件。应用使用java.io.FileOutputStream把文件写到服务器文件系统上。用户通过HTTP GET方法下载该文件。

  2.B技术

  使用java.io.ByteArrayOutputStream在内存中创建PDF文件。应用通过servlet的输出流将该PDF文件字节发送到客户端。

  由于应用不需要把文件写到文件系统上,这样能保证在集群服务环境中能正常工作,所以我更倾向于使用B技术。如果你的应用运行在集群环境中且服务器集群不提供会话亲和的功能,A技术可能会导致失败。

  3、例子:PDFServlet

  我们的例子应用由一个类组成: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文档的所有字节。

  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" );
  // ...
  }

首页 上页 | 1 | 2 | 3 | 下页 尾页  共 3

 

☆震撼:数码相机疯狂降价!
作者: 来源: 

发表言论:
笔  名:
查看评论
﹣相关报道

﹣精彩回顾
·揭秘越南姑娘的“性契约”(组图)
·中国研制成功银河麒麟操作系统
·近处偷拍野狮性爱 野草丛中见柔情(图)
·难得一见“水下分娩”全程跟拍(组图)
·古代性器具及性惩罚工具(组图)
·揭密中外历史上乱伦的名人们(组图)
·探秘世界各地诡异的干尸新娘(组图)
·隋唐两个王朝的九大著名"绿帽子"(组图)
·另类的惨烈:螳螂血战壁虎谁更凶猛(图)
·一分钟平静死去 注射死刑全过程(图)

进入BBS】【进入聊天室】【 推荐给朋友 】【浏览字号: 】【关闭窗口


潮流·时尚
·市场上的天价手机全搜罗
·一周降幅最大手机导购
·FM调频收音功能手机选购
·索尼爱立信三新机曝光
·诺基亚N73音乐版精品赏
·热门便携笔记本搜索导购
·近期最新上市机型大盘点
·矩阵Matrix鼠标垫细评测
·19寸20寸22寸液晶该买谁
·近期几款热卖MP3大推荐
·四大即将退市经典MP3选购
·06年最火七大DC缺点曝光
·六百万像素超值机型推荐
·诺基亚推出随身小音箱
·LG直板巧克力KG99评测
·MOTO新机即将国内上市
·超低价蓝牙手机导购
·130万像素一样拍出好照片
·诺基亚两款蓝牙耳机新品
·索爱纯美折叠机Z558评测

软件下载
·豪杰大眼睛 V2.5
·Foxmail V6.5
·天网防火墙Athena
·极品五笔 V6.8
·PPS网络电视
·超级兔子魔法设置
中华网搜索
站内搜索
全网搜索




热门搜索
耳机 印刷 手机 拖鞋
减速机 钟表 成人用品
减肥 枸杞 T恤 升降机
心理 健康 彩票 招聘
礼品 旅游 猎头 培训

产品服务
·机会!机会不容错过
·中华商机,搜索创新
·准确快捷,搜你所搜
·¥来¥往,尽在中华邮
·中华搜索,贴心搜索




科技频道主编信箱