首先说些废话。
基于Java开发的Web的应用系统的打印问题一直困扰着我。原因是基于Web的应用是瘦客户端应用,逻辑集中在服务器上,而打印是基于客户端的行为。
目前基于Web的精确打印解决方案主要有两类:一是加强客户端的逻辑;二是在服务器端产生适于精确打印的文件。
流行的打印工具中用Applet实现、用浏览器插件实现或是开发嵌入浏览器的客户端的方法属于第一类;而在服务器端产生图片文件、pdf或ps等
精确打印文件的方法属于第二类。
以上流行的解决方案的比较:
| 方案 |
打印效果 |
浏览器依赖 |
部署代价 |
维护代价 |
| Applet实现 |
页面控制困难 |
需要java plug-in插件 |
无需客户端部署 |
客户端调整 |
| 浏览器插件实现 |
同本地打印 |
依赖特定类型版本的浏览器 |
客户端动态部署 |
客户端动态部署 |
| 图片文件实现 |
页面控制困难 |
无 |
无 |
无 |
| df文件实现 |
同本地打印 |
需要acroreader插件 |
无需客户端部署 |
无 |
pdf文件是流行的文件格式,浏览器和pdf阅读器已成为客户端必备的安装内容。对于通用的打印解决方案我认为pdf文件的方式具有更大的灵活性和可用性。
废话到此为止,下面就给出一个servlet通过模板生成pdf文件的实现:
我选择的是报表工具是jfreereport,当然若简单的文本可以使用iText直接产生。
1. jfreereport与was5.0.x的集成
was5.0.x依据j2ee 1.3规范,jaxp/dom/sax的版本分别为1.1/2/2,与jfreereport依赖的gunjaxp.jar中的一致,其他的包也不存在冲突。因此可以将这些
包直接加到Web项目的包目录/WEB-INF/lib中。jfreereport的包很多,与读取模板、生成报表和生成pdf文件相关的有:
gnujaxp.jar
itext-1.2.2.jar
iTextAsian.jar
jcommon-0.9.7.jar
jfreereport-0.8.4_11-core.jar
jfreereport-0.8.4_11-misc-configstore-base.jar
jfreereport-0.8.4_11-output-pageable-base.jar
jfreereport-0.8.4_11-output-pageable-pdf.jar
jfreereport-0.8.4_11-output-support-itext.jar
jfreereport-0.8.4_11-output-support-pagelayout.jar
jfreereport-0.8.4_11-parser-base.jar
jfreereport-0.8.4_11-parser-ext.jar
pixie-0.8.1.jar
j freereport中自带的itext-1.02b.jar版本低,可以替换为新版本,iTextAsian.jar是生成中文所必须的。
2. 编码和汉字问题
由于我的环境是英文系统(Win2k en version sp4)加装中文支持,为了在开发环境中支持中文必须使用UTF-8编码。因此需要对jfreereport中的一些参数进行配置。
需要将orgjfreereportmodulesoutputsupportitextconfiguration.properties文件中的org.jfree.report.modules.output.support.itext.Encoding参数设为GBK (或GB18030,请量力而行,我的环境未安装GB18030的支持)。
需要将显示中文的区域的字体和编码分别设为"STSong-Light"和"UniGB-UCS2-H"。此字体和编码是生成pdf文件时显示中文所必须的,与jfreereport的GUI工具的显示无关。
3. 程序示例
我选用了jfreereport中的Java Look and Feel Graphics Repository的例子,并将部分内容换为中文。以下是直接生成pdf的servlet代码和我变更的报表模板。