使用iText 8.0.5签名PDF/A文档时出现Helvetica字体未嵌入的合规性异常
iText 8.0.5签名PDF/A文档时出现Helvetica字体未嵌入的合规性异常
我之前踩过一模一样的坑!明明指定了自定义字体并设置嵌入,结果还是跳出Helvetica未嵌入的PDF/A合规性错误,后来才发现是iText签名的默认配置在偷偷搞事情。咱们一步步来解决:
首先,你得确认所有和签名相关的文本元素都用上了你指定的Verdana字体——iText的默认签名外观里,不仅是签名主体文本,连签名日期、原因、位置这些默认字段,默认都是用Helvetica的,哪怕你设置了Layer2的字体也没用。所以得把这些地方的字体都手动覆盖:
// 先确保Verdana字体路径正确,并且强制嵌入 PdfFont verdana = PdfFontFactory.CreateFont(@"C:\Windows\Fonts\verdana.ttf", PdfEncodings.WINANSI, PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED); var signer = new PdfSigner(reader, new FileStream(outputPath, FileMode.Create), new StampingProperties()); PdfSignatureAppearance appearance = signer.GetSignatureAppearance(); // 给所有签名文本字段设置字体 appearance.SetLayer2Font(verdana); appearance.SetSignDateFont(verdana); appearance.SetReasonFont(verdana); appearance.SetLocationFont(verdana); // 别忘了设置字体大小 appearance.SetLayer2FontSize(10);
其次,还有个容易忽略的点:如果你的Verdana字体加载失败(比如路径错了、字体文件不存在),iText不会抛出错误,会默默 fallback 到Helvetica,这时候你当然会看到这个异常。所以一定要加个检查,提前发现问题:
string verdanaPath = @"C:\Windows\Fonts\verdana.ttf"; if (!File.Exists(verdanaPath)) { throw new FileNotFoundException("找不到Verdana字体文件,请检查路径是否正确", verdanaPath); }
如果上面的操作还没解决,那可能是iText的默认签名模板里还有隐藏的Helvetica引用。这时候不如直接自定义签名的图层内容,完全替代默认的模板,从根源上杜绝Helvetica的出现:
// 获取签名的Layer2图层,自定义绘制所有内容 Canvas canvas = new Canvas(appearance.GetLayer2(), signer.GetDocument()); canvas.SetFont(verdana); canvas.SetFontSize(10); // 自己绘制签名文本、日期等内容 canvas.Add(new Paragraph($"签名人: {Environment.UserName}").SetMargin(0)); canvas.Add(new Paragraph($"签名日期: {DateTime.Now:yyyy-MM-dd HH:mm:ss}").SetMargin(0)); // 如果需要加原因或位置,也自己加 canvas.Add(new Paragraph($"原因: 文档确认").SetMargin(0)); canvas.Close();
这样一来,签名外观的所有文本都是用你指定的Verdana字体,iText就没机会插入Helvetica了。
最后再确认下:你的输入PDF/A本身是合规的(没有未嵌入的Helvetica),毕竟你说它是外部创建的合规文档,所以问题肯定出在签名过程中iText的默认配置上,按上面的步骤调整应该就能解决。
内容来源于stack exchange
相关产品推荐
相关产品推荐

