特殊字体扩展

对于一些商业字体或自定义的字体,我们可以利用报表的FontRegister扩展机制实现字体扩展,从而解决用的需要。 不过还有一些特殊的字体,直接输出到PDF后,在PDF中显示是不正常的,例如高棉语里常用的KmherOS字体,如果直接输出显示是不正常的。

对于这种问题,常见的解决方案是进行字体转换,改变内部的字节码内容,再输出。有些情况下输出的字体还要特殊指定。针对这种需求我们可以利用报表设计器的FontRenderRegister类来扩展:

package com.basksoft.report.core.export.pdf.font;

public interface FontRenderRegister extends FontRegister {
    /**
     * @return 返回自定义的字体名称
     */
    String getFontName();
    /**
     * 返回字体所在位置,需要注意的是字体文件需要放置到classpath下,这里返回的值就是该字体文件所在classpath下位置即可
     * @return 返回字体所在位置
     */
    String getFontPath();
    /**
     * 通过文本渲染对象的处理返回新的渲染字符串,如果为空则不做处理
     * @return 返回文字渲染对象
     */
    FontRender getFontRender();
    /**
     * 获取最终被渲染的字体名称,如果为空则还用原来的字体显示
     * @return 返回最终被渲染的字体名称
     */
    String getRenderFontName();
}

利用【SPI】机制进行接口扩展。 参考实现:

public class KhmerFontRegister implements FontRenderRegister {

    public String getFontName() {
        return "Khmer OS";
    }

    public String getFontPath() {
        return "com/basksoft/baskreport/demo/font/KHMEROS.TTF";
    }

    @Override
    public FontRender getFontRender() {
        return new KhmerFontRender();
    }

    @Override
    public String getRenderFontName() {
        return "Khmer OS Battambang";
    }
}

其中getFontRender用于返回字体的自定义字节码替换的渲染器对象,getRenderFontName用于告诉报表引擎最终渲染采用的字体的字体名称。

FontRender接口:

public interface FontRender {
    /**
     * @return 放回重新渲染后的文本内容
     */
    public String render(final String strInput);
}

参考实现:

public class KhmerFontRender implements FontRender {
    private final static UnicodeRender render = new UnicodeRender();

    @Override
    public String render(String strInput) {
        return render.render(strInput);
    }
}

高棉语UnicodeRender的参考文档: https://github.com/Seuksa/iTextKhmer

results matching ""

    No results matching ""