itextpdf停止正确转换pdf

Itextpdf stop transform pdf correctly

我有关于 itextpdf 的下一个问题。

private void generatePdf() throws Exception {
    FileOutputStream fos = null;
    try {
        PdfReader reader = new PdfReader("template.pdf");
        fos = new FileOutputStream("test.pdf");
        PdfStamper stamper = new PdfStamper(reader, fos);

        stamper.close();
    } catch (Exception e) {
        throw e;
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                throw new Exception(e);
            }
        }
    }
}

此方法必须读取模板并将其保存为新的 pdf。但是,如果我查看结果 pdf,我只会看到空白页(4 - 与模板的数量相同)。 有趣的是,此方法是在 jboss 服务器上的 Web 应用程序上下文中调用的。但是当我在简单的 java 应用程序(Class 和 main() 方法)中像 main 方法一样调用此方法时,它工作正常。 此外,我还可以补充一点,该模板具有将来必须填写的可编辑字段,但现在没有任何编辑。 有人可以假设这里有什么问题吗?

此致, 谢尔盖

原因

在评论中发现 OP 在 maven 中创建了他的 Web 应用程序,template.pdf 文件作为 maven 资源提供,并且激活了资源的过滤(即文本变量替换)。

但不幸的是,过滤资源意味着资源文件被视为最终使用 UTF-8 字符编码存储的文本文件。

这基本上破坏了所有压缩流内容(尤其是页面内容和字体程序)和一些元信息字符串,并且还导致交叉引用不正确(编写为 UTF-8 引入了额外的偏移偏移量的字节)。

iText 在为损坏的文件创建交叉引用 table 后仍然可以读取 PDF,因为在这些流和字符串之外,结构仍然是正确的。因此,写入读取损坏的 PDF 的结果包含正确的页数和一些表单字段,但页面内容丢失了。

治愈

解决方法是不过滤 PDF 资源。这可以例如按照 Apache Maven 站点上的说明 here 完成:

By default, files with extensions (jpg, jpeg, gif, bmp and png) won't be filtered anymore.

Users can add some extra file extensions to not apply filtering with the following configuration :

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <configuration>
          ...
          <nonFilteredFileExtensions>
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
            <nonFilteredFileExtension>swf</nonFilteredFileExtension>
          </nonFilteredFileExtensions>
          ...
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>