我已经获取了文档哈希,并从签名服务器获取了签名,该服务器向我返回了CMS签名。 以下是代码段:
Stream resultStream = new MemoryStream();
Stream readerStream = new MemoryStream(documentBytes);
PdfReader pdfReader = new PdfReader(readerStream);
byte[] signedDocument;
PdfSigner pdfSigner = new PdfSigner(pdfReader, resultStream, new StampingProperties().UseAppendMode());
PdfAcroForm acroForm = PdfAcroForm.GetAcroForm(pdfSigner.GetDocument(), true);
PdfSignatureFormField signatureFormField = (PdfSignatureFormField)acroForm.GetField("Signature1");
var signatureRects = signatureFormField.GetPdfObject().GetAsRectangle(PdfName.Rect);
pdfSigner.SetFieldName("Signature1");
ImageData imageData = ImageDataFactory.Create(handSignatureBytes);
PdfSignatureAppearance sigAppearance = pdfSigner.GetSignatureAppearance();
sigAppearance.SetContact("ContactInfo");
sigAppearance.SetLocation("Location");
sigAppearance.SetPageNumber(1);
sigAppearance.SetReason("SigningReason");
sigAppearance.SetSignatureGraphic(imageData);
sigAppearance.SetSignatureCreator("Malik");
sigAppearance.SetPageRect(signatureRects);
sigAppearance.SetReuseAppearance(false);
pdfSigner.SetSignDate(signingTime);
pdfSigner.GetDocument().GetCatalog().SetModified();
int estimatedSize = 12480;
IExternalSignatureContainer signatureContainer = new ExternalContainer(document_id);
pdfSigner.SignExternalContainer(signatureContainer, estimatedSize);
signedDocument = ((MemoryStream)resultStream).ToArray();
签名容器实现:
public string documentId;
public ExternalContainer(string docId)
{
documentId = docId;
}
public void ModifySigningDictionary(PdfDictionary signDic)
{
signDic.Put(PdfName.Filter, PdfName.Adobe_PPKLite);
signDic.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
}
public byte[] Sign(Stream data)
{
//Send HTTP call to signing server and get CMS signature base64
byte[] signedData = Convert.FromBase64String(result[0]);
return signedData;
}
从IExternalSignatureContainer实现中获取签名文档后,Adobe说: 签名无效 应用签名以来,文档已被更改或损坏