- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Java 环境中使用 iText,并且我想在 pdf 上恢复具有相同标记名称的不同 acrofield。
这是我当前的代码:
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?
如果您询问其他原因,请说明。
额外信息:
字段的概念和小部件注释的概念是不同的。字段在字段字典中描述。小部件注释在注释字典中描述。一个字段字典(描述表单中的特定字段)对应于一个或多个小部件字典(描述如何呈现该字段一次或多次)。
如果一个字段仅对应于一个小部件字典,则两个不同字典的所有条目通常会捆绑到同一个字典中。
getMerged()
方法生成一个字典,其中包含字段字典和小部件注释字典的条目。
如果这一切听起来很困惑,我很抱歉。我已尽力尽可能简单地解释这一点。如果有不完全清楚的地方请评论。
关于java - getAcroFields() 获取同名的不同字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46971297/
我正在 Java 环境中使用 iText,并且我想在 pdf 上恢复具有相同标记名称的不同 acrofield。 这是我当前的代码: PdfStamper stamper = new PdfStamp
我是一名优秀的程序员,十分优秀!