我正在创建一个使用iText填充PDF表单的Web应用程序。要创建PDF表单,我首先使用Microsoft Word创建模板,保存模板,然后在Adobe Acrobat Xi Pro中打开该文件,添加表单字段,并将其另存为PDF。问题是PDF没有用预告片保存,所以当我执行这个时:
PdfReader reader = new PdfReader(templateName);
抛出异常“java.io.IOException:预告片未找到”。我知道如果有预告片,我可以阅读PDF,因为我已经尝试过阅读其他PDF文件了。所以问题似乎是Acrobat没有在我的PDF中添加预告片。即使我尝试在Acrobat中从头开始创建PDF表单,也不会用预告片保存。
还有其他人遇到过这个问题吗? Acrobat中是否有一些设置会添加预告片?有没有办法让iText在没有预告片的情况下阅读它?
==== UPDATE ====
我必须有一个旧版本的iText,因为当我下载最新版本时,我能够阅读我的PDF文件。然而,在阅读文件并盖章后,我得到一个例外,关闭了压模。代码如下所示:
PdfReader reader = new PdfReader(templateName);
FileOutputStream os = new FileOutputStream(outputPath);
PdfStamper stamper = new PdfStamper(reader, os);
AcroFields acroFields = stamper.getAcroFields();
List<String> fields = getFieldNames(getContextCd());
for (String field : fields) {
acroFields.setField (field, StringUtil.checkEmpty(request.getParameter(field)));
}
stamper.setFormFlattening(true);
stamper.close();
我得到的错误是:
java.lang.AbstractMethodError:javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava / lang / String; Z)V 在com.itextpdf.xmp.impl.XMPMetaParser.createDocumentBuilderFactory(XMPMetaParser.java:423) 在com.itextpdf.xmp.impl.XMPMetaParser。(XMPMetaParser.java:71) 在com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:167) 在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)
我添加到类路径中的唯一jar文件是itextpdf-5.5.2.jar。我需要任何其他罐子吗?
答案 0 :(得分:0)
我的解决方案将有效...... 假设1:pdf缺少预告片,它被放置在resources / xxx下,构建后将其移至classess / xxx 假设2:您正尝试从类路径中读取pdf并尝试从此pdf文件路径创建PdfReader对象。
如果以上假设是正确的,则下面的解决方案是推理: 转到您的pom文件或构建您所拥有的配置文件,并更改设置以排除.pdf文件在构建期间被过滤。我们希望pdf从resources / xxx移动到classess / xxx,而不需要构建活动的任何操作。如下所示:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
**<exclude>**/*.pdf</exclude>**
</excludes>
</resource>
</resources>
需要说明吗?好。 当资源从resources / xxx移动到classess / xxx时,无论它们是什么类型的文件,它们都由构建过程解释。虽然这样做是为PDF,预告片和EOF标签。如果没有,构建工具会向pdf内容添加额外的字符,以便尝试使用此PDF的任何代码报告问题。 如果我们跳过从构建活动中过滤PDF,即使缺少预告片,相同的pdf也会起作用。
希望这有帮助!