ZH/Case-Study-01-Journal-22

From ADempiere
Revision as of 01:34, 25 December 2010 by Peanutblake (Talk) (讨论栏)

Jump to: navigation, search
This Wiki is read-only for reference purposes to avoid broken links.

<返回中文首页> <返回本案例研究首页>

实施日志-22-JasperReports报表

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操作系统为例

  1. 下载安装包 iReport-3.7.6.tar.gz
  2. 解压缩到文件夹: /opt/iReport-3.7.6
  3. 运行iReport:
$ cd /opt/iReport-3.7.6/bin
$ sh ireport

在ADempiere中应用JasperReports

  1. 在iReport里新建报表并预览通过。
  2. Adempiere的安装目录下新建报表文件夹,然后把*.jrxml文件复制过去。
  3. 以System Administrator的角色登录。
  4. 在窗体Report & Process里新建Report。并在Jaspert Report栏填写*.jrxml文件的路径。
  5. 在窗体Menu中把新建的Report添加到菜单中。
  6. 以GardenWorld Administrator的角色登录。
  7. 打开刚才新建的Report,就可以看到JasperReport了。

后续测试

  1. 父子报表(Parent-Child report);
  2. 参数传递。主要是与销售订单当前记录的关联。

完成测试后就会用于销售订单的报表定制。

JasperReports相关链接

讨论栏

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文件,因此忽视了该问题。
  • 系统环境:
  1. 操作系统:Linux/Debian Squeeze/Testing, amd64
  2. JVM:java-sun-1.6.0_22, 64bit
  3. iReport:3.7.3
  4. ADempiere:3.6.0 LTS
  • 问题难点:
  • 策略:
    • 先在iReport中测试,成功后再进行ADempiere C/S 客户端测试,最后进行ADempiere B/S 浏览器端测试。
  • 总体步骤:
  1. 先准备好字体
  2. 然后在iReport系统设置当中设置好字体
  3. 接着是对.jrxml报表中的元素属性进行设置
  4. 最后对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属性的设置:
  1. Pdf Font name:有资料提到这个下拉框可能不会出现Classpath中引入的字体,我就遇到这种情况。这时可以直接手工输入字体名称,例如wqy-zenhei.ttf。
  2. Pdf Embedded:选不选均可。
  3. 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举例用的是绝对路径:
  1. C/S布署:C:\Windows\Fonts\Arial.ttf
  2. B/S布署:http://192.168.2.109:8080/WebApp/arial.ttf
  • 在这里不建议使用绝对路径,因为这样一来就不能同时布署C/S和B/S,除非你只采用一种布署方式。
  • 我们建议采用相对路径,具体设置如下:
  1. 在iReport中将元素PdfFontName设置为:wqy-zenhei.ttf
  2. 在数据字典Report窗口将JasperReport路径设置为:example.jrxml
  3. 将example.jrxml文件复制到此路径下:$ADEMPIERE_HOME/reports/
  4. 将wqy-zenhei.ttf字体文件分别复制到两个路径下:
    1. $ADEMPIERE_HOME/
    2. $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 是一个亚洲字体包)。但是这个方法我们测试后不通过。
  • 大概方法如下:
  1. 将iTextAsian.jar放到Classpath下;
  2. 元素PDF属性的设置如下:
    1. Pdf Font name:STSong-Light
    2. Pdf Embedded:True
    3. Pdf Encoding:选择UniGB-UCS2-H (Chinese Simplified)

一点技巧

  • 在iReport当中对每一个元素都要进行PDF属性设置,这样比较繁琐。这里有一个小技巧,可以利用Style进行风格设定,统一设定Pdf Font name和Pdf Encoding。

关于Subreport子报表

SUBREPORT_DIR 子报表路径

  • 在实际使用中,不需要这么复杂,将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方式均可正常显示了。

讨论栏

链接