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

iText 7部署Tomcat WAR包时从类路径加载字体失败求助

解决iText 7在Tomcat WAR包中加载字体失败的问题

我之前也踩过一模一样的坑——本地用文件路径跑完全正常,一打包成WAR部署到Tomcat就各种报错,核心问题其实是本地文件系统和WAR包内资源的访问逻辑完全不一样:WAR里的字体文件是嵌入在包内部的,不是磁盘上的独立文件,直接用File或者绝对路径肯定找不到。下面给你几个亲测有效的解决办法,按优先级来试:

1. 用类加载器获取资源流(最推荐)

这是Java Web项目加载内部资源的标准操作,不管本地调试还是打包部署都能稳定工作:

// 用线程上下文类加载器更稳妥,避免类加载器上下文不一致的问题
try (InputStream fontStream = Thread.currentThread().getContextClassLoader()
        .getResourceAsStream("pdf/fonts/你的字体文件名.ttf")) {
    if (fontStream == null) {
        throw new IllegalArgumentException("找不到字体文件,请检查路径是否正确");
    }
    // 加载并嵌入字体
    PdfFont font = PdfFontFactory.createFont(
        FontProgramFactory.createFont(fontStream),
        PdfEncodings.IDENTITY_H,
        PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED
    );
} catch (IOException e) {
    e.printStackTrace();
}

注意事项:

  • 路径是相对于src/main/resources的,直接写pdf/fonts/xxx.ttf即可,不要加开头的/
  • 一定要检查流是否为空,避免后续出现空指针或字体识别异常
  • 用try-with-resources自动关闭流,防止资源泄漏

2. 排查常见踩坑点

如果还是报font.is.not.recognized,大概率是这几个问题:

  • 路径大小写错误:Tomcat运行在Linux环境下是区分大小写的,本地Windows不区分,确认你的路径和WAR包内的实际结构完全一致
  • 字体文件没打进WAR:解压WAR包看看WEB-INF/classes/pdf/fonts下有没有目标字体,大小和本地文件是否一致,避免打包时遗漏资源
  • 字体文件损坏:确保是标准的TTF/OTF格式,不要用加密或损坏的字体文件

3. 备用方案:外部目录存放字体

如果上面的方法还是不行,可以把字体放到Tomcat外部目录(比如Tomcat/webapps/你的项目/WEB-INF/fonts),通过ServletContext获取真实路径:

ServletContext context = getServletContext();
String fontRealPath = context.getRealPath("/WEB-INF/fonts/你的字体文件名.ttf");
PdfFont font = PdfFontFactory.createFont(fontRealPath, PdfEncodings.IDENTITY_H);

不过这个方案不推荐,因为部署时需要额外拷贝字体文件,不如类加载器方式灵活通用。

内容的提问来源于stack exchange,提问作者berimbolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:18