iText错误:java.io.IOException:找不到预告片

时间:2014-09-10 13:18:59

标签: java pdf adobe itext

我正在创建一个使用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。我需要任何其他罐子吗?

1 个答案:

答案 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也会起作用。

希望这有帮助!