表格展开和文件大小减小/未引用的对象



我有一个关于iText在表单扁平化时的行为的问题,但在web中没有找到任何内容(或者只是未回答的问题)。这就是我所做的:

stamper.setFormFlattening(true);

得到的大小立即从例如207kb->172kb减小。直接执行

stamper.getReader().removeUnusedObjects();

没有效果。如果我在文本编辑器中打开PDF,我仍然可以在结果文件中找到许多未引用的对象。如果我再次加载PDF在一个"新的"印章并调用

stamper.getReader().removeUnusedObjects();

Pdf被减少到99kb,并且没有未被引用的对象被发现。因此,我的问题是:是否可以立即(无需从文件或内存中重新读取pdf)从pdf中删除所有未引用的对象在我看来,在第一次运行中,所有与字段直接相关的对象都会被删除,但这些对象不会删除间接引用的字典。

仅供参考,因此没有人需要浏览所有这些评论:

压扁会删除AcroForm条目、Annots条目、表单字段、外观和小部件,但不会非常"深入",因此这些表单字段引用的间接对象不会被删除。如果这些是字体、图像(…),它们仍然被其他对象引用,这是很重要的。但是,如果间接对象(真的)不再被引用,它也将保留在pdf中。在同一个实例上调用removeUnusedObjects没有帮助。

iText的作者提到,他将查看源代码,看看是否有办法在PdfStamperImpclose()方法中再次触发removeUnusedObjects,这可以解决这个问题。

最新更新