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

Linux环境PDFBox生成中文水印报错No glyph for U+FFFD问题咨询

问题根因
  • 报错提示中的U+FFFD是Unicode标准定义的替换字符,仅当文本中存在无法被当前编码识别的异常内容时才会生成,绝大多数字体都未收录该字符的字形,因此触发报错。
  • 你使用的pdfbox 3.0.0-alpha2为早期测试版本,存在多个中文编码处理的已知缺陷,同时Linux环境默认字符编码如果不是UTF-8,会导致传入的中文水印文本被错误转码为U+FFFD。
  • 字体加载时传入的第三个参数false(禁用字体子集嵌入),在Linux环境下会触发pdfbox的字符编码映射异常。
可落地的解决步骤
  1. 排查文本编码异常
    打印传入的水印文本原始内容,确认无乱码。如果文本来自配置、接口等外部来源,强制指定编码为UTF-8,避免Linux系统默认编码转码异常:
    // 示例:强制将文本转为UTF-8编码
    String watermarkText = new String(originalText.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
    
  2. 调整字体加载参数
    将PDType0Font.load方法的第三个参数改为true,开启字体子集嵌入,适配Linux环境的编码映射逻辑:
    PDFont font = PDType0Font.load(doc, new FileInputStream("/usr/local/services/converter-1.0/lib/STFANGSO.TTF"), true);
    
  3. 更换稳定版本的pdfbox
    3.0.0-alpha2属于未正式发布的测试版本,中文兼容性极差,建议降级到2.x系列稳定版(如2.0.32),该版本经过大量生产环境验证,不会出现这类中文编码报错。
  4. 强制JVM使用UTF-8编码
    启动Java服务时添加启动参数,避免JVM读取Linux系统默认编码导致的全局转码异常:
    java -Dfile.encoding=UTF-8 -jar your-application.jar
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:27:00