1

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

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

让我知道你是否可以帮助我!

4

2 回答 2

2

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

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

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

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

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

PS:我使用当前的 iText 5.4.x 版本。iText 可以根据 AGPL 的条件免费获得,也可以通过商业方式获得。

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

于 2013-03-20T16:41:46.363 回答
1

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

引用自pdf 文件格式规范

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

于 2013-03-20T16:53:12.020 回答