PDFtk выдает исключение Java при попытке использовать функцию fill_form

У меня есть приложение PHP, которое заполняет форму из вызова базы данных. В настоящее время я собираю это вместе с помощью PDFtk, я могу без проблем запускать ряд команд PDFtk, и в настоящее время я работаю над нужной командой в командной строке.

Мой звонок в настоящее время таков:

pdftk /var/www/html/CSR/template/job_card.pdf fill_form /var/www/html/CSR/template/wwwwu7mMH.fdf output /var/www/html/CSR/template/filled4.pdf

Этот точный вызов, запускаемый несколько раз, иногда генерирует эту ошибку:

    Unhandled Java Exception in create_output():
java.lang.ClassCastException: pdftk.com.lowagie.text.pdf.PdfNull cannot be cast to pdftk.com.lowagie.text.pdf.PdfDictionary
   at pdftk.com.lowagie.text.pdf.FdfReader.readFields(pdftk)
   at pdftk.com.lowagie.text.pdf.FdfReader.readPdf(pdftk)
   at pdftk.com.lowagie.text.pdf.PdfReader.<init>(pdftk)
   at pdftk.com.lowagie.text.pdf.PdfReader.<init>(pdftk)
   at pdftk.com.lowagie.text.pdf.FdfReader.<init>(pdftk)

и эта ошибка иногда:

Unhandled Java Exception in create_output():
Unhandled Java Exception in main():
java.lang.NullPointerException
   at gnu.gcj.runtime.NameFinder.lookup(libgcj.so.10)
   at java.lang.Throwable.getStackTrace(libgcj.so.10)
   at java.lang.Throwable.stackTraceString(libgcj.so.10)
   at java.lang.Throwable.printStackTrace(libgcj.so.10)
   at java.lang.Throwable.printStackTrace(libgcj.so.10)

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

Мой вопрос в том, что вызывает эту ошибку и как ее исправить?


person user3192649    schedule 14.04.2016    source источник


Ответы (5)


Я вижу свое имя в StackTrace. Это не совпадение: PdfTk основан на мощной старой версии iText. iText — это библиотека Java PDF, изначально написанная мной, но использованная третьей стороной для создания PdfTk.

Ошибка сообщает вам, что iText анализирует PDF-файл, в котором есть ошибка или непредвиденная функция.

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

Невозможно ответить на ваш вопрос, не видя PDF-файл, который вызывает проблему, но допустим, что ваш PDF-файл содержит запись /AcroForm с массивом /Fields. В этом массиве полей есть ссылка на словарь полей. Предположим, что один из полевых словарей в вашем PDF-файле является не словарем, а пустым объектом PDF. Форма отлично отображается в Adobe Reader, но внутри есть недостаток, препятствующий правильной обработке формы.

В этом случае iText будет перебирать записи в массиве полей, и одна из этих записей вернет не словарь полей, а объект PdfNull. В этом случае вы получите ClassCastException, потому что вы не можете разыграть PdfNull в PdfDictionary.

При этом сказано:

Вы можете попробовать одну вещь: откройте форму в Adobe Acrobat. Сохраните форму в Adobe Acrobat. Есть вероятность, что сохраненная форма больше не имеет проблемы. Adobe Acrobat очень терпим к ошибкам в PDF-файлах. Он пытается исправить столько, сколько может. Затем, когда вы сохраняете форму, ошибка исчезает.

person Bruno Lowagie    schedule 14.04.2016
comment
Привет, Бруно, я очень ценю, что ты нашел время, чтобы дать объяснение. Я рад дать ссылку на PDF, но похоже, что у вас есть очень четкое представление о том, в чем проблема. Форма, которую мне нужно заполнить, не изменится, и у пользователей нет возможности добавлять свои собственные формы, поэтому, возможно, проще создать форму, используя другой метод, чтобы обойти эту проблему? - person user3192649; 14.04.2016
comment
Да. Если бы вы поделились формой, первое, что я бы попробовал, это открыть форму в Adobe Acrobat. Сохраните форму в Adobe Acrobat. Есть вероятность, что сохраненная форма больше не имеет проблемы. Adobe Acrobat очень терпим к ошибкам в PDF-файлах. Он пытается исправить столько, сколько может. Затем, когда вы сохраняете форму, ошибка исчезает. - person Bruno Lowagie; 14.04.2016
comment
Разобрался, проблема не была связана с самим PDF, опубликую как ответ. - person user3192649; 14.04.2016

Как оказалось, проблема заключалась не в том, что предложил Бруно Лоуаги в отношении согласованности PDF.

У меня закончились идеи, и я просто подумал, что попробую сгенерировать FDF другим способом. Выполнив команду:

pdftk /full/path/to/template.pdf generate_fdf output /full/path/to/output.fdf

И затем, проверив полученный файл, я смог получить более точный FDF, а затем, когда я запустил команду fill_form:

pdftk /full/path/to/template.pdf fill_form /full/path/to/output.fdf output /full/path/to/output.pdf

Получил адекватный ответ и все заработало. Таким образом, проблема, с которой я столкнулся, на самом деле была вызвана тем, что FDF каким-то образом искажен.

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

Большое спасибо Bruno Lowagie за то, что он помог лучше понять систему и исключить несколько вещей.

person user3192649    schedule 14.04.2016
comment
Спасибо, это полезно, @ user3192649. Однако могу ли я проверить, разрешено ли файлу FDF иметь НЕКОТОРЫЕ поля, которые я хотел бы заменить в PDF, или он должен включать все поля, которые ожидает PDF? - person Khom Nazid; 02.06.2018
comment
У меня также был искаженный файл FDF после выполнения этого руководства по sitepoint с какой-то плохой код. Просмотр вашей функции FDF показал мне, где код точки сайта был неправильным. - person I wrestled a bear once.; 22.01.2021

Похоже, PDF TK не смог обработать укусы с символами ( и ). Я заменил их на \) и \(, чтобы избежать их, и это сработало хорошо.

person Guest    schedule 18.07.2017
comment
Спасибо! У меня была такая же проблема, это решило это! - person Imbue; 25.06.2018

Проблема со шрифтом: https://stackoverflow.com/a/44442957/2150220

Ссылка выше — лучшее решение, чем просто изменение шрифта.

Я получал ту же ошибку, однако ни одно из вышеперечисленных решений не помогло мне.

Во время тестирования: pdftk a.pdf fill_form a.fdf output b.pdf я смог создать PDF-файл, если мой исходный PDF-файл не был изменен, IE: все настройки Acrobat по умолчанию.

Только когда я изменил шрифт на «Arial» для элемента fill_form, я получил сообщение об ошибке. Я изменил шрифт, и он снова заработал.

person mbunch    schedule 31.08.2018

У меня такая же проблема. В моем случае изменение кодировки строки решило это. Раньше кодировал в utf-8, потом поменял на utf_16_be. Основная причина заключается в том, что данные полей формы хранятся в форме fdf, где значения хранятся внутри скобок, поэтому, если ваши данные имеют скобки, возникает ошибка.

person Vaibhav Gupta    schedule 22.02.2019