我们使用 Adobe Acrobat 将字段添加到 PDF。我们希望能够访问这些字段并引用它们的确切位置,以便在从 DocuSign 取回 PDF 后,我们可以在它们的位置标记内容。我们通过使用 C# ITextSharp Text PDF 库操作 PDF 的字节来做到这一点。不幸的是,一旦返回 PDF,在 Adobe Acrobat 中打开它就会发现所有字段都已从我们的文档中删除。
我们的 C# 使用数据库中的文本数据填充这些字段中的大部分。2 个字段留空,因为我们想在文档通过 DocuSign 签名后使用 C# 将某人签名的静态图像叠加在他们的位置上。
这对于在 DocuSign 获取我们的文档之前填充的内容是可以的,因为删除该字段不会在视觉上忽略以前输入到这些字段中的数据。当我们需要将静态签名图像标记到文档中时,这并不好。我们对 ITextSharp 的使用依赖于查找具有特定 Adobe Acrobat ID 的字段,获取其位置,并在该位置“标记”静态图像。
有没有办法告诉 DocuSign 我们要维护所有 PDF 字段、它们的位置和 ID?
public byte[] StampStaticSignature(byte[] documentBytes)
{
var signatureContainer = new SignatureContainer();
var signatureBytes = signatureContainer.GetSignatureBytes();
var reader = new PdfReader(documentBytes);
var updatedForm = new byte[] { };
using var stream = new MemoryStream();
var stamper = new PdfStamper(reader, stream);
var pdfFormFields = stamper.AcroFields;
var signatureImage = GetImageFromStream(signatureBytes);
//_adobeSignatureFields is a list of strings used to
//identify the signature fields by their ID set in Adobe Acrobat.
foreach (var signatureField in _adobeSignatureFields)
{
var sigPosition = pdfFormFields.GetFieldPositions(signatureField);
var page = sigPosition[0];
var x1 = sigPosition[1];
var y1 = sigPosition[2];
var x2 = sigPosition[3];
var y2 = sigPosition[4];
var contentBytes = stamper.GetOverContent((int)page);
var signatureFieldHeight = y2 - y1;
var signatureFieldWidth = x2 - x1;
signatureImage.ScaleToFit(signatureFieldWidth, signatureFieldHeight);
signatureImage.SetAbsolutePosition(x1, y1);
contentBytes.AddImage(signatureImage);
}
stamper.FormFlattening = false;
stamper.Close();
reader.Close();
updatedForm = stream.ToArray();
stream.Dispose();
return updatedForm;
}