如何使用 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,会识别出这种外观变化并指示签名已损坏。
是否可以在签署文档时在签名外观中附加数字签名 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,会识别出这种外观变化并指示签名已损坏。