注册.ttf字体时出现The class or file does not exist错误求助
iText自定义字体注册报错解决方案
问题描述
注册SourceSansPro-Regular.ttf字体时触发错误:The class or file does not exist,堆栈跟踪显示Table 'name' does not exist,字体文件已放置在resources/font/目录下,使用FontFactory.register方法注册失败。
报错代码
public static void registerFont() { try { if(!FontFactory.isRegistered("SourceSansPro")) { URL pathFont = GeneradorMinuta.class.getClassLoader().getResource("font/SourceSansPro-Regular.ttf"); FontFactory.register(pathFont.toString(), "SourceSansPro"); //FontFactory.register("font/SourceSansPro-Regular.ttf", "SourceSansPro"); } }catch (Exception e) { System.out.println(e.getMessage()); } catFont = FontFactory.getFont("SourceSansPro", 12, Font.BOLD); redFont = FontFactory.getFont("SourceSansPro", 11, Font.NORMAL, BaseColor.RED); greenFont = FontFactory.getFont("SourceSansPro", 18, Font.BOLD, new BaseColor(8, 111, 50)); subFont = FontFactory.getFont("SourceSansPro", 12, Font.BOLD); smallBold = FontFactory.getFont("SourceSansPro", 12, Font.BOLD); bodyFont = FontFactory.getFont("SourceSansPro", 10); underlinedFont = FontFactory.getFont("SourceSansPro", 10, Font.UNDERLINE); }
解决方案
1. 验证字体文件完整性
- 重新从官方渠道下载SourceSansPro-Regular.ttf字体文件,替换现有文件
- 用系统自带的字体预览工具打开文件,确认字体能正常显示,排除文件损坏或不完整的情况
2. 改用输入流方式注册字体
避免URL字符串解析问题,直接通过资源流加载字体:
public static void registerFont() { try { if(!FontFactory.isRegistered("SourceSansPro")) { InputStream fontStream = GeneradorMinuta.class.getClassLoader().getResourceAsStream("font/SourceSansPro-Regular.ttf"); if(fontStream != null) { // 直接创建BaseFont并注册到FontFactory BaseFont baseFont = BaseFont.createFont( "SourceSansPro-Regular.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, fontStream, null ); FontFactory.getFontImp().registerFont(baseFont, "SourceSansPro"); } else { System.err.println("无法获取字体文件流,请检查文件路径"); } } } catch (Exception e) { e.printStackTrace(); } // 后续字体获取代码保持不变 catFont = FontFactory.getFont("SourceSansPro", 12, Font.BOLD); redFont = FontFactory.getFont("SourceSansPro", 11, Font.NORMAL, BaseColor.RED); greenFont = FontFactory.getFont("SourceSansPro", 18, Font.BOLD, new BaseColor(8, 111, 50)); subFont = FontFactory.getFont("SourceSansPro", 12, Font.BOLD); smallBold = FontFactory.getFont("SourceSansPro", 12, Font.BOLD); bodyFont = FontFactory.getFont("SourceSansPro", 10); underlinedFont = FontFactory.getFont("SourceSansPro", 10, Font.UNDERLINE); }
3. 检查iText版本兼容性
- 旧版本iText对某些TTF字体的解析支持存在缺陷,建议升级到iText 5.x稳定版本(如5.5.13.3)
- 确认项目依赖中没有冲突的iText版本,避免依赖不一致导致的解析错误
4. 直接使用文件路径(仅本地开发场景)
如果是本地调试阶段,可以尝试直接使用绝对路径注册字体,排除类路径加载问题:
FontFactory.register("C:/Desarrollo/Software/Workspace/.../WEB-INF/classes/font/SourceSansPro-Regular.ttf", "SourceSansPro");
注意:部署到服务器时需改用类路径加载方式,避免硬编码路径。
内容的提问来源于stack exchange,提问作者Liliymas
相关产品推荐
相关产品推荐

