Itextpdf正确停止转换pdf

时间:2015-03-06 12:17:48

标签: java pdf jboss itext itextpdf

我有一个关于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应用程序(带有main()方法的类)中调用main方法之类的方法时,它可以正常工作。 此外,我还可以添加模板具有可编辑的字段,这些字段必须在将来填充,但现在不进行任何编辑。 任何人都可以假设这里有什么问题吗?

最诚挚的问候, 塞吉

1 个答案:

答案 0 :(得分:1)

原因

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

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

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

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

治愈

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

  

默认情况下,不再过滤带扩展名(jpg,jpeg,gif,bmp和png)的文件。

     

用户可以添加一些额外的文件扩展名,以便不使用以下配置应用过滤:

<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>