Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FormFlating和文件大小缩减/未引用对象_Java_Pdf_Itext - Fatal编程技术网

Java FormFlating和文件大小缩减/未引用对象

Java FormFlating和文件大小缩减/未引用对象,java,pdf,itext,Java,Pdf,Itext,我有一个关于iText在FormFlating时的行为的问题,在web上没有找到任何东西(或者只是未回答的问题)。我就是这么做的: stamper.setFormFlattening(true); 生成的大小立即从207kb->172kb减少。直接执行 stamper.getReader().removeUnusedObjects(); 没有效果。如果我在文本编辑器中打开PDF,我仍然可以在结果文件中找到许多未引用的对象。如果我在“新”母版中再次加载PDF并调用 stamper.getRea

我有一个关于iText在FormFlating时的行为的问题,在web上没有找到任何东西(或者只是未回答的问题)。我就是这么做的:

stamper.setFormFlattening(true);
生成的大小立即从207kb->172kb减少。直接执行

stamper.getReader().removeUnusedObjects();
没有效果。如果我在文本编辑器中打开PDF,我仍然可以在结果文件中找到许多未引用的对象。如果我在“新”母版中再次加载PDF并调用

stamper.getReader().removeUnusedObjects();
Pdf压缩为99kb,找不到未引用的对象。
所以我的问题是:是否可以立即(无需再次从文件或内存中读取pdf)从PDF中删除所有未引用的对象?在我看来,在第一次运行时,所有与字段直接相关的对象都会被删除,但这些对象不会删除间接引用的词典。

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

展平会删除AcroForm条目、Annots条目、表单字段、外观和小部件,但不会很“深入”——例如,这些表单字段引用的间接对象不会被删除。如果这些是字体、图像(…),它们仍然被其他对象引用,这一点很重要,但是如果间接对象(实际上)不再被引用,它也将保留在pdf中。在同一实例上调用
removeUnusedObjects
,没有任何帮助


iText的作者提到,他将查看源代码,看看在
PdfStamperImp
close()
方法中是否有办法再次触发
删除未使用的对象,这可以解决这个问题。

两个反问题和一句话:(1)为什么使用
stamper.getReader().removeUnusedObjects()
而不是
阅读器。removeUnusedObjects()
?这没什么区别,但我很好奇。(2) 您正在使用哪个版本的iText?最新版本会自动触发
removeUnusedObjects()
(这解释了为什么自己调用它没有任何效果)。(3) 在调用该方法时,许多对象仍然被引用。只有在展开过程之后,引用才会被删除。1)没有特殊原因,你是对的,我也可以使用reader.removedUnusedObjects()2)啊,好的,这就解释了。我猜它是隐式调用的,但不确定,因此我再次调用它。。。3) 但例如,仅由签名字段引用的签名词典(其本身已正确删除)不会被任何其他对象引用,但不会被删除…我知道,但保留一个不需要的对象比丢弃一个必要的对象更安全。如果您使用
PdfSmartCopy
进行后期处理,您会发现甚至可以从文件中节省更多字节。1。)但为什么在第二次运行时会将其删除?这似乎有点小心谨慎。。。2) 有趣-那么我如何在一个文档上有效地做到这一点呢?(虽然这是为了合并多个文档?)啊,我想我可以理解-如果你展平iText,它可以删除所有表单对象。但是这些对象可以引用很多不同的间接对象/字典,比如字体、图像和其他字典,比如签名字典。你不想删除仍在使用的字体或图像,因此所有间接对象都将保留在PDF中?这还包括所有“仅表单字段相关”词典,如SignatureDictionary。