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

