ASP.NET WebForms中iTextSharp生成PDF无法显示Unicode符号求助
解决iTextSharp生成PDF时Unicode字符显示异常的问题
核心问题分析
你的代码存在两个关键错误:
- 使用BaseFont.CP1252编码,这是仅支持西欧字符的单字节编码,完全不兼容大部分Unicode符号;
- 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
相关产品推荐
相关产品推荐

