若依验证码渲染失效问题

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
...

八、总结

本次问题的根因是:

服务器字体缺失

解决路径如下:

  1. fc-list 查看系统字体
  2. 发现服务器字体极少,而且都是vf字体
  3. 安装 DejaVu 字体
  4. 渲染恢复正常

这是 Linux 环境下 Java 图片文字渲染最典型、也最容易忽略的问题之一。

相关推荐
独隅2 分钟前
IntelliJ IDEA 接入多种AI大模型插件终极指南(2026.1 企业合规版)
java·人工智能·intellij-idea
Echo_cy_2 分钟前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
ShineWinsu18 分钟前
对于Linux:模版方法类的解析以及socket、TcpSocket的封装
linux·c++·面试·socket·模板方法模式·封装·tcpsocket
JaneConan22 分钟前
鸿蒙报错速查:arkts-no-any any 类型禁用,用了就炸,根因 + 真解法
后端·harmonyos
还是奇怪30 分钟前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
zfoo-framework1 小时前
1.ansible安装 2.虚拟机克隆
java
颜酱1 小时前
# 02 | 搭骨架:用 LangGraph 编排 12 步工作流(思路)
前端·人工智能·后端
颜酱1 小时前
02 | 搭骨架:用 LangGraph 编排 12 步工作流
前端·人工智能·后端
码上解惑1 小时前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
无足鸟ICT1 小时前
【RHCA+】查看变量
linux·运维·服务器