动态生成PDF文档的JAVA实现
李海宁
1、 问题的提出
PDF(Portable Document Format)是Adobe公司公布用于进行全球电子文档分发的开放式标准,它是一种通用的支持多种压缩方式的文件格式。利用Adobe的一些PDF文档处理软件(如Acrobat Distiller、Acrobat Writer等),可以将任何文档转变成PDF文档。无论创建源文档的应用程序和平台如何、PDF均保留原文档的字体、格式、颜色和图形等,其显示与打印的一致性,真正做到了“所见即所得”。安装了Acrobat Reader或其插件后,我们可以方便地在WEB浏览器中浏览、打印PDF文档,并且它同样可以让我们方便地进行人机交互操作。鉴于PDF的众多优点,PDF格式文档在WEB上的应用越来越流行,特别有利于处理政府部门的电子公文。
Adobe公司提供了FDF文件的JAVA开发工具,此外,利用iText的Java编程接口,也可以很好的创建和使用PDF文档。本文将讨论利用这两种PDF文档的JAVA 开发工具如何动态地生成PDF文档,并解决PDF文档在WEB中的应用问题。
2、 FDF方案
(1) 认识Acrobat表单及FDF数据传输格式文件
Acrobat表单提供了电子化地填充基于PDF文档的表格的能力,它是PDF1.2版的一组扩展功能,它允许PDF文档上包含表单域和按钮,可以简单地认为它是加在PDF文档上的一个层,下层的PDF文档是由PDF创建工具生成,而表单域或按钮是后来用Acrobat3.0以上版本手工加上去的。除了要把表单数据存贮在PDF文件中外,还需要一种文件格式来负责在客户端和服务器端传递表单数据,Acrobat产品支持一系列的数据传输格式,如FDF、XFDF、URL Encoded等。
FDF作为一种数据传输的格式,因其有许多优点而采用得比较的广泛,如可以在客户端和服务传输图像,表单域可以有多种属性、按钮可以相关多种动作等。
(2) 利用Adobe的JAVA FDF开发工具实现PDF文档的WEB应用
我们可以在ASP,JSP等文件中自动生成FDF文件,但这样我们必须去分析掌握FDF文件的格式,所以这样生成一个FDF文件是很麻烦的。所幸的是,我们可以利用Adobe公司提供的FDF开发工具来动态生成PDF文档,不再用分析FDF文件的结构。FDF开发工具是用来编写服务端程序的应用程序开发接口(API),它用来产生或分析由Acrobat工具创建的表单中的FDF数据。这里我们来看一下利用JAVA FDF开发工具动态的生成PDF文档的方法。
在编写服务端程序(这里为Servlet)之前,我们需创建好PDF表单,这里利用Acrobat5.0在example.pdf文档中创建域名为hello的纯文本表单,默认值为Hello!。接下来看我们如何把值传递给表单,一般有如下步骤:
a) 创建FDF文件对象:FDFDoc fdf=new FDFDoc();
b) 对表单进行操作,这里看如何存取表单值:
fdf.SetValue("hello",“Hello World!”),
这里调用了SetValue方法,向表单中写入文本“Hello World!”,当然,我们在这里也可以从数据库中调用你想要填写的值。同理,调用GetValue方法,可以得到表单中的值。
c) 指明导出FDF数据到哪个PDF文件,注意的是,这里的文件中径必须是完整的绝对路径名称: ( fdf.SetFile("d:\\tomcat 4.0\\webapps\\pdf\\PDFs\\example.pdf",此时example.pdf调用Acrobat阅读器打开,这里没有远程调用);
fdf.SetFile("http://localhost/PDFs/example.pdf");
d) 设置MIME类型:res.setContentType("application/vnd.fdf");
e) 得到写入FDF数据的输出流:OutputStream out = res.getOutputStream();
f) 把数据写到这个流:fdf.Save(out);
g) 最后要关闭这个流:out.close();
同理,在JSP文件中,也大致需以上的步骤,不管写的是JSP程序,还是Servlet程序,我们只要在浏览器中访问这个程序,你会发现,PDF文档完美的在浏览器中呈现在你的眼前了。
3、 利用iText的JAVA API自动生成PDF文档
(1) iText简介
iText是一个免费的类库,它可以用来动态地生成PDF文档。iText类用来创建只读的,平台无关的,含有文本、列表、表格、图像的文档,它特别适合基于Java技术的Servlet编程。与FDF的Java开发工具比较,iText类更加完善,丰富,但不同的是,它不涉及到FDF的内容,用它可以直接地生成PDF文档,生成的文档可以直接地输出到装有Acrobat Reader插件的浏览器中看。
(2) 用iText自动生成PDF
以下是得用iText生成PDF文件的基本五个步骤:
第一步:创建com.lowagie.text.Document的对象:
Document document = new Document();
第二步: 创建Writer的对象去侦听上面创建的文档,并把这个文档写入到你定义的输出流:
PdfWriter.getInstance(document, new FileOutputStream("Hello.pdf")):
第三步: 打开文档: document.open();
第四步: 添加内容到文档中:
document.add(new Paragraph("Hello World"));
第五步:关闭文档:document.close();
上面是在Java应用程序中做,要让JSP和Servlet也能自动生成PDF文档,实现在WEB中的应用,我们还必需做点工作,但不管你编写的是什么程序,上面的五个基本步骤还是不能少的。
在编写JSP和Servlet程序时,我们要改动上面的第二步,因为我们现在不需要生成具体的PDF文档在硬盘中,我们只要让PDF在文档WEB浏览器中显示出来就行了。把上面第二步改为:ByteArrayOutputStream baos=new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
完成上述第五步之后,我们需要设置MIME类型,并把把前面写入的PDF文件流写到Servlet输出流通中,最后关闭流,示例代码如下:
response.setContentType("application/pdf");
response.setContentLength(baos.size());
ServletOutputStream out = response.getOutputStream();
baos.writeTo(out);
out.flush();
4、 开发实例
本人在做电子政务应用中,对日常事务处理中的表单,上下级相互的发文及来文,下发的红头文件等,都采用了PDF文档的方式,使这些公文直观逼真,其打印出的文件不走样,保证了政府信息发布的权威性。同时,利用PDF的表单交互功能,实现了在线实时填写和提交表单,这样方便了许多申请和报批工作。对于一些格式化的表单,采用Adobe FDF 开发工具,这样做的好处是,可以定制好表格的“模板”,这样完全是填表的形式,省掉了许多编程方面的工作;对于一些不规范的文档,我采用了iText的API,这样,文档的所有内容都是在程序里添加上去的,其编程过程繁琐,但好处是可以灵活地生成你想要的文档,文档的表现形式丰富多变。所以我认为,我们可以充分发挥FDF开发工具和iText的长处,而避免各自的短处,两者结合使用,可以更加快速自如地自动生成PDF文档。
5、结语
本人在电子政务中利用PDF处理电子公文,深刻的感受到PDF在WEB的应用方面有着很好前景。故在这里简要地介绍一下利用JAVA多方式,多手段地解决自动生成PDF文档的问题,基于这一问题的基础之上,再论述PDF在WEB中的应用问题,由于篇幅所限,在里不能深入详细地进行介绍,要了解更多有关PDF方面的信息,可以访问Adobe的网站www.adobe.com及iText网站www.lowagie.com/iText/index.html。
[此贴子已经被作者于2004-06-01 08:57:02编辑过]