美文网首页
saiku3.17修复pdf导出中文#号问题

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

作者: ksice | 来源:发表于2019-12-02 16:52 被阅读0次

    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官网引用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 中注册你所需要下载的字体,当然注册字体这只是其中方法之一,也可以配置<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可以借鉴一下)。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ncdfgctx.html