Java 是否将PDF从servlet转换为旧版本?

Java 是否将PDF从servlet转换为旧版本?,java,pdf,converter,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中显示,所以如果可能的话,我需要一种转换它的方法 还有其他解决办法吗?思想?我洗耳恭听 如果你能帮我,

希望有一个开源或合理的商业许可产品,可以从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中显示,所以如果可能的话,我需要一种转换它的方法

还有其他解决办法吗?思想?我洗耳恭听


如果你能帮我,请告诉我

如果问题实际上不是(仅仅)文档声明的版本号,而是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

后调用
stamper.setFullCompression()
,因为您也可以在文档目录中找到覆盖的版本信息,因此修改页眉pdf版本是行不通的

引自

PDF文件第一行中的标题指定PDF版本 (见7.5.2,“文件头”)。从PDF开始 1.4,也可以在文件目录的版本条目中指定PDF版本,基本上更新与 通过覆盖在文件头中指定的文件(请参见 7.7.2,“文件目录”)。如以下段落所述,打开或保存文件时合格产品的行为 取决于将PDF文件的版本与 合格产品支持


您的PDF使用哪种1.5-ish功能?如果AdobeReader5根本不打开这些文件,那么听起来您的文件使用的是交叉引用流(而不是表),甚至可能是对象流。在这种情况下,PDF将不得不在内部进行修改,在这种情况下,一些结构(如集成签名)将中断。或者问题仅仅是版本标签或类似的东西?在这种情况下,更改可能会以一种侵入性较小的方式执行。我尝试了版本标记,但没有成功。所以是的,我们使用的是1.5-ish特征。。。但是,adobe live cycle创建了pdf,因此我不确定是什么原因导致了它。请从您的工作流程中提供一个示例pdf。如果更新的Adobe LC版本创建PDF,则很可能使用了交叉引用和对象流。我刚刚确认了这一点。这是否意味着可能有一个解决方案可以帮助我?或者这是否意味着不会有一个?我们只需要扁平化的PDF只读文件。这是否意味着我们可以在商业上使用iText而无需支付任何费用?看起来是商业许可证。我已经要求他们报价了。我们拭目以待。我刚刚意识到@jimueller对你问题的回答中提到的答案与我的答案非常相似。。。我只是再也找不到
PdfStamper
中使用的
stamper.setPdfVersion
方法,只在
PdfWriter
和从
PdfWriter
派生的内部iText类中使用。只要您按照AGPL使用iText,您就可以免费在商业上使用iText。如果您将服务分开,适当地解压缩PDF,这是可行的,不是吗?@yms他们可以将该转换作为Web应用程序提供给使用古代adobe Reader的客户进行手动转换,而无需将其作为Web服务。同意。我们尝试了一下,它正在使用那些二进制不兼容。