I can multiple signing. I would like to lock Pdf file at the last signing.
At "https://www.syncfusion.com/forums/176901/digital-signature-multiple-signatures-then-lock-document-issue-in-signing-and-validation", use "signature.IsLocked = true;". it don't work for me.
This is my Pdf after multiple signing :
PdfLoadedDocument document = new PdfLoadedDocument("source.pdf");
PdfCertificate certificate = new PdfCertificate(@"D:\Certificate.p12", "password@1");
PdfSignature signature = new PdfSignature(document, document.Pages[0], certificate, "DigitalSignature1");
signature.DocumentPermissions = PdfCertificationFlags.AllowComments | PdfCertificationFlags.AllowFormFill
| PdfCertificationFlags.ForbidChanges;
signature.Settings.CryptographicStandard = CryptographicStandard.CADES;
signature.Settings.DigestAlgorithm = DigestAlgorithm.SHA512;
MemoryStream stream = new MemoryStream();
signature.TimeStampServer = new TimeStampServer(new Uri("http://timestamp.testing.com"));
PdfImage image = PdfImage.FromFile(@"D:\signature.png");
if (!signature.TimeStampServer.IsValid)
{ Console.WriteLine("Time Stamp Server's invalided!"); }
else
{
signature.Bounds = new RectangleF(40, 40, 350, 100);
signature.ContactInfo = "[email protected]";
signature.LocationInfo = "Honolulu, Hawaii";
signature.Reason = "I am author of this document.";
PdfStandardFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 15);
signature.Appearance.Normal.Graphics.DrawRectangle(PdfPens.Black, PdfBrushes.White, new System.Drawing.RectangleF(50, 0, 300, 100));
signature.Appearance.Normal.Graphics.DrawImage(image, 0, 0, 100, 100);
signature.Appearance.Normal.Graphics.DrawString("Digitally Signed by Syncfusion", font, PdfBrushes.Black, 120, 17);
signature.Appearance.Normal.Graphics.DrawString("Reason: Testing signature", font, PdfBrushes.Black, 120, 39);
signature.Appearance.Normal.Graphics.DrawString("Location: USA", font, PdfBrushes.Black, 120, 60);
X509Certificate2 x5092 = new X509Certificate2(@"D:\CA.cer");
signature.CreateLongTermValidity(new List<X509Certificate2> { x5092 });
}
document.Save(stream);
document.Close(true);
PdfLoadedDocument document2 = new PdfLoadedDocument(stream);
PdfCertificate certificate2 = new PdfCertificate(@"D:\Certificate2.p12", "password@2");
PdfSignature signature2 = new PdfSignature(document2, document2.Pages[0], certificate2, "DigitalSignature2");
signature2.DocumentPermissions = PdfCertificationFlags.AllowComments | PdfCertificationFlags.AllowFormFill
| PdfCertificationFlags.ForbidChanges;
signature2.Settings.CryptographicStandard = CryptographicStandard.CADES;
signature2.Settings.DigestAlgorithm = DigestAlgorithm.SHA512;
signature2.TimeStampServer = new TimeStampServer(new Uri("http://timestamp.testing.com"));
if (!signature2.TimeStampServer.IsValid)
{ Console.WriteLine("Time Stamp Server's invalided!"); }
else
{
signature2.Bounds = new RectangleF(40, 200, 350, 100);
signature2.ContactInfo = "[email protected]";
signature2.LocationInfo = "Honolulu, Hawaii";
signature2.Reason = "I am author of this document.";
PdfStandardFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 15);
signature2.Appearance.Normal.Graphics.DrawRectangle(PdfPens.Black, PdfBrushes.White, new System.Drawing.RectangleF(50, 0, 300, 100));
signature2.Appearance.Normal.Graphics.DrawImage(image, 0, 0, 100, 100);
signature2.Appearance.Normal.Graphics.DrawString("2Digitally Signed by Syncfusion", font, PdfBrushes.Black, 120, 17);
signature2.Appearance.Normal.Graphics.DrawString("2Reason: Testing signature", font, PdfBrushes.Black, 120, 39);
signature2.Appearance.Normal.Graphics.DrawString("2Location: USA", font, PdfBrushes.Black, 120, 60);
X509Certificate2 x5092 = new X509Certificate2(@"D:\CA.cer");
signature2.CreateLongTermValidity(new List<X509Certificate2> { x5092 });
}
document2.Save("MultipleSignature.pdf");
document2.Close(true);
This is the multiple signed pdf.
Hi achokchai,
Once the signature is locked, the PDF document is not digitally signed. We have created a sample, and we have attached it for your reference. Kindly try this on your end and let us know if you need any further assistance.
Code snippet:
PdfDocument document = new PdfDocument(); PdfPage page = document.Pages.Add(); //Adds certificate to the first signature field FileStream fileStreamcert1 = new FileStream("../../../pdf.pfx", FileMode.Open, FileAccess.Read); PdfCertificate certificate = new PdfCertificate(fileStreamcert1, "password123");
PdfSignature signature = new PdfSignature(document, page, certificate, "Signature"); signature.Bounds = new RectangleF(100, 0, 100, 100);
MemoryStream memoryStream = new MemoryStream(); document.Save(memoryStream); File.WriteAllBytes("SignOutput.pdf", memoryStream.ToArray());
PdfLoadedDocument signedDocument = new PdfLoadedDocument(memoryStream);
PdfLoadedPage page1 = signedDocument.Pages[0] as PdfLoadedPage;
PdfSignature signature2 = new PdfSignature(signedDocument, page1, certificate, "Signature2"); signature2.Bounds = new RectangleF(50, 0, 100, 100); //Saves the PDF document
MemoryStream stream = new MemoryStream();
signedDocument.Save(stream);
File.WriteAllBytes("SignOutput2.pdf", stream.ToArray());
signedDocument.Close(true);
signedDocument = new PdfLoadedDocument(stream);
page1 = signedDocument.Pages[0] as PdfLoadedPage;
signature2 = new PdfSignature(signedDocument, page1, certificate, "Signature3"); signature2.Bounds = new RectangleF(100, 0, 100, 100); signature2.IsLocked = true;
MemoryStream stream2 = new MemoryStream();
signedDocument.Save(stream2);
File.WriteAllBytes("SignOutput3.pdf", stream2.ToArray()); signedDocument.Close(true); // Close the document
document.Close(true); |
Output:
Regards,
Jeyalakshmi T