【发布时间】:2014-05-23 13:50:15
【问题描述】:
我正在尝试用数据填充 PDF 表单并让 PDFStamper(itext 版本 5.5.1)处理多个 PDF 文件,但在某些情况下它总是失败。示例代码:
PdfReader reader = new PdfReader(new FileInputStream("C:/Temp/source.pdf"));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("C:/Temp/temp.pdf"));
stamper.close();
到目前为止,有两个不同的错误消息,第一个:
Exception in thread "main" java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
at com.itextpdf.xmp.impl.XMPMetaParser.createDocumentBuilderFactory(XMPMetaParser.java:423)
at com.itextpdf.xmp.impl.XMPMetaParser.<clinit>(XMPMetaParser.java:71)
at com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:167)
at com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:153)
at com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:337)
at com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:208)
第二:
java.lang.reflect.InvocationTargetException
[...]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.itextpdf.xmp.impl.XMPMetaParser
at com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:167)
at com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:153)
at com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:337)
at com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:208)
错误消息各不相同,可能是因为环境不同(完整应用程序与测试类,但都使用 itext-5.5.1.jar)。
其中一个工作 PDF 表单是使用 OpenOffice Writer 创建的,它生成了 1.4 版 (Acrobat 5.x) 文档。失败的 PDF 表单是使用 Acrobat Distiller 7.0.5、pdf 版本 1.6 (Acrobat 7.x) 创建的。我已经尝试将其转换为 1.4/5.x 版本,但没有成功。
有什么想法吗?
【问题讨论】:
-
这看起来像“脏 XMP”。你能分享PDF吗
-
嗯...我无法重现该问题,但我注意到您的错误消息中有一些内容:您的 CLASSPATH 中是否有两个不同的 iText 版本?
-
不,我没有。但是你的暗示把我引向了正确的方向。我在类路径中有一个旧版本的 Apache Xerces 导致错误。我将不得不看看我是否可以安全地将其替换为第一眼看起来不错的当前版本。非常感谢!
-
这是个好消息!这可能解释了
AbstractMethodError。
标签: itext