项目场景:
在使用freemark模板生成Html转为img文件的时。
问题描述:
提示:
在转成图片时会出现中文乱码。
html生成的图片的代码:
但是当前代码在window系统的时候生成一直成功,但是在linux系统中就是乱码,小方块。这里就想到了可能是系统字体问题,于是百度。
final File f = new File(tempFilePath,inputFilename);
if(!f.getParentFile().exists()){
f.getParentFile().mkdirs();
}
//将html转成文件。中文乱码问题处理为以下方式
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f),"UTF-8"));
writer.write(html);
writer.flush();
writer.close();
//将xhtml文件转成图片
final File resultImgFile= new File(tempFilePath,outputFilename);
try {
final Java2DRenderer renderer = new Java2DRenderer(f, widthImage);
final BufferedImage img = renderer.getImage();
final FSImageWriter imageWriter = new FSImageWriter();
imageWriter.setWriteCompressionQuality(0.9f);
FileOutputStream fileOutputStream = new FileOutputStream(resultImgFile);
OutputStream fos = new BufferedOutputStream(fileOutputStream);
imageWriter.write(img, fos);
fos.flush();
fos.close();
}finally {
f.delete();
}
原因分析:
BufferedImage在使用的时候若内容中包含中文应该是调用到当前操作系统中匹配的字体类型,若没有找到就会出现乱码。解决方案:
1.在linux中安装字体类型。
1.1 安装mkfontscale 、mkfontdir 命令
在linux中执行以下命令:
'# cd /usr/share/fonts (若fonts不存在则创建)
'# mkdir winFont (创建好目录后,将文件simsun.ttc拷到当前文件中)
'# mkfontdir (执行成功后会出现fonts.dir文件夹)
'# mkfontscale (执行成功后会出现fonts.scale文件夹)
最后如果执行成功了需要重新启动出现问题的系统服务。
··········································································
若在执行mkfontdir的过程中出现
mkfontdir: command not found
// 解决方案 在centos系统中
yum install fontconfig
yum install mkfontscale
yum install fontscale
查看当前系统语言类型 echo $LANG
设置中文:export LANG=zh_CN.UTF-8
设置英文:export LANG=en_US.UTF-8