Use of PdfStamper
你的代码
你的代码
PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest)) ;
stamper.close() ;
本质上是告诉 iText 复制原始 PDF丢弃未使用的对象并使用 iText 的默认压缩设置.
iText 的默认压缩设置包括not使用压缩交叉引用和对象流(在 PDF 1.5 中引入),但使用交叉引用表和单独压缩对象的旧技术。
另一方面,示例文件确实使用了这些技术。因此,它的压缩效果要好得多。
全压缩代码
您也可以告诉 iText 使用这些改进的压缩技术,如下所示:
PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
stamper.setFullCompression();
stamper.close();
(冲压.java https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/stamp/Stamping.java#L120测试方法testStampAcroJSCompressed
)
这会导致文件大小小于 4 MB。
使用附加模式的代码
如果您想保持对象存储的原始方式,您可以使用追加模式,它以相同的方式复制原始文件并以所谓的增量更新的形式添加更改,如下所示:
PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream, '\0', true);
stamper.close();
(冲压.java https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/stamp/Stamping.java#L95测试方法testStampAcroJSAppended
)
这会产生比原始文件稍大的文件。
Use of PdfCopy
你观察到PdfCopy
正在丢弃一些非内容元数据
当然可以。PdfCopy
旨在复制pages从一个 PDF 到另一个 PDF,保持内容和注释不变,但忽略其他页面级和所有文档级信息。