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

getAcroFields() get different fields with same name

我在 Java 环境中使用 iText,我想在 pdf 上恢复具有相同标签名称的不同 acrofields。

这是我当前的代码:

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

fieldsMap 只包含一个值。
是否有解决方案可以让不同的 acrofields 在 pdf 上具有相同的标签名称?

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

不能有同名的不同字段。字段名称是唯一的。一个名称恰好对应一个字段。您不能拥有具有不同值的字段(例如名称 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?

如果您要求其他原因,请说明。

额外信息:

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

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

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

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