公司项目上需要生成一张入学通知图片给用户,目前采用的是通过后端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 | <build> |