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-файлы и успешно выполнять фиксированные команды.

У меня вопрос, что является причиной этой ошибки и как ее исправить?

4

Решение

Я вижу свое имя в 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,

Это как говорится:

  • Если я вижу мое имя в вашей трассировке стека, это вызывает тревогу, потому что это означает, что вы используете версию iText, предшествующую iText 5. Такая версия больше не должна использоваться. Вы должны использовать более свежую версию iText. Существует высокая вероятность того, что более поздняя версия iText даст вам либо лучшее сообщение об ошибке, либо допустит (и, возможно, даже исправит) ошибку в PDF.
  • Если вы найдете версию PdfTk, которая использует более новую версию iText, меня это удивит, потому что, насколько мне известно, PdfTk недоступен в рамках AGPL, а также PDF Labs (владелец PdfTk) не является клиентом iText. Программного обеспечения.
  • Если вы хотите продолжать использовать PdfTk, вам не следует ожидать ответа, если вы не передаете документ PDF, который пытаетесь заполнить.

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

7

Другие решения

Как выясняется, проблема была не в том, что Бруно Лоуаги предложил в отношении согласованности 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 за помощь в понимании системы и исключении некоторых вещей.

6

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

3

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

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

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

Как я тестировал:
pdftk a.pdf fill_form a.fdf output b.pdf

Я смог создать PDF, если мой исходный PDF не был изменен, IE: все настройки акробата, где по умолчанию.

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

0
По вопросам рекламы [email protected]