Muddassir Awan
Muddassir Awan

Reputation: 89

Getting issue on adding multiple signature fields in the PDF

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

Answers (1)

mkl
mkl

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

Related Questions