0%

记一次 Java 加载字体文件异常

公司项目上需要生成一张入学通知图片给用户,目前采用的是通过后端 Java 使用 Graphics2D 库将动态数据填充到背景图上再写回浏览器的方式。由于设计图采用了几种比较特殊的字体,字体文件考虑到部署可迁移,没有采用安装到系统或者 jre 的方式,而是放在项目包下,最开始跟页面文件一起放在 WEB-INF 目录下,在 Controller 中使用 request.getSession().getServletContext().getRealPath("WEB-INF/ttf/iYuanTi.ttf") 来获取字体文件的真实路径,通过 Font.createFont(fontFormat, fontStream) 加载字体,但是这样做会造成服务器硬盘爆满,具体原因另做分析。

由于上面方法的问题,考虑将字体文件放在 resource 文件夹下 (打包以后在 classes 下),在应用初始化的时候进行加载,只需加载一次,本地调试没问题,打包,上测试机,访问,没出来,看日志,加载字体的时候抛出了 java.awt.FontFormatException: bad table, tag=1196445523 异常,查文件、部署包都没问题,发现字体文件的大小不太对,对比文件 Hash,确实部署包和源文件不是同一个文件了。

最后,查出问题是因为项目使用了 maven-resources-plugin 插件,这个插件会将指定的文件夹下的文件,按照配置的字符编码进行转换。所以只需要配置排除掉 ttf 文件就可以了。配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.ttf</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.ttf</include>
</includes>
</resource>
</resources>
</build>
旺旺小学酥 微信

微信

旺旺小学酥 支付宝

支付宝