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>
旺旺小学酥 微信

微信

旺旺小学酥 支付宝

支付宝