【问题标题】:Text content hidden behind PDF stamp after flattening form fields - iTextSharp, Adobe展平表单字段后隐藏在 PDF 戳后面的文本内容 - iTextSharp,Adobe
【发布时间】:2021-10-29 13:39:19
【问题描述】:

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

PDF 模板是在 Adob​​e Acrobat Reader DC 中创建的(有关版本详细信息,请参见底部)。我使用 iTextSharp 用条件数据填写文档字段并返回 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

【问题讨论】:

  • 嗨,史蒂夫。请看这篇文章,看看如何改进你的答案stackoverflow.com/help/how-to-answer你的问题有点不清楚。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 测试计数器

标签: c# pdf itext adobe


【解决方案1】:

为什么会这样

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

因此,

如果我不展平表单域,内容会按预期显示在图章上。

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

当我进行展平时,内容隐藏在图章后面。

因为您只展平字段

// flatten fields
pdfStamper.FormFlattening = true;

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

做什么

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

  • 不要展平表单域 - 如果你不展平表单域,它们的内容会保留在注解中,由于注解数组中的顺序被绘制在图章上

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

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

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

    pdfStamper.AnnotationFlattening = true;
    

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

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

【讨论】:

  • 很好的答案,谢谢。我很惊讶我之前没有遇到过注释扁平化。
  • 太棒了!如果答案适当地解决了您的问题,请考虑通过单击左上角的复选标记将其标记为已接受,请参阅here
  • 获取“未找到 PDF startxref”异常。很抱歉问你这个问题,但是如果我把我的代码放到另一个问题中,你会看看它并告诉我我做错了什么吗? @mkl
  • @steve 也请在您的问题中分享一个示例结果 pdf。对损坏结果的分析通常会更快地指出问题所在。
  • 我想通了。只需要正确解决pdfReader和stamper,这是我犯的愚蠢错误。再次感谢你的帮助! @mkl
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2020-11-02
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多