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 空对象。表单在 Adobe 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 文档,就不会期望得到答复。
您可以尝试一件事:在 Adobe Acrobat 中打开表单。在 Adobe 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 文件的内容不包含“未闭合的”括号、方括号或花括号。
我有一个 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 空对象。表单在 Adobe 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 文档,就不会期望得到答复。
您可以尝试一件事:在 Adobe Acrobat 中打开表单。在 Adobe 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 文件的内容不包含“未闭合的”括号、方括号或花括号。