【问题标题】:iText Error: java.io.IOException: trailer not foundiText 错误:java.io.IOException:未找到预告片
【发布时间】:2014-11-04 04:02:21
【问题描述】:

我正在创建一个 Web 应用程序,它将使用 iText 填写 PDF 表单。为了创建 PDF 表单,我首先使用 Microsoft Word 创建模板,保存它,然后在 Adob​​e Acrobat Xi Pro 中打开该文件,添加我的表单域,并将其保存为 PDF。问题是 PDF 没有与预告片一起保存,所以当我执行此操作时:

PdfReader reader = new PdfReader(templateName);

它抛出异常“java.io.IOException:未找到预告片”。我知道如果 PDF 有预告片,我可以阅读它,因为我尝试过阅读其他 PDF。所以看来问题是 Acrobat 没有在我的 PDF 中添加预告片。即使我尝试在 Acrobat 中从头开始创建 PDF 表单,它也不会与预告片一起保存。

还有其他人遇到过这个问题吗? Acrobat 中是否有一些设置会添加预告片?有没有办法让 iText 在没有预告片的情况下阅读它?

====更新====

我一定有一个旧版本的 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) 在 com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:337) 在 com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:208)

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

【问题讨论】:

  • 向我们展示 PDF。 Adobe Acrobat 总是添加预告片。也许还有另一个问题在起作用。另外:您使用的是哪个版本的 iText?我记得我们过去对预告片的位置非常严格:我们按字面意思实施规范,但有时我们必须不那么严格,因为并非所有 PDF 都遵守规范(但由 Acrobat Professional 创建的 PDF 总是这样做)。
  • 如何显示 PDF?我很高兴分享它我只是不知道如何。
  • 放到Dropbox等文件共享服务上,分享链接。屏幕截图不行,我们需要 PDF。
  • java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V - 看起来您的 xml 不匹配-API 和 xml-API 在您的类路径上实现。

标签: java pdf adobe itext


【解决方案1】:

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

希望这会有所帮助!

【讨论】:

  • 上面的sn-p是POM文件。
  • 这是无效的 xml 语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2019-08-17
相关资源
最近更新 更多