saiku3.17修复pdf导出中文#号问题

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配置,于是使用官网的例子替换掉以上代码

saiku3.17修复pdf导出中文#号问题_第1张图片
fop官网引用fop截图

官网给了两种引用方式,一种是使用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 中注册你所需要下载的字体,当然注册字体这只是其中方法之一,也可以配置自动扫描字体或者设置/Users/ksice/IdeaProjects/saiku/saiku-core/saiku-web/src/main/resources/org/saiku/web/export/fonts字体目录等一些注册方式,我采用的是注册指定的字体文件方式


      embed-url="../../pentaho-solutions/system/saiku/ui/font/simsun.ttf">

   

   

metrics-url和  embed-url可以填写绝对路径也可以相对路径,根据不同需求各自选取,你把字体替换完成后,本地测试输出的pdf文档中文会正常显示,但是saiku的打包会将字体也打包到jar包中,这时候你配置的路径可能需要根据你实际情况进行改写,将字体文件单独提出来或者打包到某个文件夹下做静态文件,然后就可以成功的显示中文,当然也可以打成jar直接进行读取(但是我没有成功希望读者可以试试,之前在网上找到一篇实现如何在jar包中读取fop字体https://codeday.me/bug/20190624/1283307.html可以借鉴一下)。

你可能感兴趣的:(saiku3.17修复pdf导出中文#号问题)