如何使用itext从文本文件中的数据填充(动态XFA)PDF

时间:2015-10-12 19:28:03

标签: xml forms pdf itext xfa

我有一个本地PDF表单,其中包含一个永不改变的特定模板。我已经将表单标识为XFA(xml)动态表单,因为没有返回任何键集。 我正在尝试使用itext来填充包含在.txt文件中的数据的表单。根据我的理解,我需要以某种方式从文本文件中获取数据并将其正确放入.xml文件中。 file,以便itext可以使用给定的xml来操作原始PDF。

表单以下列布局为例:

Example

我在Eclipse中使用的示例代码成功编译/运行,但它需要文件170中的数据,以便用字段数据填充空表单并输出填充版本。问题是,对于我的实际项目,我没有要使用的data.xml文件来正确填充表单。原始字段数据位于.txt文件中,每行包含PDF中不同字段的数据。

示例:引用上面的图片,我的.txt文件对于包含标有“四个”字段的字段如下所示:

  • 约翰
  • 15
  • 黑色
  • 本田
  • 丰田
  • 福特
  • BMW

我对两件事感到困惑:

1。如何提取原始PDF的xml结构,以便我知道     使用.txt文件中的数据填充时要遵循的格式吗?

2. 如何从文本文件中获取值并将其正确插入.xml结构?

以下代码有效,但需要data.xml才能填写“incomplete.pdf”。它使用代码data.xml来输入数据,但我仍然坚持如何识别“XML”的结构以及如何填充它。

非常感谢任何帮助,非常感谢。

代码:

xfa.fillXfaForm(new FileInputStream(XML));

1 个答案:

答案 0 :(得分:0)

在XFA中,表单字段和表单数据之间的链接使用称为数据绑定的概念。 Fields可以具有类似XPath的表达式,以从XML数据结构中选择它们的值。这意味着需要对XML数据进行适当的结构化以适用于特定的XFA表单,但这种结构不一定是唯一的。

一个简单的例子: 假设您有一个只有1个文本字段的XFA表单。此文本字段具有绑定到任何具有标记名称“名称”的XML元素的数据。在这种情况下,data.xml可以简单地为:

<Name>Hurmle</Name>

但是,这个以及无数种不同的XML结构也可以起作用:

<StackOverflow>
    <accounts>
        <account>
            <Name>Hurmle</Name>
        </account>
    </accounts>
</StackOverflow>

代码示例中的readXfa方法将用于从XFA表单中提取完整的XML流。它由不同的部分组成。最相关的是:

  • template :描述逻辑表单结构,包括所有字段及其数据绑定。
  • xfa:datasets :保存有关数据的信息。由2部分组成。
    • dataDescription :表单数据的架构,可选。数据描述语法在XFA规范中定义。
    • xfa:data :表单数据。

确定哪种XML结构可行的一种方法是查看所有字段的数据绑定(cf template )。因此,您将知道字段期望获取其数据的位置。对于一个非平凡的形式,这可能是复杂的和/或很多工作。

如果在XFA表单中可用,您可以使用 dataDescription 。它将为您提供数据和信息的结构,例如元素的最小和最大出现次数。

最后,您可以查看表单中已有的数据(参见 xfa:data )。请记住,此XML结构不一定完整:可以省略空元素。例如,如果表单有2个字段,则可以将值指定为:

<SomeRoot>
    <Field1>Value1</Field1>
    <Field2></Field2>
</SomeRoot>

但是:

<SomeRoot>
    <Field1>Value1</Field1>
</SomeRoot>

第一种情况将更容易找出所需的结构。 如果 xfa:data 缺失或不完整,您可以尝试使用支持XFA的PDF查看器手动填写所有表单字段。保存时,查看器将根据数据描述和数据绑定填充 xfa:data

供参考:XFA specification

相关问题