CentOS系统下Java程序使用Font字体
Java使用字体流程(Font)
使用字体流程
- 获取字体文件路径
- Font.createFont(…)
2.1. 载入字体文件流
2.2. 获取可用的所在平台FontManager - 返回创建Font
可能出现的异常
java.io.IOException: Problem reading font data.
at java.desktop/java.awt.Font.createFont0(Font.java:1183)
at java.desktop/java.awt.Font.createFont(Font.java:1052)
这种异常说明所在平台没有字体库管理组件
我以CentOS7举例解决方案
$ fc-list
此命令检查当前有无字体库管理组件
一般出现这个异常就是因为没有这个组件,此时我们只要安装即可
$ yum install fontconfig
安装完成之后会在/usr/share
目录下创建两个目录
fontconfig
fonts
具体的报错代码
获取当前平台的有效的FontManager实现。
FontManager fm = FontManagerFactory.getInstance();
/**
* Get a valid FontManager implementation for the current platform.
*
* @return a valid FontManager instance for the current platform
*/
public static synchronized FontManager getInstance() {
if (instance != null) {
return instance;
}
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
try {
String fmClassName =
System.getProperty("sun.font.fontmanager",
DEFAULT_CLASS);
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class<?> fmClass = Class.forName(fmClassName, true, cl);
instance =
(FontManager) fmClass.getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException ex) {
throw new InternalError(ex);
}
return null;
}
});
return instance;
}
使用anji-plus在CentOS下初始化异常
ERROR 32033 --- [ main] c.a.c.s.i.ClickWordCaptchaServiceImpl : load font error:{}
java.io.IOException: Problem reading font data.
at java.desktop/java.awt.Font.createFont0(Font.java:1183)
at java.desktop/java.awt.Font.createFont(Font.java:1052)
at com.anji.captcha.service.impl.AbstractCaptchaService.loadWaterMarkFont(AbstractCaptchaService.java:199)
at com.anji.captcha.service.impl.AbstractCaptchaService.init(AbstractCaptchaService.java:89)
at com.anji.captcha.service.impl.ClickWordCaptchaServiceImpl.init(ClickWordCaptchaServiceImpl.java:43)
at com.anji.captcha.service.impl.DefaultCaptchaServiceImpl.init(DefaultCaptchaServiceImpl.java:31)
at com.anji.captcha.service.impl.CaptchaServiceFactory.getInstance(CaptchaServiceFactory.java:36)
此报错原因就是在使用customer font的时候系统上没有FontManager组件。