Apache PDFBox - Невозможно прочитать все поля из PDF

Мы пытаемся читать PDF-файл и динамически подставлять в него значения. На основе входящего запроса мы запускаем некоторые правила и определяем, какой PDF-файл использовать, а затем динамически заполняем его значениями. Мы используем Apache PDFBox версии 2.0.11, и по какой-то причине мы сталкиваемся с проблемами с конкретным шаблоном PDF. Мы не можем прочитать некоторые поля для этого конкретного шаблона, а созданный PDF-файл является неполным. Интересно, связано ли это с самим оригинальным PDF-файлом. Вот фрагмент кода, который мы используем для чтения полей и их заполнения.

PDDocument pdfTemplate = PDDocument.load(inputStream);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();
PDAcroForm  acroForm = docCatalog.getAcroForm();
acroForm.setXFA(null);
COSArrayList<PDField> list = (COSArrayList<PDField>) acroForm.getFields();
for (PDField field : list) {
     field.setReadOnly(true);
      logger.debug("Field name "+field.getFullyQualifiedName())))
      //use logic to populate value by calling field.setValue();
}

Когда мы попытались напечатать имя каждого поля, мы обнаружили, что более 30 процентов полей отсутствуют. Может ли кто-нибудь помочь, как это исправить? PDF-файл из 15 страниц с разными вопросами. Если проблема связана с самим исходным PDF-файлом, то в чем может быть причина, по которой нельзя прочитать некоторые поля?

Пожалуйста, прочтите javadoc getFields() и обновите код. Если это не помогает, поделитесь PDF-файлом и укажите одно поле, которое игнорируется.

Tilman Hausherr 10.08.2018 03:54

Привет, Тилам, Спасибо за ответ. Я дважды проверил java-документ и попытался получить детей, но это не помогло. К сожалению, я не смог прикрепить PDF-файл куда-либо, так как это может нарушать политику компании. Вы что-нибудь порекомендуете мне проверить?

Mr9 11.08.2018 01:14

Одна из возможностей состоит в том, что PDF-файл содержит только аннотации виджетов (которые связаны со страницами), а не поля (которые связаны с документом, каждое поле может иметь виджеты от 1 до n). Откройте файл с помощью PDFBox PDFDebugger. На странице переместите указатель мыши в область поля. Отображается ли имя поля в строке состояния? Еще одна идея: в меню нажмите «Просмотр», «Показать внутреннюю структуру», затем в дереве перейдите в Root / AcroForm / Fields. Затем посмотрите на всю структуру и попробуйте найти свое поле. Вы его нашли?

Tilman Hausherr 11.08.2018 10:27

Привет, Тилман, я попробовал то, что вы предложили, и я не вижу полей в разделе Root / AcroForm / Fields. В чем может быть причина того, что там нет полей? Нужно ли исправлять сам PDF?

Mr9 13.08.2018 17:04

Может, это формы XFA. Pdfbox с этим не справится. Но вы написали, что у вас есть некоторые поля, тогда вы должны их увидеть

Tilman Hausherr 13.08.2018 18:08

Всего полей должно быть около 350, но отображаются только 130 полей. Мы проверяем, можем ли мы снова воссоздать PDF. Интересно, PDF-файл может быть поврежден.

Mr9 13.08.2018 19:32

Пожалуйста, попробуйте также другое, что я упомянул, то есть при отображении страницы PDFDebugger переместите мышь туда, где находится поле, и посмотрите имя. Сделайте то же самое с полем, которое, как вы знаете, обрабатывается правильно. Если вы не видите имя, значит, вы используете старую версию PDFDebugger.

Tilman Hausherr 13.08.2018 19:35

Я попробовал, как вы предложили, и поле, в котором есть проблемы, не отображается в строке состояния ниже и отображается нормально для других. Я использую 2.0.11 PDFDebugger

Mr9 13.08.2018 20:29

В этом случае в Root/AcroForm/Fields должно быть что-то (огромное дерево, которое можно расширить). Потому что это путь, по которому PDFDebugger собирает все доступные поля, а затем виджеты для создания эффекта строки состояния.

Tilman Hausherr 13.08.2018 20:36

Наша бизнес-операция снова восстановила PDF-файл, и теперь мы можем получить все поля. Спасибо за помощь.

Mr9 15.08.2018 19:16

Рад это слышать. Предлагаю либо удалить вопрос, либо ответить на него самостоятельно.

Tilman Hausherr 15.08.2018 19:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
1 030
2

Ответы 2

У вас, вероятно, есть иерархические поля в этой форме. Вместо этого попробуйте что-то вроде приведенного ниже кода ...

PDDocument pdfTemplate = PDDocument.load(inputStream);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();    
PDAcroForm  acroForm = docCatalog.getAcroForm();
PDFieldTree fieldTree = acroForm.getFieldTree();
Iterator<PDField> fieldTreeIterator = fieldTree.iterator();
while (fieldTreeIterator.hasNext()) {
    PDField field = fieldTreeIterator.next();
    if (field instanceof PDTerminalField) {
        String fullyQualifiedName = field.getFullyQualifiedName();
        logger.debug("Field name "+fullyQualifiedName);
    }
}

PDAcroForm.getFields () получает только корневые поля, а не их дочерние поля. PDAcroForm.getFieldTree () получает все поля, но затем вам нужно проверить, являются ли они терминальными, прежде чем устанавливать значение. Нетерминальные поля не могут иметь значения и не имеют связанных с ними виджетов (представлений на странице). Вы поймете, что это проблема, если в полном имени есть точки. Периоды представляют собой иерархию.

Спасибо joelgeraci за предложение. Использование FieldTree тоже не помогло.

Mr9 10.08.2018 21:27

Можете ли вы опубликовать PDF-файл где-нибудь, чтобы я мог узнать подробности?

joelgeraci 10.08.2018 23:23

joelgeric, К сожалению, я не смог прикрепить PDF куда-либо, так как это может нарушать политику компании. Вы что-нибудь порекомендуете мне проверить?

Mr9 11.08.2018 01:12

Можете ли вы заменить нижележащую страницу пустой и опубликовать PDF-файл только с полями формы?

joelgeraci 11.08.2018 05:41

Проблема была решена после повторного восстановления всего PDF-файла.

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