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

时间:2015-04-27 10:50:23

标签: c# itextsharp digital-signature

签名文档时是否可以在签名外观中附加数字签名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, '\0');
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中显示数字签名值!

1 个答案:

答案 0 :(得分:1)

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

这是不可能的。

原因是签名字段的外观是签名字节范围的一部分:

The structure of an example signed PDF

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

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

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

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

  • 并非所有PDF查看器都支持JavaScript。
  • Adob​​e Reader和Acrobat,也是支持JavaScript的主要PDF查看器,会识别出外观的这种变化,并表明签名已被破坏。