本文介绍: 首先去ofd解压文件抓取内部字体文件,如果这里出现异常会导致该部分字体无法正常显示。相关问题也可以看我这篇。,并没有对字体文件有效性进行判断,如果外部异常,则无法加载默认字体从而导致部分文字直接显示不出来。几行代码(我选用的),或者在异常报错处进行捕获并加载有效字体。1. 系统内没有安装对应的字体 2. 如果是ofd文件。进行启动时扫描,可使用反射对以加载字体进行查看。一、对于没有安装字体的,需要安装字体,或者使用。进行字体加载,可用看到它在首次会判断从。
导致字体无法加载主要有两个因素: 1. 系统内没有安装对应的字体 2. 如果是ofd文件ofdrw
首先去ofd解压文件抓取内部字体文件,如果这里出现异常会导致该部分字体无法正常显示。相关问题也可以看我这篇开发手账(一)
,下面是解决方案
一、对于没有安装字体的,需要安装字体,或者使用org.ofdrw.converter.FontLoader#scanFontDir(java.nio.file.Path)
进行启动时扫描,可使用反射对以加载字体进行查看。
Field namePathMapping = ReflectUtil.getField(FontLoader.class, "fontNamePathMapping");
Map<String, String> fontNamePathMapping = (Map<String, String>) ReflectUtil.getFieldValue(preload,namePathMapping);
System.out.println("已加载字体:" + JSONUtil.toJsonStr(fontNamePathMapping.keySet()));
二、ofdrw
会走下面的方法org.ofdrw.converter.FontLoader#loadFontSimilarStream
进行字体加载,可用看到它在首次会判断从ResourceLocator
加载ctFont
,并没有对字体文件有效性进行判断,如果外部异常,则无法加载默认字体从而导致部分文字直接显示不出来。
解决方法:可用直接注释掉内嵌字体绝对路径
几行代码(我选用的),或者在异常报错处进行捕获并加载有效字体。需要这里都是需要对ofdrw
源码进行修改
public InputStream loadFontSimilarStream(ResourceLocator rl, CT_Font ctFont) {
byte[] buf = null;
try {
if (ctFont != null) {
// 内嵌字体绝对路径
ST_Loc fontFileLoc = ctFont.getFontFile();
if (fontFileLoc != null) {
String fontAbsPath = rl.getFile(ctFont.getFontFile()).toAbsolutePath().toString();
buf = Files.readAllBytes(Paths.get(fontAbsPath));
} else {
// 无法从内部加载时,通过相似字体查找
String similarFontPath = getReplaceSimilarFontPath(ctFont.getFamilyName(), ctFont.getFontName());
if (similarFontPath != null) {
buf = Files.readAllBytes(Paths.get(similarFontPath));
}
}
}
} catch (Exception e) {
if (DEBUG) {
log.warn("无法加载字体: " + ctFont.getFamilyName() + " " + ctFont.getFontName() + " " + ctFont.getFontFile(), e);
}
}
if (buf == null || buf.length == 0) {
try {
buf = Files.readAllBytes(DefaultFontPath);
} catch (IOException e) {
throw new RuntimeException("默认字体文件读取异常", e);
}
}
return new ByteArrayInputStream(buf);
}
原文地址:https://blog.csdn.net/weixin_53083143/article/details/134726142
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_26898.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。