我有一个关于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方法之类的方法时,它可以正常工作。 此外,我还可以添加模板具有可编辑的字段,这些字段必须在将来填充,但现在不进行任何编辑。 任何人都可以假设这里有什么问题吗?
最诚挚的问候, 塞吉
答案 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>