如何使用 iTextSharp 在 PDF 文件的签名外观中显示数字签名值

How to show digital signature VALUE in signature appearance of PDF file with iTextSharp

是否可以在签署文档时在签名外观中附加数字签名 VALUE,因为我正在使用这部分代码

PdfFilename = txtFile.Text + "\" + (string)chkLista.Items[i];
DestPdfFilename = txtFile.Text + "\" + (string)chkLista.Items[i] + "-signed.pdf";

Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData) };
IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-256");
PdfReader pdfReader = new PdfReader(PdfFilename);
FileStream signedPdf = new FileStream(DestPdfFilename, FileMode.Create);  //the output pdf file
PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '[=10=]');
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
signatureAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(436, 700, 564, 750), 1, "sig");

MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);

但在 PDF 中,它仅显示矩形,其中仅填充了以下数据:数字签名者:...和日期:...

除此之外我也想在Base64中显示数字签名值!

如果我正确理解了 OP,任务是将实际签名值字节的 base64 表示显示为签名字段外观。

这是不可能的。

原因是签名字段的出现是签名字节范围的一部分:

(外观在示例的第一或第三部分的某处定义。)

因此,在创建签名值之前必须知道外观。因此,该值不能完全在字段中表示外观.

有关更多背景,请阅读 this answer

话虽如此,您可能会尝试通过向 PDF 添加 JavaScript 来作弊,这会在 显示时间 更改签名字段的外观。不过,这种方法有两个缺点:

  • 并非所有 PDF 查看器都支持 JavaScript。
  • Adobe Reader 和 Acrobat,主要的 PDF 查看器也支持 JavaScript,会识别出这种外观变化并指示签名已损坏。