spring项目部署linux时读取字体失败导致绘图时输出乱码

spring项目部署linux时读取字体失败导致绘图时输出乱码

现象

spring项目部署linux时读取字体失败导致绘图时输出乱码,比如说调用Graphics2D graphic绘图时用到字体,却输出乱码。

原因

字体文件找不到,比如说开发环境是windows,可能是使用“微软雅黑”字体,是正常的,但部署到线上(往往是linux),就会是乱码。

解决

1、找到项目所需字体,上传到linux服务器中,并放到指定位置

先说结论:我个人不推荐这样做!!!

比如说这篇帖子中说的(我没试验,网上搜到顺手转给大家):
java jdk-awt.font在centos上中文乱码的问题, 安装中文字体

之所以不推荐,是因为这样做,线上部署时增加了依赖关系,增加了维护成本。

2、将所依赖字体放入到项目中,直接一起部署到线上环境

我个人觉得这样做比较好,因为不会依赖外部环境,所需做的只是读取自带的字体文件而已。
当然,这里埋着几个坑,分享下:

(1)整个项目(资源文件、依赖包等)打成1个jar包部署时,注意读取文件的方式

由于文件都已经保存到了一个jar包中,直接调用

1
2
File file = ResourceUtils.getFile("classpath:excelTemplate/test.xlsx");
InputStream inputStream = new FileInputStream(file);

这种方式可能读取不到文件,需要使用Classloader去读取,具体参考上篇文章spring-boot以jar包方式时读取resource或是template文件

(2)读取字体文件、创建Font对象时,可能存在不断创建临时文件的问题

这个问题我在网上搜时频繁出现,我自己没遇到,贴出来供大家参考。

不会创建临时文件的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//filepath字体文件的路径
private static java.awt.Font getSelfDefinedFont(String filepath){
java.awt.Font font = null;
File file = new File(filepath);
try{
font = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, file);
font = font.deriveFont(java.awt.Font.PLAIN, 40);
}catch (FontFormatException e){
return null;
}catch (FileNotFoundException e){
return null;
}catch (IOException e){
return null;
}
return font;
}

参考资料