在linux环境下使用icepdf或pdfbox将pdf转化成图片是出现乱码,网上查发下是itextpdf生成pdf引用"STSong-Light"字体而linux环境下没有这个字体造成的。
所有要从根源解决问题,就是在生成pdf的时候就给它指定系统存在的字体,这样pdf转化成图片就没问题了。
pdfbox生成pdf时候默认用的字体为"STSong-Light",但是STSong-Light字体在全网搜索有点坑,都没找到,如果pdf不转换成图片的时候则没问题,如果业务需要,将pdf转化成图片时候,在Windows环境下没问题,放到linux就乱码,通过网上的资料发现,可以引用系统的字体。这样生成的图片就没问题,下面介绍下引用系统的字体的方法(前提是系统存在这些字体,linux下装字体请自行百度,这里不再累述)
修改itextpdf字体代码如下:
public Font chineseFont(int size) throws Exception {
// 设置中文
//BaseFont b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //默认的字体调用
//获取系统字体的路径
String prefixFont = "";
String os = System.getProperties().getProperty("os.name");//获取系统类型
if (os.startsWith("win") || os.startsWith("Win")) {//win下获取字体的路径
prefixFont = "C:\\Windows\\Fonts" + File.separator + "STSONG.TTF";
} else {
prefixFont = "/usr/share/fonts" + File.separator + "STSONG.TTF"; {//linux下获取字体的路径,注意该目录下如果没有需额外安装,如我用的是STSONG字体
}
logger.info("获取到的系统的字体路径为:"+prefixFont);
BaseFont b = null;
try {
b = BaseFont.createFont(prefixFont, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
logger.info("使用系统的宋体字体生成pdf!");
} catch (Exception e) {
//如果发生异常执行默认的字体
b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
logger.info("没有获取系统的STSONG字体,使用pdf默认体字生成pdf!");
} return new Font(b, size, Font.NORMAL, BaseColor.BLACK);
}