Linux 服务器 Java 字体渲染异常排查记录:
在一次服务器环境迁移中,我遇到了一个看似简单、但排查起来颇为曲折的字体渲染问题。以下是完整的排查记录,希望能为同样在服务器上处理图片文字渲染的同学提供借鉴。
一、问题现象
验证码渲染失效,用的若依的框架。用的谷歌com.google.code.kaptcha生产的验证码
Java 程序在本地渲染图片文字一切正常,但部署到 Linux 服务器后出现异常:
- 验证码串不显示,图片是空的 日志也没有任何报错
二、第一步:检查服务器字体
使用 Fontconfig 工具查看系统已有字体:
fc-list
输出显示系统原本只有 Cantarell 字体:
ini
/usr/share/fonts/abattis-cantarell-fonts/Cantarell-VF.otf: Cantarell:style=Regular
没有 Arial、Courier,也没有常用的开源字体(DejaVu / Liberation / DroidSans)。
三、进一步验证:强制指定 Cantarell 字体仍然不生效
在代码中强制:
arduino
new Font("Cantarell", Font.PLAIN, 16)
仍然无法渲染出文字。
VF(Variable Font)在 Java 中支持确实不好
-
**Java AWT/Swing 的 FontRenderContext / GlyphVector 对可变字体(Variable Font, .VF, .otf variable)支持非常有限
-
大多数情况下只能识别 VF 字体为"单一风格",无法正确处理权重、字形轴
-
甚至会出现:
- 宽度计算为 0
- GlyphVector 渲染失败
- drawString 不显示
- fallback 失败
四、安装更通用的字体:DejaVu
Linux 中最稳妥的通用字体是 DejaVu(Java 100% 兼容)。
安装:
yum install -y dejavu-sans-fonts
fc-cache -fv
再次查看字体列表:
fc-list
此时字体库已经丰富:
DejaVu Sans
DejaVu Serif
DejaVu Sans Mono
...
八、总结
本次问题的根因是:
服务器字体缺失
解决路径如下:
- 用
fc-list查看系统字体 - 发现服务器字体极少,而且都是vf字体
- 安装 DejaVu 字体
- 渲染恢复正常
这是 Linux 环境下 Java 图片文字渲染最典型、也最容易忽略的问题之一。