PDFtk 在尝试使用 'fill_form' 函数时抛出 Java 异常

PDFtk throws a Java Exception when attempting to use 'fill_form' function

我有一个 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 包含一个带有 /Fields 数组的 /AcroForm 条目。在这个字段数组中,有一个字段字典的引用。假设您的 PDF 中的一个字段字典不是字典,而是一个 PDF 空对象。表单在 Adob​​e Reader 中完美显示,但在内部存在一个缺陷,无法正确处理表单。

在这种情况下,iText 将遍历字段数组中的条目,其中一个条目不会 return 字段字典,而是 PdfNull 对象。在这种情况下,您将得到 ClassCastException,因为您无法将 PdfNull 转换为 PdfDictionary

话虽这么说:

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

您可以尝试一件事:在 Adob​​e Acrobat 中打开表单。在 Adob​​e Acrobat 中保存表格。保存的表格有可能不再有问题。 Adobe Acrobat 对 PDF 中的错误非常容忍。它会尝试修复尽可能多的问题。然后当你保存表格时,错误就消失了。

事实证明,问题并不像 B运行o Lowagie 就 PDF 的一致性所建议的那样。

我 运行 没有想法,只是想尝试以不同的方式生成 FDF。通过 运行ning 命令:

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,将浏览器重定向到 PDF 位置。

非常感谢 B运行o Lowagie 帮助我们更好地理解系统并排除了一些问题。

看起来 PDF TK 无法处理具有字符 () 的字符串,我将它们替换为 \)\( 以转义它们,并且效果很好。

字体问题:

上面的 link 是比仅仅更改字体更好的解决方案。

我收到了同样的错误,但是,none 上述解决方案对我有用。

在我测试的时候: pdftk a.pdf fill_form a.fdf output b.pdf 如果我的原始 pdf 没有被更改,我能够生成一个 pdf,IE:所有默认的 acrobat 设置。

只有当我将 fill_form 元素的字体更改为 "Arial" 时,我才收到错误消息。 我换了字体,又能用了。

我遇到了同样的问题。在我的例子中,改变字符串编码解决了它。 以前我用utf-8编码然后我把它改成utf_16_be。 根本原因是表单字段数据以 fdf 形式存储,其中值存储在括号内,因此如果您的数据有括号,则会抛出错误。

我只是想跟进遇到此问题的其他人。在我们的例子中,问题出在 FDF 文件的内容中。具体来说,我们正在自动化填写 PDF 的过程,而用户生成的内容有时会包含一个未闭合的 ( [ 或 { 字符。这些会导致同样的异常。如果您遇到这种情况,请确认您的 FDF 文件的内容不包含“未闭合的”括号、方括号或花括号。