使用iTextSharp 5.5.13.3给PDF添加西里尔字符印章报错求助
解决iTextSharp 5.5.13.3添加西里尔字符印章的编码异常问题
异常原因
在.NET Core/.NET 5+环境中,默认不再预装windows-1252这类旧编码集,而iTextSharp 5.x版本内部依赖该编码处理字体,导致创建BaseFont时抛出编码不支持的异常。
解决方案步骤
安装编码支持包
安装NuGet包System.Text.Encoding.CodePages,该包提供旧编码的支持能力。注册编码提供器
在创建字体的代码之前,添加编码注册逻辑,让.NET能够识别windows-1252编码:using System.Text; // ... Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);确认字体有效性
- 确保指定的
Arial.TTF路径正确,且该字体文件支持西里尔字符(Arial默认支持,若系统中不存在该字体,可替换为Arial Unicode MS.ttf这类更全面的Unicode字体)。 - 若使用自定义字体文件,需严格校验文件路径是否正确。
- 确保指定的
修改后的完整代码
using System.Text; using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; // 注册编码提供器,必须放在创建BaseFont之前 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); PdfTemplate layer2 = appearance.GetLayer(2); String text = " Копия ВЕРНА\n" + " Дата: " + DateTime.Now.ToString("dd.MM.yyyy HH:mm") +"\n"; // 可替换为Arial Unicode MS以确保全面支持西里尔字符 string externalFont = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "Arial.TTF"); BaseFont externalBaseFont = BaseFont.CreateFont(externalFont, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Font font = new Font(externalBaseFont,6, Font.NORMAL, BaseColor.BLACK); float size = font.Size; float margin = 1; Rectangle dataRect = new Rectangle(margin, margin, appearance.Rect.Width- margin, appearance.Rect.Height - margin); if (size <= 0) { Rectangle sr = new Rectangle(dataRect.Width, dataRect.Height); size = ColumnText.FitText(font, text, sr, 10, appearance.RunDirection); } ColumnText ct = new ColumnText(layer2); ct.RunDirection=(appearance.RunDirection); ct.SetSimpleColumn(new Phrase(text, font), dataRect.Left, dataRect.Bottom, dataRect.Right, dataRect.Top, size, Element.ALIGN_LEFT); ct.Go(); layer2.SetRGBColorStroke(0, 0, 0); layer2.SetLineWidth(0.5); layer2.Rectangle(dataRect.Left, dataRect.Bottom, dataRect.Width, dataRect.Height); layer2.Stroke();
额外说明
BaseFont.IDENTITY_H是适配Unicode水平书写的编码,能确保西里尔字符被正确渲染。- 如果仍出现字符显示异常,优先检查字体是否支持目标字符集,替换为更全面的Unicode字体即可。
内容的提问来源于stack exchange,提问作者kassfb
相关产品推荐
相关产品推荐

