我有formflattening並沒有發現在網絡的任何(或只是沒有答案的問題)時,關於iText的行爲問題。這就是我所做的:Formflattening和文件大小縮小/未引用的對象
stamper.setFormFlattening(true);
產生的大小立即從例如207kb - > 172kb。直接執行
stamper.getReader().removeUnusedObjects();
沒有效果。如果我在文本編輯器中打開PDF,我仍然可以在該結果文件中找到許多未引用的對象。如果我再在「新鮮」模子再次加載PDF和呼叫
stamper.getReader().removeUnusedObjects();
的PDF是減少到99KB,沒有未引用的對象都找不到。 因此,這裏是我的問題:是否有可能立即(不從文件或內存再次重新讀取PDF)從PDF刪除所有未引用的對象?對我來說,似乎在第一次運行中,所有直接字段相關的對象被刪除,但不是這些對象的間接引用字典。
兩個反向的問題和備註:(1)爲什麼要使用的''而不是reader.removedUnusedObjects()''stamper.getReader()removeUnusedObjects()?它沒有任何區別,但我很好奇。 (2)您使用的是哪種版本的iText?最近的版本會自動觸發'removeUnusedObjects()'(這就解釋了爲什麼自己調用它沒有任何影響)。 (3)在調用方法的那一刻,許多對象仍然被引用。只有在扁平化過程之後,參考纔會被刪除。 –
1)沒有特別的理由,你是對的我也可以使用reader.removedUnusedObjects()2)好吧,解釋它。我猜它隱含地被稱爲但不確定,因此我再次調用它... 3)但是,例如,一個簽名字典僅由一個簽名字段引用(本身被正確刪除)不被任何其他對象引用,但不會被刪除... – Lonzak
我知道,但保留一個不需要的對象比扔掉一個對象更安全這是必要的。如果您使用'PdfSmartCopy'進行後期處理,您會發現您甚至可以從文件中掐下更多字節。 –