特殊字体扩展
对于一些商业字体或自定义的字体,我们可以利用报表的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