尝试使用' fill_form'时,PDFtk会抛出Java异常。功能

时间:2016-04-14 04:36:01

标签: java php centos6 pdftk

我有一个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并成功运行固定的命令。

我的问题是导致此错误的原因以及如何解决?

5 个答案:

答案 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

这就是说:

  • 如果我在堆栈跟踪中看到我的名字,则会触发警报,因为这意味着您正在使用比iText 5更早的iText版本。不再使用此类版本。 You should use a more recent version of iText。更新版本的iText很有可能为您提供更好的错误消息,或者容忍(甚至可能修复)PDF中的错误。
  • 如果您发现使用更新版本的iText的PdfTk版本,那会让我感到惊讶,因为据我所知,PdfTk在AGPL下不可用,PDF Labs(PdfTk的所有者)也不是iText软件的客户。
  • 如果您想继续使用PdfTk,只要您不共享您想要填写的PDF文档,就不应该期待答案。

您可以尝试一件事:在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格式存储,值存储在方括号内,因此,如果数据带有方括号,则会引发错误。