2013-08-23 63 views
0

我有formflattening並沒有發現在網絡的任何(或只是沒有答案的問題)時,關於iText的行爲問題。這就是我所做的:Formflattening和文件大小縮小/未引用的對象

stamper.setFormFlattening(true); 

產生的大小立即從例如207kb - > 172kb。直接執行

stamper.getReader().removeUnusedObjects(); 

沒有效果。如果我在文本編輯器中打開PDF,我仍然可以在該結果文件中找到許多未引用的對象。如果我再在「新鮮」模子再次加載PDF和呼叫

stamper.getReader().removeUnusedObjects(); 

的PDF是減少到99KB,沒有未引用的對象都找不到。 因此,這裏是我的問題:是否有可能立即(不從文件或內存再次重新讀取PDF)從PDF刪除所有未引用的對象?對我來說,似乎在第一次運行中,所有直接字段相關的對象被刪除,但不是這些對象的間接引用字典。

+0

兩個反向的問題和備註:(1)爲什麼要使用的''而不是reader.removedUnusedObjects()''stamper.getReader()removeUnusedObjects()?它沒有任何區別,但我很好奇。 (2)您使用的是哪種版本的iText?最近的版本會自動觸發'removeUnusedObjects()'(這就解釋了爲什麼自己調用它沒有任何影響)。 (3)在調用方法的那一刻,許多對象仍然被引用。只有在扁平化過程之後,參考纔會被刪除。 –

+0

1)沒有特別的理由,你是對的我也可以使用reader.removedUnusedObjects()2)好吧,解釋它。我猜它隱含地被稱爲但不確定,因此我再次調用它... 3)但是,例如,一個簽名字典僅由一個簽名字段引用(本身被正確刪除)不被任何其他對象引用,但不會被刪除... – Lonzak

+0

我知道,但保留一個不需要的對象比扔掉一個對象更安全這是必要的。如果您使用'PdfSmartCopy'進行後期處理,您會發現您甚至可以從文件中掐下更多字節。 –

回答

0

僅作參考,以便沒有人需要通過所有這些評論瀏覽:

壓扁刪除AcroForm條目,Annots項,表單域的外觀和窗口小部件,但不會走很「深」 - 所以如這些表單字段引用的間接對象不會被刪除。如果是字體,圖像(...)仍被其他對象引用,但是如果間接對象(真的)不再被引用,它將保留在pdf中。要在同一個實例上調用removeUnusedObjects無濟於事。

的iText的作者提到,他會看看源代碼,看看是否有觸發removeUnusedObjects一次在PdfStamperImpclose()方法,這可能會解決這個問題的一種方式。