从servlet转换PDF到旧版本?

时间:2013-03-19 23:37:54

标签: java pdf converter

希望获得一个开源或合理的商业许可产品,可以从Redhat 5.x Linux环境中的JBoss AS5上运行的Java Servlet中使用,将PDF转换为1.5到1.4版本。

或者我可以使用任何技巧修改PDF 1.5内容以恢复1.4兼容格式。真的。

我有一个PDF,我将要作为对servlet的响应返回。但它是1.5格式,这不会显示在我们客户的一些adobe5古代版本中。但它确实显示在1.4,所以我需要一种方法来转换它,如果它甚至可能。

还有其他解决方法吗?想法?我都是耳朵!

如果你能帮助我,请告诉我!

3 个答案:

答案 0 :(得分:2)

如果问题实际上不是(仅仅)文档所声明的版本号,而是从PDF 1.5开始允许从根本上改变的文档文件结构(因此,自Adobe Reader 6)---即交叉引用流(而不是交叉引用表)和对象流---使用iText库的以下代码可能对您有所帮助:

PdfReader reader = new PdfReader(SOURCE);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(TARGET), '4');
stamper.close();

这实际上解析原始PDF文件并从解析的PDF对象创建新的PDF文件。但是,默认情况下,iText 使用交叉引用或对象流。因此,新的PDF文件确实不包含。

'4'指示iText在目标文件的标题中声明版本1.4。

根据PDF大小和可用资源,您可能希望使用不同的PdfReader构造函数,而不是一次性将所有源PDF读入内存,而是仅在需要时将其读取。

PS:我使用当前的iText 5.4.x版本。 iText可根据AGPL的条件免费提供或商业化。

PPS:如果您希望强制iText使用交叉引用和对象流,则必须在构建stamper.setFullCompression()后调用stamper

答案 1 :(得分:1)

看一下Set PDF Version using iText. iText已接受的答案是一个Java库,所以我希望它适合你。

答案 2 :(得分:1)

修改标题pdf版本将无法执行,因为您还可以在文档目录中找到覆盖版本信息

引自pdf file format specs

  

PDF文件第一行中的标题指定PDF版本   (见7.5.2,“文件头”)。从PDF开始   1.4,PDF版本也可以在文档目录的Version条目中指定,实质上是更新与之关联的版本   通过覆盖文件头中指定的文件来查看该文件(请参阅   7.7.2,“文件目录”)。如以下段落所述,符合产品在打开或保存文档时的行为   取决于将PDF文件的版本与PDF版本进行比较   合格产品支持。