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

我正在创建一个Web应用程序,它将使用iText填充PDF表单 . 要创建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:com.itextpdf.xmp中的com.itextpdf.xmp.impl.XMPMetaParser.createDocumentBuilderFactory(XMPMetaParser.java:423)中的javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava / lang / String; Z)V .impl.XMPMetaParser . (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)

我添加到类路径中的唯一jar文件是itextpdf-5.5.2.jar . 我需要任何其他 jar 吗?

回答(1)

2 years ago

我的解决方案将起作用...假设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也会起作用 .

希望这可以帮助!