You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:14:58