Reputation: 89
I am adding multiple signature fields in the document using iText7. My scenario is as follows:
Add 1 signature field in the document and sign the document. That signature is verified in the Adobe. Add 2nd signature field in the same document and sign the document again. Upon opening the document in Adobe, the last signature is verified but following error is shown on already signed signature field:
Signature contains incorrect, unrecognized, corrupted or suspicious data. Support Information: SigDict / Contents illegal data
The code snippet for adding signature field into PDF is as follows:
using (Stream memoryStream = new MemoryStream())
using (PdfReader _pdfReader = new PdfReader(new
MemoryStream(_documentBytes)).SetUnethicalReading(true))
using (PdfDocument pdfDocument = new PdfDocument(_pdfReader, new PdfWriter(memoryStream)))
{
PdfAcroForm pdfAcroForm = PdfAcroForm.GetAcroForm(pdfDocument, true);
foreach (PDFSignatureField field in signatureFields)
{
//Initializing signature position object
PDFSignaturePosition SigPosition = field.Position;
for (int i = 0; i < SigPosition.Pages.Length; ++i)
{
//Getting PDF document page
PdfPage page = pdfDocument.GetPage(SigPosition.Pages[i]);
if (page == null)
{
page = pdfDocument.GetPage(SigPosition.PageNumber);
}
//Getting PDF document page rotation
int rotation = page.GetRotation();
//Getting signature field rects according to PDF page
iText.Kernel.Geom.Rectangle rect;
if (rotation > 0 && SigPosition.Position == PDFSignaturePosition.DefaultSignaturePosition.Custom)
{
rect = GetSignaturePositionAccordingToRotation(SigPosition.Rect, page.GetCropBox(), rotation);
}
else
{
rect = GetSignaturePositionRect(SigPosition.Position, SigPosition.Rect, page.GetCropBox());
}
//Creating signature field into PDF page
PdfFormField sig = PdfSignatureFormField.CreateSignature(pdfDocument, rect);
//PdfFormField.CreateSignature(pdfDocument, rect);
//Setting signature field visible flag
if (field.Display == (int)SignatureDisplayType.INVISIBLE)
{
sig.SetFieldFlags(PdfFormField.HIDDEN);
sig.SetVisibility(PdfFormField.HIDDEN);
}
else
{
sig.SetFieldFlags(PdfFormField.VISIBLE);
sig.SetVisibility(PdfFormField.VISIBLE);
}
//Setting signature field name
sig.SetFieldName(i == 0 ? field.Name : field.Name + " - " + SigPosition.Pages[i]);
//Setting signature field page
sig.SetPage(SigPosition.Pages[i]);
//Adding signature field into AcroForm
pdfAcroForm.AddField(sig);
pdfAcroForm.AddFieldAppearanceToPage(sig, page);
pdfAcroForm.SetDefaultAppearance("/Helv 0 Tf 0 g");
//Making indirect reference of the added signature field into PDF
sig.MakeIndirect(pdfDocument);
}
//Closing PDF document object
pdfDocument.Close();
//Getting latest document bytes after adding PDF field
documentBytes = ((MemoryStream)memoryStream).ToArray();
_documentBytes = documentBytes;
}
}
Could anyone help me regarding this issue.
Regards
Upvotes: 0
Views: 1013
Reputation: 95918
Use append
mode to make iText create incremental updates instead of creating a new document from scratch. I.e. use
PdfDocument pdfDocument = new PdfDocument(_pdfReader, new PdfWriter(memoryStream), new StampingProperties().UseAppendMode())
Upvotes: 1