ZH/Case-Study-01-Journal-22
From ADempiere
This Wiki is read-only for reference purposes to avoid broken links.
Contents
实施日志-22-JasperReports报表
- 本文属于机械装备制造业进销存实施案例——ADempiere ERP案例研究之一。
- 本文记录ADempiere ERP项目实施的过程
2010-11-11
JasperReports报表
今天主要调试JasperReports和iReport。
- JasperReports是一款报表打印组件,开放源代码并基于Java。
- “iReport...用来以可视化的方式设计生成JasperReport所使用的报表格式文件。因为JasperReports本身并未提供很好的可视化报表设计工具,iReport的出现正好弥补了这个缺陷。”
- --摘自裴贺先的《JasperReport 与 iReport 的配置与使用》。
友情提醒:ADempiere新近版本已经集成了JasperReports功能,在Adempiere的安装目录下以jasper可以搜索到两个jar包。所以安装了ADempiere了用户就不必另外安装JasperReports了。
iReport安装方法
以iReport-3.7.6和Linux操作系统为例
- 下载安装包 iReport-3.7.6.tar.gz
- 解压缩到文件夹: /opt/iReport-3.7.6
- 运行iReport:
$ cd /opt/iReport-3.7.6/bin $ sh ireport
在ADempiere中应用JasperReports
- 在iReport里新建报表并预览通过。
- Adempiere的安装目录下新建报表文件夹,然后把*.jrxml文件复制过去。
- 以System Administrator的角色登录。
- 在窗体Report & Process里新建Report。并在Jaspert Report栏填写*.jrxml文件的路径。
- 在窗体Menu中把新建的Report添加到菜单中。
- 以GardenWorld Administrator的角色登录。
- 打开刚才新建的Report,就可以看到JasperReport了。
后续测试
- 父子报表(Parent-Child report);
- 参数传递。主要是与销售订单当前记录的关联。
完成测试后就会用于销售订单的报表定制。
JasperReports相关链接
- Using Jasper Report Form in place of Standard Forms
- HOWTO Use Jasper On Financial Reports
- ADempiere/Compiere JasperReports Integration HowTo
- Jasper Forge官方网站
讨论栏
2010-12-02
JasperReport父子表问题
JasperReport父子表在客户端(Client)上的布署
- 今天用ireport建立父子报表,即包含子报表(subreport)的报表。在ireport上可以正常显示,但是在adempiere客户端却无法显示。
- 第二天把这个问题解决了,发现是iReport的版本问题。
- ADempiere 3.6.0 LTS 集成的JasperReport版本是3.7.3。而我用的iReport版本是3.7.6。今天重新下载了iReport-3.7.3,父子报表经编译后,在客户端(Client)可以正常显示。
JasperReport父子表在Web服务器上的布署
- JasperReport父子表在Web服务器上的布署
- JasperReport父子表在Web服务器上的布署,在官方文档Problem_with_subreports上发现子报表需要额外编译。后来经测试并不存在官方文档上所说的问题,详见2010-12-23实施日志。--2010年12月23日 Peanut Blake
- 我已经将官方文档Problem_with_subreports当中过时的内容进行了删除和修改。--2010年12月23日 Peanut Blake
讨论栏
2010-12-03
JasperReport大写金额的问题
- 父子表的问题解决了之后,今天用iReport来制作报表还算顺利。只是遇到中文大写金额的问题。
- 找到一篇文章在JasperReport报表中加入大写金额,不知道能否在ADempiere下实现。有空再试试。
2010-12-22
JasperReports导出PDF中文显示问题
问题描述
- 问题概述:
- JasperReports导出的PDF文件中,中文字符均显示为空白。
- 问题描述:
- JasperReports导出的PDF文件中,中文字符均显示为空白(不是空格、方框或乱码)。这个现象在iReport、ADempiere C/S 客户端、ADempiere B/S 浏览器端均存在。之前测试时只是检查了预览(或浏览)显示,没有检查导出的PDF文件,因此忽视了该问题。
- 系统环境:
- 操作系统:Linux/Debian Squeeze/Testing, amd64
- JVM:java-sun-1.6.0_22, 64bit
- iReport:3.7.3
- ADempiere:3.6.0 LTS
- 问题难点:
- 策略:
- 先在iReport中测试,成功后再进行ADempiere C/S 客户端测试,最后进行ADempiere B/S 浏览器端测试。
- 总体步骤:
- 先准备好字体
- 然后在iReport系统设置当中设置好字体
- 接着是对.jrxml报表中的元素属性进行设置
- 最后对ADempiere进行设置
具体步骤
Step 1 准备TTF字体文件
- 经测试,在ADempiere C/S客户端中JasperReports不支持TTC字体文件格式,因此要使用TTF字体文件。
- 为了保证开源方案的一致性,我们不采用微软的字体,例如微软的宋体、黑体等,而是采用开源的文泉驿字体。本测试中用文泉驿正黑字体 ( wqy-zenhei.ttc) .
- 由于文泉驿字体只提供TTC字体文件,因此需要转化。
- 找到工具ttc2ttf,使用其中的BREAKTTC.EXE程序。BREAK TTC这个名字大概是拆分TTC文件的意思吧。
- 在Windows操作系统下执行该程序。
BREAKTTC.EXE WQY-ZENHEI.TTC
- 该程序比较奇怪的地方是只认大写文件名,对于小写文件名会提示找不到该文件。
- 执行后拆分成3个文件——FONT00.TTF、FONT01.TTF、FONT02.TTF。分别是WenQuanYi Zen Hei, WenQuanYi Zen Hei Mono, WenQuanYi Zen Hei Sharp。
- 我们选用WenQuanYi Zen Hei,将文件更名为wqy-zenhei.ttf。
Step 2 在iReport设置字体引用
- 导入字体文件wqy-zenhei.ttf。
- 菜单:Tools -> Option -> Fonts -> Install Font
- 导出为字体扩展件wqy-zenhei.jar
- 菜单:Tools -> Option -> Fonts -> Export as extension
- 删除原导入字体文件wqy-zenhei.ttf
- 菜单:Tools -> Option -> Fonts -> Remove Font
- 导入wqy-zenhei.jar
- 菜单:Tools -> Option -> Classpath -> Add JAR
Step 3 元素PDF属性的设置
- 在iReport打开JRXML文件,例如 example.jrxml。
- 接下来对元素PDF属性的设置:
- Pdf Font name:有资料提到这个下拉框可能不会出现Classpath中引入的字体,我就遇到这种情况。这时可以直接手工输入字体名称,例如wqy-zenhei.ttf。
- Pdf Embedded:选不选均可。
- Pdf Encoding:选择Identity-H (Unicode with horizontal writing) 。
Step 4 iReport预览
- 点击Preview预览。检查显示是否正确。
- 点击Save保存图标,将报表保存为PDF格式,例如:example.pdf。
- 用Evince或Adobe Reader等工具打开导出的的PDF文件,检查显示是否正确。
- 经过以上步骤,iReport下的PDF中文测试就完成了。
Step 5 ADempiere布署
- ADempiere的C/S 客户端及B/S 浏览器端布署。
- ADempiere布署会涉及到的路径问题,一个是JasperReports文件本身的路径,另一个是JasperReports文件的元素PDF属性Pdf Font name所设置的字体路径。
- 路径可分为相对路径和绝对路径。
- 怎样集成JasperReports里PdfFontName举例用的是绝对路径:
- C/S布署:C:\Windows\Fonts\Arial.ttf
- B/S布署:http://192.168.2.109:8080/WebApp/arial.ttf
- 在这里不建议使用绝对路径,因为这样一来就不能同时布署C/S和B/S,除非你只采用一种布署方式。
- 我们建议采用相对路径,具体设置如下:
- 在iReport中将元素PdfFontName设置为:wqy-zenhei.ttf
- 在数据字典Report窗口将JasperReport路径设置为:example.jrxml
- 将example.jrxml文件复制到此路径下:$ADEMPIERE_HOME/reports/
- 将wqy-zenhei.ttf字体文件分别复制到两个路径下:
- $ADEMPIERE_HOME/
- $ADEMPIERE_HOME/reports/
- 注意:C/S客户端从$ADEMPIERE_HOME/路径读取字体文件,B/S浏览器端从$ADEMPIERE_HOME/reports/路径读取字体文件
- 最后在客户端及浏览器端分别进行报表导出PDF文件测试。
关于PDF中文问题的补充
关于jar字体包
- ADempiere不需要安装.jar字体包,只需要设置好.ttf字体文件即可。
关于WebApp.war
- 旧版的怎样集成JasperReports提到“If you are looking for an OS neutral solution you may add the font to your WebApp.war alongwith the .jrxml file and specify as pdfFontName the fullpath to it.”。
- 但是在我们的方案中,并不需要设置WebApp.war,同样可以做到与显示效果与操作系统无关。
关于iTextAsian.jar方案
- 有不少资料提到iTextAsian.jar方案(iTextAsian.jar 是一个亚洲字体包)。但是这个方法我们测试后不通过。
- 大概方法如下:
- 将iTextAsian.jar放到Classpath下;
- 元素PDF属性的设置如下:
- Pdf Font name:STSong-Light
- Pdf Embedded:True
- Pdf Encoding:选择UniGB-UCS2-H (Chinese Simplified)
一点技巧
- 在iReport当中对每一个元素都要进行PDF属性设置,这样比较繁琐。这里有一个小技巧,可以利用Style进行风格设定,统一设定Pdf Font name和Pdf Encoding。
关于Subreport子报表
SUBREPORT_DIR 子报表路径
- 旧版的怎样集成JasperReports提到:"When you run an Application Server Deployment, and you have a Subreport, then the Parameter SUBREPORT_DIR for establishing the location of the subreport must have a value like the one described in the section "Deploy reports on the application server":http://adempiereservename.domain/webApp/standalone.jrxml, or http://adempiereservename.domain:adempierewebport/webApp/standalone.jrxml, if the web port is other than 80. "
- 在实际使用中,不需要这么复杂,将SUBREPORT_DIR(子报表路径)设置为空,并将子报表与父报表统一放置在$ADEMPIERE_HOME/reports/路径下即可。
关于子报表无法显示的问题
- 旧版的怎样集成JasperReports提到:"When you have a report which contain a subreport into, you need to use the last with the compiled files (it’s .jasper file). Sometimes, if you use iReport to compile/edit your reports, maybe you compile the subreport with this tool. When you test the report from iReport, it work fine; but when you run the report from ADempiere, you can’t see nothing. "
- 旧版的怎样集成JasperReports说的是subreports(子报表)在ADempiere无法显示时,要在ADempiere内将.jrxml文件编译成.jasper文件,并放入路径:D:\Adempiere\jboss\server\adempiere\deploy\WebApp.ear\webApp.war\
- 在我们的实际测试当中,并不存在上述问题。
- 我们的子报表在iReport下编译,放在$ADEMPIERE_HOME/reports目录下。
- 同时在iReport中将子报表SUBREPORT_DIR(子报表路径)设置为空。
- 这样B/S和C/S方式均可正常显示了。