4月 272020
 

现象

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

原因

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

解决

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

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

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

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

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

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

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

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

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

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

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

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

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

	//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;
    }

参考资料


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)