我有一个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并成功运行固定的命令。
我的问题是导致此错误的原因以及如何解决?
答案 0 :(得分:8)
我在StackTrace中看到了我的名字。这不是巧合:PdfTk基于强大的旧版iText。 iText是一个Java PDF库,最初由我编写,但由第三方用于创建PdfTk。
该错误告诉您iText正在解析具有错误或意外功能的PDF。
PDF由PDF对象组成,如PDF字符串对象,PDF编号对象,PDF数组对象,PDF字典对象,PDF流对象等。 iText能够检索这些对象并重用它们来创建新的PDF。在您的情况下,将根据原始PDF的对象创建包含一些填写的表单字段的新PDF。
如果没有看到导致问题的PDF就无法回答您的问题,但是假设您的PDF包含/AcroForm
条目,其中包含/Fields
数组。在此fields数组中,有一个对字段字典的引用。假设PDF中的一个字段字典不是字典,而是PDF null对象。该表单在Adobe Reader中完美显示,但在内部,存在一个阻止正确处理表单的缺陷。
在这种情况下,iText将循环遍历fields数组中的条目,其中一个条目不会返回字段字典,而是返回PdfNull
个对象。在这种情况下,您将获得ClassCastException
,因为您无法将PdfNull
投射到PdfDictionary
。
这就是说:
您可以尝试一件事:在Adobe Acrobat中打开表单。在Adobe Acrobat中保存表单。保存的表单有可能不再存在问题。 Adobe Acrobat非常容忍PDF格式的错误。它试图尽可能多地修复它。然后,当您保存表单时,错误就消失了。
答案 1 :(得分:6)
事实证明,问题不在于Bruno Lowagie关于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在某种程度上造成了畸形。
如果有人有兴趣,我的最终解决方案是this。它需要带有字段的模板PDF,生成FDF来填充它,通过使用模板PDF从FDF添加数据来创建新PDF,将浏览器重定向到PDFs位置。
非常感谢Bruno Lowagie帮助更好地理解系统并排除了一些事情。
答案 2 :(得分:3)
看起来PDF TK无法处理有char (
和)
的叮咬我用\)
和\(
替换它们以逃避它们,并且它有效好。
答案 3 :(得分:0)
字体问题: https://en.wikipedia.org/wiki/Imaginary_unit
上面的链接比仅更改字体是更好的解决方案。
我收到了相同的错误,但是,以上解决方案均不适合我。
在测试时:
pdftk a.pdf fill_form a.fdf output b.pdf
如果我的原始pdf未被更改,则我能够生成pdf,即IE:所有acrobat设置均为默认设置。
仅当我将fill_form元素的字体更改为“ Arial”时,我才收到错误。 我更改了字体,然后又可以正常工作了。
答案 4 :(得分:0)
我有同样的问题。以我为例,更改字符串编码即可解决。 以前我是用utf-8编码的,然后将其更改为utf_16_be。 根本原因是表单字段数据以fdf格式存储,值存储在方括号内,因此,如果数据带有方括号,则会引发错误。