【问题标题】:XFA values initially invisible when AcroForm values are setXFA 值在设置 AcroForm 值时最初不可见
【发布时间】:2024-01-22 14:46:01
【问题描述】:

我想自动填写双 AcroForm/XFA PDF 表单。我包含了一个 XFA 数据集包,所有值都显示在 Adob​​e Reader 中。我将 AcroForms 条目中的 V= 键设置为新值,所有值都显示在替代 PDF 阅读器中。

但是,当我在 Adob​​e Reader 中打开带有 XFA 和 AcroForm V= 条目的 PDF 时,只有当前选择的文本字段的值可见:

我在PDF specification 中找不到任何提及在存在 AcroForms 和 XFA 时设置的特殊标志。我假设XFAField 键的顺序可能很重要,但事实并非如此。

如何更改 my PDF file 以便在启动时在 Adob​​e Reader 中显示这些值,在仅支持 AcroForms 而不支持 XFA 的 PDF 阅读器中显示?

【问题讨论】:

  • 我在处理您的示例 PDF 时遇到了一些问题。我必须插入 '>' 两次以使 XFA 流有效:“”和“”
  • @rhens 也感谢您的说明!我会调查的。

标签: pdf-form xfa


【解决方案1】:

有2个问题需要回答:

  1. 为什么 Adob​​e Reader 只在字段被选中时才显示字段值?
  2. 如何判断是使用 AcroForm 还是 XFA?

1。显示的字段值

在某些情况下,Adobe Reader/Acrobat 会根据是否选择表单域以不同方式显示表单域。这对于具有定义的外观的字段来说是典型的,这种外观不同于 Reader/Acrobat 根据其值(可能还有一些外观设置)呈现字段的方式。

当未选择该字段时,将显示定义的外观。选择该字段后,将显示 Reader/Acrobat 如何呈现它的预览。

一些背景:

表单字段由称为字段字典的逻辑部分(字段名称、字段值...)和称为小部件注释的可视化部分组成>。小部件注释可以选择包含一个 AP 条目,其中包含定义其可视化的外观流。参照。 PDF 规范,1.7,表 8.15:

AP - 字典 - 外观字典,指定注释在页面上的视觉呈现方式。

在示例 PDF 中没有 AP 条目,即空白可视化。这是所有字段显示的内容。选择字段时,您会看到基于字段值的 Reader/Acrobat 预览。

您可以通过使用 Reader/Acrobat 手动更改字段值来验证这一点。在这种情况下,将生成并保存新外观。该字段现在将以相同的方式显示,无论它是否被选中。

在 Reader/Acrobat 中防止出现这些“空白”字段的两个选项:

  • 为所有表单域生成外观流。我已经为一个字段完成了此操作(只需使用 iText 重新设置其值,它会自动生成外观流)。

    结果:

    内部PDF结构:

  • AcroForm 字典中的 NeedAppearances 条目设置为 true。参照。 PDF 规范,1.7,表 8.67:

    NeedAppearances - boolean - 一个标志,指定是否为文档中的所有小部件注释构造外观流和外观字典

    这将触发查看器生成所有外观:

2。 AcroForm 还是 XFA?

通常,支持 XFA 的查看器将显示 XFA 表单。不支持 XFA 的查看器将使用 AcroForm。您可以通过为相应的 AcroForm 和 XFA 字段设置不同的值来验证这一点。这是结果,左侧是 Chrome 的内置 PDF 查看器(不支持 XFA),右侧是 Acrobat:

知道 Reader/Acrobat 正在使用 XFA 表单,为什么我们仍然看到空白字段(参见问题 1)?

看起来,当一个 XFA 字段的值与其对应的 AcroForm 字段的值相同时,Reader/Acrobat 也使用了来自 AcroForm 的一些信息,a.o.其外观信息。当 XFA 值与 AcroForm 值不同时,AcroForm 字段似乎被完全忽略了。

TL;DR 将 NeedAppearances 设置为 true 以解决空白字段。不支持 XFA 的查看器将自动退回到 AcroForm。

(我的测试基于 Adob​​e Acrobat X。)

【讨论】:

  • 哇,非常感谢您的出色回答!我会尽快将赏金奖励给你。