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

如何在iTextPDF中正常显示ő、ű等特殊外文字符?

解决方案:PDF中匈牙利语特殊字符(ő、Ő、ű、Ű)显示异常问题

问题根源分析

  1. 内置Base14字体局限性:StandardFonts.TIMES_BOLD属于PDF内置的Base14字体,仅支持ASCII及少量扩展字符,不包含匈牙利语的ő、Ő、ű、Ű等中欧特殊字符,因此即使字体加载成功也无法显示这类字符。
  2. 字体加载失败: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:55:16