扁平化表单字段后隐藏在 PDF 戳记后面的文本内容 - iTextSharp,Adobe

Text content hidden behind PDF stamp after flattening form fields - iTextSharp, Adobe

如果我不展平表单域,内容会按预期显示在图章上。当我展平时,内容隐藏在邮票后面。如果我将 PDF 加载到 Adob​​e 中,我可以移动图章并查看其背后的内容。

PDF 模板是在 Adob​​e Acrobat Reader DC 中创建的(版本详细信息见底部)。我使用 iTextSharp 和 return PDF 字节用条件数据填充文档字段。

PDF Stamp, before move

PDF Stamp, after move

// flatten fields
pdfStamper.FormFlattening = true;
// stamping
var fields = stamper.AcroFields;

stamper.AcroFields.SetFieldProperty(fieldName, "textsize", fontSize, null);
fields.SetField(fieldName, value);
fields.SetFieldProperty(fieldName.ToString(),
    "setfflags",
    PdfFormField.FF_READ_ONLY,
    null); 

iTextSharp 5.5.12

Adobe Acrobat Reader DC 20.6.20042.371103

为什么会这样

当显示PDF页面时,首先绘制其静态内容,然后在该静态内容上绘制各种注释。注释按照它们在页面的注释数组中出现的顺序绘制。

因此,

If I don't flatten the form fields, the content appears over the stamp as expected.

显然你在这里指的是表单字段的内容,而不是静态页面内容。那么这就意味着 stamp 注释出现在表单字段小部件注释之前的注释数组中。

When I do flatten, the content is hidden behind the stamp.

因为你只展平了字段

// flatten fields
pdfStamper.FormFlattening = true;

这很自然:扁平化字段意味着将它们的内容添加到静态页面内容中,并从表单中删除字段,并从注释中删除字段小部件。因此,之前的字段内容现在是静态页面内容的一部分,因此绘制在任何剩余注释之前,特别是在标记之前。

做什么

如果您希望字段内容显示在图章上,您有两个选择:

  • 不要展平表单域 - 如果您不展平表单域,它们的内容将保留在注释中,这是由于表单域中的顺序注释数组绘制在图章上

    要获得某种类似于扁平化的效果,您可以将表单字段设置为 只读(就像您已经做的那样)及其小部件注释 锁定.

  • 先展平图章 - 如果先展平非字段注释,它们的内容会先添加到静态页面内容中。因此,如果您此后将字段展平,字段内容将显示在图章内容之上。

    iText 还有一个 属性 要求展平非字段注释:

    pdfStamper.AnnotationFlattening = true;
    

    不幸的是,它没有内置功能来简单地按照它们在页面上出现的顺序一次性平展所有注释(表单字段小部件和其他注释)。即使您将 FormFlatteningAnnotationFlattening 都设置为 true,表单字段小部件也会在其他注释之前展平。

    因此,您必须对 PDF 进行两次标记:在第一个标记步骤中,您仅将 AnnotationFlattening 设置为 true,而在第二个标记步骤中,您将 FormFlattening 设置为true.