CrystalReports > 遇到的坑

水晶报表中遇到的坑

一、模板中用到的字体

1.水晶报表官方文档直接说明,如果需要导出PDF,则只支持ttf字体

2.在使用中发现,并非所有ttf字体都能导出PDF,如阿里巴巴普惠体。

由于对字体文件不熟悉,目前只知道在读取字体文件时,会查询一堆Table。

其中的ControlValueTable无法获取fontTableName,在此过程中抛出空指针异常,导致无法导出PDF。

3.初次读取报表模板文件时,优先从java运行时环境依赖下查询字体/jre/lib/font,次之是系统安装的字体。

读取字体到结构Map<String,Font>中,其中String为字体名称。

在读取某些中文字体时,key为null,发现此现象的字体是从某个字体站下载的汉仪字体包。

4.除了以上字体外,目前使用的大部分ttf中文字体都可以正常导出PDF,如微软雅黑、楷体、宋体、文泉驿正黑等,但是会出现第二条问题,如下所示。

二、chrome浏览器无法显示个别中字

1.直接从浏览器打印也会打印空白字

2.不同字体不显示的字不同,尚未发现能完美显示所有字的中文字体

3.Firefox和IE正常显示所有字

4.从chrome保存到本地后,使用其他PDF编辑器(如acrobat)打开,所有字正常显示

5.从chrome中的PDF空白字处复制不显示的字符,到本地文本编辑器(如NotePad++)可以正常显示该字

6.使用水晶报表编辑工具SAP Crystal Reports无论是预览还是导出PDF均可以正常显示所有字

7.当模板中配置了【思源黑体.otf】且系统和jre/lib/font下均不存在阿里巴巴普惠体时,

输出PDF到chrome浏览器可以显示所有字,但是点击下载或打印会导致浏览器崩溃。

偶尔可以下载成功,下载得到的PDF使用本地其他PDF编辑器打开会导致编辑器崩溃。

三、Java bean作为数据源

1.修改CRConfig.xml配置,在SAP Crystal Reports2016中,需要修改:

  • JavaDir32
  • JavaDir64
  • JavaBeansClassPath

2.通过阅读官方说明文档,Bean文件需要编译为.class文件或打包为.jar文件。

.class需配置JavaBeansClassPath为路径,.jar需配置JavaBeansClassPath为路径+xxx.jar。

3.bean文件中需要包含返回类型为java.sql.ResultSet的方法,不可以返回null,不可以是不能正常运行的SQL,否则在报表编辑器中连接时均无法连接。一个示例如下:

public ResultSet getDoorBean() throws ReportSDKException {
    List<DoorBean> doorItems = new ArrayList<>();
    POJOResultSetHelper helper = new POJOResultSetHelper(DoorBean.class);
    return helper.createResultSet(doorItems);
}

其中,getDoorBean会成为编辑器中数据源连接的表名,也是读取并注入数据源时需要写入的表名。

4.编译为.class文件并且正确配置JavaBeansClassPath后,打开SAP Crystal Reports2016,选择Java bean connectivity,在下拉框中应当出现javaservertype=javabeans javabeanname=的字样。

并非直接出现bean的名称,只有连接成功后下拉框中才会出现bean名称列表。

成功连接后,bean字段与jdbc方式获取的字段一样,可以拖拽到模板中。

5.如果bean字段修改,可以通过【验证数据库】操作进行字段更新,避免重新连接数据源导致重新配置字段,验证的字段通过名称进行比对映射。

四、图片

1.暂时未发现使用相对路径读取到图片的方法

2.使用绝对路径可以读取图片

3.使用URL可以读取图片,但是官方论坛的答复是:不支持https

4.可以通过公式字段获取模板的绝对路径,再通过模板与图片的相对位置关系获得图片路径,如下所示:

Left(Filename,length(filename) - Length(Mid (Filename ,InstrRev (Filename,"\") + 1) )) 

但是不解决问题,因为使用tomcat运行后端时,读取一次模板文件,就默认在tomcat/temp下生成临时模板数据。

此时获取到的模板路径是tomcat/temp,而非项目路径。

5.关于模板文件

在本地运行中发现,如果删除tomcat路径下的temp文件夹,临时文件被生成到idea intellij的安装路径下的temp文件夹中。

论坛的答复是,只要ReportClientDocument流被close,临时文件就会被删除,实际上并没有。

6.透明背景

Crystal Reports converts images to .bmp which unfortunately does not support transparency for images.

官方论坛关于透明背景显示黑色的答复如上,不支持透明,但是也未给出比如设置背景色为白色或黑色的解决方案。