【发布时间】:2019-07-30 14:03:17
【问题描述】:
我正在使用 iText 7 签署 pdf 文档。 这没有问题,并且签名显示为有效。
除了数字签名之外,我还想在 pdf 上显示视觉表示。这在数字签名书第 2.4 章创建不同的签名外观中进行了描述。
如果我使用 adobe reader 打开它,生成的 pdf 会显示这种外观。
第一张图片是使用 word 和 另存为 pdf 功能创建的 pdf。 第二张图片是我刚刚随机下载的演示 pdf。
如果我在 chrome 中打开第一个 pdf,则不会显示签名外观文本,但如果我打开最初使用 word 创建的 pdf,则缺少签名外观。
关于没有在 chrome 中显示签名外观的 pdf 有什么问题的任何想法?
编辑:文档链接
- 以 chrome 显示签名的 PDF
- 在 chrome 中不显示签名的 Pdf
编辑 2:代码示例
以下代码示例将使用本地证书对 pdf 文档进行签名,并将一些文本放入未在 chrome 中显示的 SignatureAppearance。
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Signatures;
using System.IO;
using System.Security.Cryptography.X509Certificates;
namespace PdfSigning.Lib.Helpers
{
public class SignPdfTest
{
public static byte[] SingPdfUsingCertificate(X509Certificate2 cert2, byte[] pdfToSign)
{
var apk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(cert2.PrivateKey).Private;
IExternalSignature pks = new PrivateKeySignature(apk, DigestAlgorithms.SHA512);
var cp = new Org.BouncyCastle.X509.X509CertificateParser();
var chain = new[] { cp.ReadCertificate(cert2.RawData) };
using (PdfReader reader = new PdfReader(new MemoryStream(pdfToSign)))
{
using (MemoryStream fout = new MemoryStream())
{
StampingProperties sp = new StampingProperties();
sp.UseAppendMode();
PdfSigner signer = new PdfSigner(reader, fout, sp);
PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
appearance.SetPageNumber(1);
appearance.SetLayer2Text("Hello world");
appearance.SetLayer2FontSize(8);
Rectangle pr = new Rectangle(10, 10, 200, 100);
appearance.SetPageRect(pr);
appearance.SetRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);
appearance.SetPageRect(pr);
signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
return fout.ToArray();
}
}
}
}
}
private static void SignDocumentUsingCertificateConfiguration()
{
try
{
var certificateSignatureConfiguration = new CertificateSignatureConfiguration();
var cert2 = new X509Certificate2(@"C:\temp\MyCertificate.pfx", "mypassword", X509KeyStorageFlags.Exportable);
CertificatePdfSigner certPdfSigner = new CertificatePdfSigner(certificateSignatureConfiguration);
byte[] signedPdf = PdfSigning.Lib.Helpers.SignPdfTest.SingPdfUsingCertificate(cert2, File.ReadAllBytes(@"C:\temp\WordSaveAsPdf.pdf"));
File.WriteAllBytes(@"C:\temp\WordSaveAsPdf_Signed.pdf", signedPdf);
Console.WriteLine("Done");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
【问题讨论】: