saiku是一个轻量级的OLAP分析引擎,可以方便扩展、嵌入和配置,通过restful连接OLAP系统,利用其友好的界面为用户提供直观的分析数据的方式,可以将报表分析数据进行excel、csv、pdf导出,但是由于pdf导出好像并没有完全开发完成还是测试阶段,导出的pdf中文都是由#号代替,github上也有人提出issue not support chinese 但是并没有说解决方式,以下我将分享我的解决方式
1、解决fop不引用config配置
saiku的pdf导出采用的是Apache fop,将html通过xhtml2fo.xsl模板转成fo文件然后转成pdf,fop有个config.xml文件是用来注册字体进行使用核心就是配置config.xml,saiku3.17使用fop的源码(PdfReport类)
FopFactoryBuilder builder =null;
try {
builder =new FopFactoryBuilder(this.getClass().getResource("fop_config.xml").toURI());
}catch (URISyntaxException e) {
e.printStackTrace();
}
builder.setStrictFOValidation(false);
这个config的引用运行的时候不报错,无论如何修改fop_config.xml文件就是没有影响,虽然不知道为什么会这样,但是就是确定以上代码根本没用引用到fopconfig配置,于是使用官网的例子替换掉以上代码
官网给了两种引用方式,一种是使用fop.xconf一种是使用xml文件,saiku使用的就是第二种,替换掉之前存在的引用
DefaultConfigurationBuilder cfgBuilder =new DefaultConfigurationBuilder();
Configuration cfg = cfgBuilder.build(this.getClass().getResourceAsStream("fop_config.xml"));
FopFactoryBuilder fopFactoryBuilder =new FopFactoryBuilder(new File(".").toURI()).setConfiguration(cfg);
FopFactory fopFactory = fopFactoryBuilder.build();
这时候configxml就可以正常的引用
2、fop添加字体配置
config被使用后需要注册使用的字体(我采用的是宋体),在config.xml 中注册你所需要下载的字体,当然注册字体这只是其中方法之一,也可以配置<auto-detect/>自动扫描字体或者设置<directory>/Users/ksice/IdeaProjects/saiku/saiku-core/saiku-web/src/main/resources/org/saiku/web/export/fonts</directory>字体目录等一些注册方式,我采用的是注册指定的字体文件方式
<font metrics-url="../../pentaho-solutions/system/saiku/ui/font/simsun.xml" kerning="yes"
embed-url="../../pentaho-solutions/system/saiku/ui/font/simsun.ttf">
<font-triplet name="SimSun" style="normal" weight="normal"/>
<font-triplet name="SimSun" style="normal" weight="normal"/>
</font>
metrics-url和 embed-url可以填写绝对路径也可以相对路径,根据不同需求各自选取,你把字体替换完成后,本地测试输出的pdf文档中文会正常显示,但是saiku的打包会将字体也打包到jar包中,这时候你配置的路径可能需要根据你实际情况进行改写,将字体文件单独提出来或者打包到某个文件夹下做静态文件,然后就可以成功的显示中文,当然也可以打成jar直接进行读取(但是我没有成功希望读者可以试试,之前在网上找到一篇实现如何在jar包中读取fop字体https://codeday.me/bug/20190624/1283307.html可以借鉴一下)。