getAcroFields()获取具有相同名称的不同字段

时间:2017-10-27 09:03:07

标签: java pdf hashmap itext acrofields

我正在Java环境中使用iText,我想在pdf上使用相同的标记名恢复不同的acrofield。

这是我目前的代码:

PdfStamper stamper = new PdfStamper(reader, output);
AcroFields fields = stamper.getAcroFields();
HashMap fieldsMap = fields.getFields();

fieldsMap只包含一个值 是否有解决方案在pdf上使用相同的标记名称来创建不同的acrofield?

1 个答案:

答案 0 :(得分:2)

首先让我解释一下,你的问题在技术上是错误的。

您不能使用相同名称的不同字段。字段的名称是唯一的。一个名称恰好对应一个字段。您不能拥有具有不同值的字段(例如,名称为fieldname)。

但是,一个字段可以由不同的窗口小部件注释表示。例如。每个页面上都可以出现一个名为date的字段,以在每个页面的页眉或页脚中显示特定日期。每个小部件循环的内容将是该字段的值。您不能在同一字段中使用不同的内容创建两个不同的窗口小部件注释(尽管显示的内容可能不同)。

对不起,如果这听起来很混乱,那就是它在PDF标准中指定的方式。

现在提出你的问题:你为什么要问?

如果您想获取特定字段的小部件注释的位置,您可以使用索引来询问这些规范。

例如,此代码将为您提供索引为0的字段的页码和坐标:

PdfStamper stamper = new PdfStamper(reader, output);
AcroFields fields = stamper.getAcroFields();
int page = form.getFieldPositions(name).get(0).page;
Rectangle rectangle = form.getFieldPositions(name).get(0).position;

请参阅Find field absolute position and dimension by acrokey

如果您想获取字段的属性,可以使用getMerged()方法。例如,此代码允许您获取包含每个字段的第一个窗口小部件注释属性的字典:

Map<String,AcroFields.Item> fields = form.getFields();
AcroFields.Item item;
PdfDictionary dict;
for (Map.Entry<String,AcroFields.Item> entry : fields.entrySet()) {
    out.write(entry.getKey());
    item = entry.getValue();
    dict = item.getMerged(0);
    // inspect dict
}

请参阅finding out required fields to fill in pdf file

或者,一旦有Item个对象,就可以使用getWidgets()方法获取所有小部件:

dict = item.getWidgets().get(0).getPdfObject();

请参阅How to get AcroField Properties using iText?

如果您要求其他原因,请澄清。

额外信息:

字段的概念和窗口小部件注释的概念是不同的。字段在字段字典中描述。小部件注释在注释字典中描述。一个字段字典(描述表单中的特定字段)对应于一个或多个小部件字典(描述字段如何呈现一次或多次)。

如果某个字段只对应一个窗口小部件字典,则不同字典的所有条目通常都会捆绑到一个字典中。

getMerged()方法生成一个字典,其中包含字段字典和窗口小部件注释字典的条目。

如果所有这些都让人感到困惑,我很抱歉。我尽力解释这个问题尽可能简单。如果某些事情不完全清楚,请发表评论。