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

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

这是我目前的代码:

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

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

回答(1)

2 years ago

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

您可以't have different fields with the same name. The name of a field is unique. One name corresponds with exactly one field. You can' t有一个具有不同值的字段(例如,名称为 fieldname ) .

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

如果这听起来很混乱,我很抱歉,但这就是它在PDF标准中指定的方式 .

现在问你的问题:你为什么问?

If you want to get the position of the widget annotations of a specific field, 您可以使用索引来询问这些规范 .

例如,此代码将为您提供索引为 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

If you want to get properties of a field, 您可以使用 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?

If you're asking for a different reason, 请澄清 .

Extra info:

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

如果字段仅对应于一个窗口小部件字典,则两个不同字典的所有条目通常被捆绑到同一个字典中 .

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

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