getAcroFields() получает разные поля с одинаковыми именами
Я работаю с iText в среде Java и хочу восстановить различные поля с одним и тем же именем тега в PDF.
Это мой текущий код:
PdfStamper stamper = new PdfStamper(reader, output);
AcroFields fields = stamper.getAcroFields();
HashMap fieldsMap = fields.getFields();
fieldsMap
просто содержат одно значение.
Есть ли решение использовать разные поля с одинаковым именем тега в PDF?
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;
См. Поиск абсолютного положения и размера поля с помощью 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();
См. Как получить свойства AcroField с помощью iText?
Если вы спрашиваете по другой причине, пожалуйста , уточните.
Дополнительная информация:
Понятие поля и понятие аннотации виджета различны. Поле описывается в словаре полей. Аннотация виджета описана в словаре аннотаций. Один словарь полей (описывающий определенное поле в форме) соответствует одному или нескольким словарям виджетов (описывающим, как поле отображается один или несколько раз).
Если поле соответствует только одному словарю виджетов, все записи обоих разных словарей часто объединяются в один и тот же словарь.
getMerged()
Результатом метода является словарь, который содержит записи словаря полей и словаря аннотаций виджета.
Извините, если все это звучит путаницей. Я пытался сделать все возможное, чтобы объяснить это как можно проще. Пожалуйста, прокомментируйте, если что-то не совсем понятно.