有关在PDF中添加多个签名字段的问题

问题描述 投票:0回答:1

我正在使用iText7在文档中添加多个签名字段。我的情况如下:

在文档中添加1个签名字段并签名文档。该签名已在Adobe中验证。在同一文档中添加第二签名字段,然后再次对文档签名。在Adobe中打开文档后,将验证最后一个签名,但在已签名的签名字段上显示以下错误:

签名包含不正确,无法识别,损坏或可疑的数据。支持信息:SigDict /目录非法数据

用于将签名字段添加到PDF中的代码段如下:

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;
}
}

有人可以在这个问题上帮助我。

问候

c# pdf itext7
1个回答
1
投票

使用append模式使iText创建增量更新,而不是从头开始创建新文档。即使用

PdfDocument pdfDocument = new PdfDocument(_pdfReader, new PdfWriter(memoryStream), new StampingProperties().UseAppendMode())
© www.soinside.com 2019 - 2024. All rights reserved.