2014-12-04 85 views
1

使用命令行ghostscript,是否可以刪除PDF中的重複嵌入對象(圖像)並將其替換爲單個實例?如何使用ghostscript刪除PDF中的重複對象?

我有一個200 +頁的PDF與背景圖像和一些較小的標誌在每一頁上。該文件非常大,因爲在每個單獨的頁面中嵌入了相同的背景圖像和徽標二進制文件,而不是一次嵌入然後在每個頁面上引用。我不是PDF的創建者,所以我無法從源頭上解決問題。

(我不想縮小或降低圖像質量,而且我也不想徹底刪除。)

回答

2

不,Ghostscript的(更具體的pdfwrite設備)將不會取代圖像XObject對象或內嵌圖片,它不會測試它們以查看tehy是否相同。

這是可能的,但這意味着檢查每個圖像的每個字節,這可能是非常昂貴的性能,所以我們現在不這樣做。如果您想修改源文件,我可以提供一些關於從何處開始的建議。

FWIW許多其他對象僅僅因爲讀取和散列大圖像所花費的時間而被重複測試,而沒有測試圖像。

+0

我以某種方式懷疑你對*的假設,「這意味着檢查每個圖像的每個字節」*。難道不可能從圖像流中創建哈希,然後只比較這些哈希? (除非你把哈希創建爲「檢查每一個字節」,這也是......) – 2014-12-04 15:49:44

+0

是的,我確實計算創建一個圖像哈希值來檢查每個字節,因爲,那就是你需要這樣做。目前,pdfwrite爲大量不同的對象類型創建了一個MD5哈希值,但它並不適用於圖像,因爲讀取多個兆字節的數據通常是一個非常不尋常的功能,因此不值得。正如我所說,如果有人真的想這樣做,我可以提供關於在哪裏創建散列,如何確定現有散列是否匹配以及如何用舊引用替換新映像。 – KenS 2014-12-04 15:55:01

+1

如果有人拿起這樣的挑戰,並在你的幫助下實施,這將是非常好的。在那裏有很多「壞」的PDF文件,這些文件對於OP中描述的原因來說太大了。 – 2014-12-04 16:06:06

2

作爲ghostscript的補充,pdfsizeopt在消除PDF中的重複嵌入對象(包括背景圖像)方面做得非常好,並且可以在文件被ghostscript處理之前或之後運行。由於它依賴於工作流程,所以包含在工作流程中有點棘手,並創建了大量的臨時文件。可以在https://github.com/pts/pdfsizeopt(原https://code.google.com/p/pdfsizeopt/

只有通過刪除重複的圖像,我的200多頁文檔從150MB到40MB。