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

使用iTextSharp 5.5.13.3给PDF添加西里尔字符印章报错求助

解决iTextSharp 5.5.13.3添加西里尔字符印章的编码异常问题

异常原因

在.NET Core/.NET 5+环境中,默认不再预装windows-1252这类旧编码集,而iTextSharp 5.x版本内部依赖该编码处理字体,导致创建BaseFont时抛出编码不支持的异常。

解决方案步骤

  1. 安装编码支持包
    安装NuGet包 System.Text.Encoding.CodePages,该包提供旧编码的支持能力。

  2. 注册编码提供器
    在创建字体的代码之前,添加编码注册逻辑,让.NET能够识别windows-1252编码:

    using System.Text;
    // ...
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    
  3. 确认字体有效性

    • 确保指定的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:15:37