Java getAcroFields()获取同名的不同字段

Java getAcroFields()获取同名的不同字段,java,pdf,hashmap,itext,acrofields,Java,Pdf,Hashmap,Itext,Acrofields,我正在Java环境中使用iText,我想恢复pdf上具有相同标记名的不同字段 这是我当前的代码: PdfStamper stamper = new PdfStamper(reader, output); AcroFields fields = stamper.getAcroFields(); HashMap fieldsMap = fields.getFields(); fieldsMap只包含一个值。 是否有一种解决方案可以在pdf上使用相同标记名的不同AcroField?首先让我解释一下,

我正在Java环境中使用iText,我想恢复pdf上具有相同标记名的不同字段

这是我当前的代码:

PdfStamper stamper = new PdfStamper(reader, output);
AcroFields fields = stamper.getAcroFields();
HashMap fieldsMap = fields.getFields();
fieldsMap
只包含一个值。

是否有一种解决方案可以在pdf上使用相同标记名的不同AcroField?

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

不能有同名的不同字段。字段的名称是唯一的。一个名称正好对应一个字段。不能有具有不同值的字段(例如,名称为
fieldname

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

如果这听起来很混乱,我很抱歉,但这是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;

如果要获取字段的属性,可以使用
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
}

如果您询问的原因不同,请澄清

额外信息:

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

如果一个字段只与一个小部件字典对应,那么两个不同字典的所有条目通常会捆绑到同一个字典中

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


如果这一切听起来很混乱,我很抱歉。我已经尽力尽可能简单地解释了这一点。如果有不完全清楚的地方,请发表评论。

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

不能有同名的不同字段。字段的名称是唯一的。一个名称正好对应一个字段。不能有具有不同值的字段(例如,名称为
fieldname

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

如果这听起来很混乱,我很抱歉,但这是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;

如果要获取字段的属性,可以使用
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
}

如果您询问的原因不同,请澄清

额外信息:

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

如果一个字段只与一个小部件字典对应,那么两个不同字典的所有条目通常会捆绑到同一个字典中

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


如果这一切听起来很混乱,我很抱歉。我已经尽力尽可能简单地解释了这一点。如果有不完全清楚的地方,请发表评论。

非常感谢布鲁诺。我们认为我们可以在不同的标签中使用相同的名称。如果我们不能做到这一点,问题就解决了:)非常感谢布鲁诺。我们认为我们可以在不同的标签中使用相同的名称。因此,如果我们不能做到这一点,问题就解决了:)