
本文详解在 itext 7 中渲染东欧语言(如匈牙利语)特殊字符的完整方案,重点解决 `ő`、`ű` 等字符显示为空白的问题,指出 utf-8 编码在某些字体加载场景下的局限性,并推荐使用 cp1250 编码配合系统字体的可靠实践。
在使用 iText 7 生成 PDF 时,若需正确显示匈牙利语、捷克语或波兰语等中欧语言中的扩展拉丁字符(如 ő、ű、Ő、Ű、á、é、í),仅依赖 StandardFonts.TIMES_BOLD 或默认 UTF-8 编码往往会导致字符渲染为空白或方块——这是因为 iText 的 StandardFonts 类提供的内置字体(如 TIMES_BOLD)本质上是Type 1 字体子集,不包含 Unicode 完整字形映射,且其内部编码机制无法覆盖 ISO-8859-2 或 Windows-1250 所定义的东欧字符区。
✅ 正确做法是:显式加载支持这些字符的 TrueType 字体(TTF),并指定兼容的字符编码(如 CP1250),而非 UTF-8。虽然 UTF-8 是通用编码标准,但 iText 7 的 PdfFontFactory.createFont(String, String, boolean) 方法中,第二个参数 encoding 并非指“输入字符串的编码”,而是用于构建字体内置 CMap(字符映射表)的编码方案。对于 Windows 系统字体(如 arial.ttf, times.ttf, tahoma.ttf),其字形索引与 CP1250(Windows Latin-2)编码严格对齐,而 UTF-8 在此上下文中无法正确建立 Unicode 码点到字形的映射,导致 ő(U+0151)等字符被忽略。
以下是可直接运行的修复版代码示例(适配您的原始逻辑):
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Tab;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;
private static void addCenteredParagraph(Document document, float width, String text) {
PdfFont font = null;
try {
// ✅ 关键:使用系统中真实存在的 TTF 文件 + CP1250 编码
// Windows 示例路径(请按实际环境调整):
font = PdfFontFactory.createFont("C:/Windows/Fonts/arial.ttf", PdfEncodings.CP1250, true);
// Linux/macOS 可替换为:"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
} catch (Exception e) {
// 回退到支持 Unicode 的 Noto Sans(需提前下载字体文件)
try {
font = PdfFontFactory.createFont("path/to/noto-sans-hungarian.ttf", PdfEncodings.IDENTITY_H, true);
} catch (Exception ex) {
throw new RuntimeException("No suitable font available for Hungarian characters", ex);
}
}
// 构建居中段落(使用 TabStops 实现水平居中)
Paragraph p = new Paragraph()
.setFontSize(14)
.setFont(font)
.setTextAlignment(TextAlignment.CENTER) // 更简洁的居中方式(推荐)
.add(text);
document.add(p);
}? 关键注意事项:
- PdfEncodings.CP1250 是 Windows-1250 编码,原生覆盖 ő(0xF5)、ű(0xFB)、Ő(0xD5)、Ű(0xDB)等字符;而 PdfEncodings.UTF8 在 iText 7 中不适用于 TTF 字体加载(该参数仅对旧式 Type 1 字体或嵌入子集有效)。
- 若需跨平台部署,建议将 arial.ttf 替换为开源字体如 Noto Sans(需下载 .ttf 文件),并改用 IDENTITY_H 编码(支持完整 Unicode):
PdfFont noto = PdfFontFactory.createFont("noto-sans-v27-latin-ext-regular.ttf", PdfEncodings.IDENTITY_H, true); - 避免使用 StandardFonts 加载的字体处理多语言文本——它们仅适合英文 ASCII 场景。
- Java 源文件本身必须保存为 UTF-8 编码,确保字符串字面量(如 "Árvíztűrő tükörfúrógép")能被正确编译;iText 的 IDENTITY_H 或 CP1250 处理的是字体内部映射,与源码编码无关。
✅ 总结:要让 ő, ű 稳定显示,请始终
① 使用本地 .ttf 字体文件(非 StandardFonts);
② 指定 PdfEncodings.CP1250(Windows 环境)或 PdfEncodings.IDENTITY_H(通用 Unicode,需字体含对应字形);
③ 优先采用 Paragraph.setTextAlignment(TextAlignment.CENTER) 替代复杂 TabStop 逻辑,提升可维护性。










