使用 itextsharp 在签名字典中自定义数据

Custom data in signature dictionary using itextsharp

我正在尝试将自定义数据添加到签名字段(最后这可以是从生物识别到信息的任何内容)。

PdfFormField signatureField = stamper.AddSignature(
    signingBlock.Name, signingBlock.Page,
    signingBlock.X, signingBlock.Y, signingBlock.X + signingBlock.Width,
    signingBlock.Y + signingBlock.Height);
signatureField.Put(new PdfName("SomeRandomKey"), new PdfString("Some random text goes here"));

但是自从玩了这个之后,我检查了 PDF 结构并且这些值从未存储在文档中。将自定义数据添加到签名字段的适当方法是什么,它必须特定于签名字段,因为我要处理多个签名,因此我不能使用 /Info 字典。

如有任何帮助,我们将不胜感激。 亲切的问候

stamper.AddSignature 是一种方便的方法

  • 创建一个新的 PDF 表单域,
  • 根据参数设置签名参数,
  • 创建外观,
  • 从交互式表单和页面注释词典中引用此表单字段,并且
  • 将表单域 PDF 对象写入输出 stream/file!

因此,您添加到从该方法检索的对象中的信息添加得太晚了。

方法是这样实现的:

virtual public PdfFormField AddSignature(String name, int page, float llx, float lly, float urx, float ury) {
    PdfAcroForm acroForm = stamper.AcroForm;
    PdfFormField signature = PdfFormField.CreateSignature(stamper);
    acroForm.SetSignatureParams(signature, name, llx, lly, urx, ury);
    acroForm.DrawSignatureAppearences(signature, llx, lly, urx, ury);
    AddAnnotation(signature, page);
    return signature;
} 

AddAnnotation 调用隐式地将表单字段对象写入 stream/file。

因此,与其像您那样调用它,不如这样做:

PdfAcroForm acroForm = stamper.Writer.AcroForm;
PdfFormField signature = PdfFormField.CreateSignature(stamper.Writer);
acroForm.SetSignatureParams(signature, signingBlock.Name, signingBlock.X, signingBlock.Y, signingBlock.X + signingBlock.Width, signingBlock.Y + signingBlock.Height);
acroForm.DrawSignatureAppearences(signature, signingBlock.X, signingBlock.Y, signingBlock.X + signingBlock.Width, signingBlock.Y + signingBlock.Height);

signature.Put(new PdfName("SomeRandomKey"), new PdfString("Some random text goes here"));

stamper.AddAnnotation(signature, signingBlock.Page);