如何在iTextPDF中正常显示ő、ű等特殊外文字符?
解决方案:PDF中匈牙利语特殊字符(ő、Ő、ű、Ű)显示异常问题
问题根源分析
- 内置Base14字体局限性:
StandardFonts.TIMES_BOLD属于PDF内置的Base14字体,仅支持ASCII及少量扩展字符,不包含匈牙利语的ő、Ő、ű、Ű等中欧特殊字符,因此即使字体加载成功也无法显示这类字符。 - 字体加载失败:
timesNewRomanBold对象始终为null,大概率是依赖版本兼容问题,或是未正确处理字体加载的异常细节,导致内置字体初始化失败。
修正方案
核心思路是使用支持中欧字符的本地TrueType/OpenType字体文件,并嵌入到PDF中,确保字符集完整。以下是针对原函数的修正版本:
修正后的addCenteredParagraph函数
private static void addCenteredParagraph(Document document, float width, String text) { PdfFont customFont = null; try { // 替换为本地支持中欧字符的字体文件路径,比如Windows下的Times New Roman粗体 // 注意:不同系统字体路径不同,Linux/macOS需替换为对应路径 String fontPath = "C:/Windows/Fonts/timesbd.ttf"; // Times New Roman 粗体的真实文件名 // 加载字体,指定UTF-8编码,第三个参数true表示嵌入字体到PDF customFont = PdfFontFactory.createFont(fontPath, PdfEncodings.UTF8, true); } catch (IOException e) { LOGGER.error("Failed to load custom font.", e); // 降级使用内置字体(仅作为备选,仍无法显示特殊字符) try { customFont = PdfFontFactory.createFont(StandardFonts.TIMES_BOLD); } catch (IOException ex) { LOGGER.error("Failed to fall back to standard font.", ex); } } List<TabStop> tabStops = new ArrayList<>(); tabStops.add(new TabStop(width / 2, TabAlignment.CENTER)); tabStops.add(new TabStop(width, TabAlignment.LEFT)); Paragraph p = new Paragraph().addTabStops(tabStops).setFontSize(14); if (customFont != null) { p.setFont(customFont); } p.add(new Tab()).add(text).add(new Tab()); document.add(p); }
关键注意事项
- 字体路径正确性:Windows系统中,Times New Roman粗体的真实文件名是
timesbd.ttf,而非直观的“Times New Bold”,需确认系统字体目录下的实际文件名。 - 字体嵌入:
PdfFontFactory.createFont第三个参数设为true,会将字体的必要字符集嵌入PDF,避免在无对应字体的设备上显示异常。 - 跨系统兼容:如果需要跨平台运行,建议将字体文件打包到项目资源中,通过类路径加载,而非依赖系统字体路径,示例:
// 从项目resources目录加载字体 customFont = PdfFontFactory.createFont("/fonts/timesbd.ttf", PdfEncodings.UTF8, true);
针对ChatGPT示例代码的修正
原示例可能因字体路径错误导致加载失败,修正后版本:
import java.io.IOException; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; public class PDFMaker { public static void main(String[] args) { try { PdfDocument pdfDoc = new PdfDocument(new PdfWriter("output.pdf")); Document document = new Document(pdfDoc); // 使用正确的字体文件名 PdfFont font = PdfFontFactory.createFont("C:/Windows/Fonts/arial.ttf", PdfEncodings.UTF8, true); Paragraph paragraph = new Paragraph("Árvíztűrő tükörfúrógép."); paragraph.setFont(font); paragraph.setTextAlignment(TextAlignment.CENTER); document.add(paragraph); document.close(); } catch (IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Fabio Mándity
相关产品推荐
相关产品推荐

