如果问题实际上不是(仅)文档声明的版本号,而是自 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 文件不包含任何内容。
指示 iText在'4'
目标文件的标题中声明版本 1.4。
根据 PDF 大小和可用资源,您可能希望使用不同的PdfReader
构造函数,而不是一次将所有源 PDF 读取到内存中,而是仅在需要时才读取。
PS:我使用当前的 iText 5.4.x 版本。iText 可以根据 AGPL 的条件免费获得,也可以通过商业方式获得。
PPS:如果您想强制 iText 使用交叉引用和对象流,则必须stamper.setFullCompression()
在构造后调用stamper
.