У меня есть приложение 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-файлы и успешно выполнять фиксированные команды.
У меня вопрос, что является причиной этой ошибки и как ее исправить?
Я вижу свое имя в 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-файлах. Он пытается исправить столько, сколько может. Затем при сохранении формы ошибка исчезла.
Как выясняется, проблема была не в том, что Бруно Лоуаги предложил в отношении согласованности 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 за помощь в понимании системы и исключении некоторых вещей.
Похоже, PDF TK не удалось обработать укусы, которые имели (
а также )
Я заменил их \)
а также \(
чтобы избежать их, и это сработало хорошо.
Проблема со шрифтом:
https://stackoverflow.com/a/44442957/2150220
Ссылка выше — лучшее решение, чем просто смена шрифта.
Я получал ту же ошибку, однако ни одно из вышеперечисленных решений не помогло мне.
Как я тестировал:
pdftk a.pdf fill_form a.fdf output b.pdf
Я смог создать PDF, если мой исходный PDF не был изменен, IE: все настройки акробата, где по умолчанию.
Только когда я изменил шрифт на «Arial» для элемента fill_form, я получил ошибку.
Я изменил шрифт, и он снова работал.