首先让我解释一下,您的问题在技术上是错误的。
您不能拥有具有相同名称的不同字段。字段的名称是唯一的。一个名字对应一个字段。您不能拥有fieldname
具有不同值的字段(例如带有 name )。
但是,一个字段可以由不同的小部件注释表示。例如。每个页面上都可以出现一个名为的字段,以date
在每个页面的页眉或页脚中显示特定日期。每个小部件注释的内容将是该字段的值。同一字段的两个不同的小部件注释不能具有不同的内容(尽管显示的内容可能不同)。
如果这听起来很混乱,我很抱歉,但这是 PDF 标准中指定的方式。
现在你的问题是:你为什么要问?
如果要获取特定字段的小部件注释的位置,可以使用索引请求这些规范。
例如,此代码将为您提供带有 index 的字段的页码和坐标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;
请参阅通过 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
}
请参阅查找填写 pdf 文件的必填字段
或者,一旦你有了一个Item
对象,你就可以获得getWidgets()
获取所有小部件的方法:
dict = item.getWidgets().get(0).getPdfObject();
请参阅如何使用 iText 获取 AcroField 属性?
如果您要求其他原因,请澄清。
额外信息:
字段的概念和小部件注释的概念是不同的。字段在字段字典中进行描述。小部件注释在注释字典中描述。一个字段字典(描述表单中的特定字段)对应于一个或多个小部件字典(描述字段如何呈现一次或多次)。
如果一个字段只对应一个小部件字典,则两个不同字典的所有条目通常都捆绑到同一个字典中。
该getMerged()
方法生成一个字典,其中包含字段字典和小部件注释字典的条目。
如果所有这些听起来很混乱,我很抱歉。我已经尽力尽可能简单地解释这一点。如果有什么不完全清楚的,请发表评论。