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

ASP.NET WebForms中iTextSharp生成PDF无法显示Unicode符号求助

解决iTextSharp生成PDF时Unicode字符显示异常的问题

核心问题分析

你的代码存在两个关键错误:

  1. 使用BaseFont.CP1252编码,这是仅支持西欧字符的单字节编码,完全不兼容大部分Unicode符号;
  2. Wingdings系列字体的字符映射与标准Unicode不匹配,你输入的•、✆这类Unicode符号在Wingdings中没有对应字形,因此显示为问号。

修复步骤

1. 更换支持Unicode的字体与编码

采用BaseFont.IDENTITY_H编码(支持全Unicode水平书写),并选用包含目标Unicode符号的字体,比如Segoe UI Symbol、Arial Unicode MS、Noto Sans等。

2. 修正字体路径

C#字符串中\需转义为\\,或使用@前缀避免转义,否则路径会解析错误。

3. 移除无效的编码转换

C#字符串本身就是UTF-16编码,手动转成UTF-8再转回完全多余,反而可能破坏字符。

修正后的代码示例

// 用@避免路径转义,使用支持Unicode的编码IDENTITY_H
BaseFont baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\seguisym.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(baseFont, 12, Font.NORMAL, BaseColor.BLACK);

using (MemoryStream ms = new MemoryStream())
{
    using (var document = new Document())
    {
        PdfWriter.GetInstance(document, ms);
        document.Open(); // 必须打开文档才能添加内容
        
        string str = " • ✆ ";
        Phrase phrase = new Phrase(str, font);
        document.Add(phrase);
        
        // 如果要用XMLWorker解析HTML(替代过时的HTMLWorker)
        string htmlContent = "<p>• ✆ 这是带Unicode符号的HTML内容</p>";
        using (StringReader sr = new StringReader(htmlContent))
        {
            XMLWorkerHelper.GetInstance().ParseXHtml(PdfWriter.GetInstance(document, ms), document, sr);
        }
    }
    // 后续处理MemoryStream生成PDF文件或输出
}

额外注意事项

  • 确认目标字体文件存在于指定路径,比如Segoe UI Symbol的文件名是seguisym.ttf;
  • 过时的HTMLWorker对Unicode支持很差,建议完全替换为XMLWorker;
  • 如果必须使用Wingdings类字体,需要输入该字体对应的字符编码(而非Unicode符号),比如查询Wingdings字符映射表后,用char直接转换编码值。

内容的提问来源于stack exchange,提问作者Lindsay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:51:12