【问题标题】:getAcroFields() get different fields with same namegetAcroFields() 获取同名的不同字段
【发布时间】:2017-10-27 09:03:06
【问题描述】:

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

这是我当前的代码:

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

fieldsMap 只包含一个值。
有没有办法让不同的acrofields在pdf上具有相同的标签名?

【问题讨论】:

    标签: java pdf hashmap itext acrofields


    【解决方案1】:

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

    您不能拥有具有相同名称的不同字段。字段的名称是唯一的。一个名字对应一个字段。您不能拥有具有不同值的字段(例如,名称为 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() 方法生成一个字典,其中包含字段字典和小部件注释字典的条目。

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

    【讨论】:

    • 非常感谢布鲁诺。我们认为我们可以在不同的标签中使用相同的名称。所以如果我们不能这样做,问题就解决了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2014-01-29
    • 2011-10-13
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多