
openpdf 默认不支持中文、韩文等非拉丁字符,需显式指定并嵌入支持 unicode 的字体(如 noto sans cjk),否则文字将显示为空白;本文详解字体注册、嵌入及实际编码调用方法。
openpdf 默认不支持中文、韩文等非拉丁字符,需显式指定并嵌入支持 unicode 的字体(如 noto sans cjk),否则文字将显示为空白;本文详解字体注册、嵌入及实际编码调用方法。
OpenPDF 基于 iText 2.x 分支演进,其底层字体引擎默认仅加载基础 Latin-1 字体(如 Helvetica),对 UTF-8 编码的东亚字符(如汉字、韩文、日文)缺乏原生支持。若未显式配置兼容字体,PdfContentByte.showText() 或 Paragraph 等文本渲染操作会静默跳过无法映射的字符,最终 PDF 中对应位置留空——这正是用户遇到“Korean/Chinese 显示为空”的根本原因。
✅ 正确做法是:选用支持目标语言的 TrueType/OpenType 字体(推荐 Google Noto Sans CJK 系列),通过 BaseFont.createFont() 注册为嵌入式字体,并在 Font 实例中绑定使用。关键代码如下:
// 1. 加载并嵌入支持中/韩/日的字体(以 NotoSansCJKsc-Regular.otf 为例)
String fontPath = "NotoSansCJKsc-Regular.otf"; // 确保该文件在 classpath 或绝对路径下
BaseFont baseFont = BaseFont.createFont(
fontPath,
BaseFont.IDENTITY_H, // 必须使用 IDENTITY_H 以支持 Unicode
BaseFont.EMBEDDED // 强制嵌入,确保跨设备显示一致
);
// 2. 创建可复用的 Font 对象
Font font = new Font(baseFont, 12f);
// 3. 在文档中使用(自动处理 UTF-8 文本)
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("multi-lang.pdf"));
document.open();
document.add(new Paragraph("你好,안녕하세요,こんにちは!", font)); // ✅ 正确显示
document.close();
⚠️ 注意事项:
- BaseFont.IDENTITY_H 是核心参数:它启用 Unicode 编码映射(CMap),替代默认的 CP1252 编码,缺一不可;
- 务必设置 BaseFont.EMBEDDED:避免依赖系统字体,保证 PDF 在任意环境正确渲染;
- 推荐字体资源:Google Noto Fonts → 下载 NotoSansCJKsc(简体中文)、NotoSansCJKkr(韩文)或通用 NotoSansCJKjp;
- 若使用 Maven,可引入 opentype 支持依赖(OpenPDF ≥ 1.3.27 自带 fontbox 支持 OTF/TTF);
- 表单字段(AcroFields)同样适用此方案:为 TextField 设置 setFont() 并确保 setOptions(BaseField.DO_NOT_SCROLL) 避免截断。
总结:OpenPDF 的多语言支持不是“开箱即用”,而是“按需注入”。只要严格遵循「选对字体 → 正确编码 → 强制嵌入」三步原则,即可稳定输出含中、韩、日等多语种的高质量 PDF。











