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() Результатом метода является словарь, который содержит записи словаря полей и словаря аннотаций виджета.

Извините, если все это звучит путаницей. Я пытался сделать все возможное, чтобы объяснить это как можно проще. Пожалуйста, прокомментируйте, если что-то не совсем понятно.

Другие вопросы по тегам