Java 如何将任意PDF文件降级为PDF-1.2版?

Java 如何将任意PDF文件降级为PDF-1.2版?,java,pdf,itext,Java,Pdf,Itext,我有一些用户生成的PDF文件。通常,这些文件是用Word生成的,但它们可能只是一个任何类型的有效PDF文件。如果他们有更高的版本号,我想将文件转换为PDF-1.2版本。仅在更高版本(如多媒体)中可用的功能应删除,并且结果应合理且可读 如何在没有AdobeAcrobat等交互式工具的情况下以编程方式实现这一点?最好使用Java和Java-library,但我也对其他解决方案感兴趣 一种方法是从原始PDF生成一组图像,然后将它们打包为PDF-1.2文件,但这是一种更优雅的方法吗?最简单的方法是通过G

我有一些用户生成的PDF文件。通常,这些文件是用Word生成的,但它们可能只是一个任何类型的有效PDF文件。如果他们有更高的版本号,我想将文件转换为PDF-1.2版本。仅在更高版本(如多媒体)中可用的功能应删除,并且结果应合理且可读

如何在没有AdobeAcrobat等交互式工具的情况下以编程方式实现这一点?最好使用Java和Java-library,但我也对其他解决方案感兴趣


一种方法是从原始PDF生成一组图像,然后将它们打包为PDF-1.2文件,但这是一种更优雅的方法吗?

最简单的方法是通过Ghostscript重新打印

您可以在iText中使用设置PDF版本,但我认为降级不会立即生效。您可以使用PdfCopy,将PDF写入版本为1.2的新PDF,并删除所有none 1.2对象。或者将它们转换为1.2版本的对象(我想你必须自己做,但不确定)

试试下面的命令行。它使用Ghostscript重新提取PDF。使用Ghostscript版本8.71或更新版本:9.00。(上面投票错误的答案建议“使用setPdfVersion()在iText中设置PDF版本”将不起作用——它只会重新标记PDF,这只会导致错误的引导…)


这样会不会将文本数据保持为文本,而不会生成单个大图像?很可能不会。如果这是一项要求,那么您可能需要编辑您的问题。@Juha Syrjälä:是的,Ghostscript将文本数据保留为文本[尽管我不会称之为“重印”,而是通过Ghostscript“重新提取”,前提是:(1)您使用适当的Ghostscript commmand参数,(2)PDF中嵌入了所有使用的字体,或者(b)PDF使用的未嵌入字体在所有PDF阅读器上都可用。降级的最终目的是什么?使PDF更具普遍可读性,就像在手机和电子书阅读器上一样?更新版本的PDF功能的好处在于它们被老读者忽略了。开头的“1.x”只不过是一个建议。。。一个观众可以忽略的。如果您将表单字段放在1.2标记的PDF中,我怀疑读者仍然会阅读/执行其中一个字段以及他们可能拥有的任何脚本。哦,它可能会抱怨一个糟糕的版本,但我怀疑字段是否会中断。iText不会因为您要求它将版本设置为1.0而删除所有标记的内容,也不会删除颜色信息。PDF1.0只是灰度IIRC。我不建议使用setPdfVersion,我只是说你可以使用它,我清楚地声明降级将不起作用,你必须手动删除更高版本的对象。
gswin32c.exe ^
   -o output-v1.2.pdf ^
   -sDEVICE=pdfwrite ^
   -dPDFSETTINGS=/ebook ^
   -dCompatibilityLevel=1.2 ^
    input-v1.6.pdf