Remove Images from PDF 這款工具,會產生一份在本機建立的全新 PDF 副本,其中每一個符合資格的內嵌 JPG 影像物件,都會被替換成一個極小的 1×1 白色 JPEG,而每一頁其餘的部分——文字、連結、邊界,以及非影像的向量繪圖——則完全不受影響。整個轉換過程完全在您的瀏覽器分頁中執行,因此這份文件絕不會被上傳到任何遠端伺服器。這款工具會枚舉 PDF 中每一個間接的影像 XObject,逐一比對一套嚴格的相容性規範,並遵循「全有或全無」的安全規則:只要檔案中有任何一張影像未通過檢查,這款工具就會拒絕執行這項工作,也不會儲存任何輸出結果。這項拒絕機制很重要,因為一次做到一半的移除,會在磁碟上留下一份已損壞的 PDF——頁面繪製指令會指向一個已不存在的物件,標準檢視器也會拒絕開啟這份檔案。透過保持原始物件參照有效、只替換其內部的影像位元組,這款工具能保留頁面的內容串流,因此最終產生的 PDF 仍然能正常開啟,文字與連結的呈現方式也與原始檔案完全相同。

how to remove image from pdf
如何從 pdf 中移除影像

為什麼從 PDF 中移除一張影像,比刪除一個檔案要困難

多數檔案格式儲存影像的方式是自成一體的,因此移除一張影像,只是刪除一段位元組區塊的問題。PDF 並非如此運作。根據 Adobe PDF Reference,每一頁都有一個由繪製運算子所組成的內容串流,其中一個運算子——Do 運算子——會把一項具名資源繪製到頁面上。這個「名稱」是頁面資源字典中的一個鍵,而這個鍵所對應的值,是一個間接參照,指向存放在檔案中其他位置的一個影像 XObject。

正是這種間接性,讓天真的移除方式變得危險。如果一支指令碼單純把這個影像 XObject 從 PDF 內容中刪除,Do 運算子在檢視器下一次算圖該頁面時,仍然會嘗試解參照它。檢視器只剩下兩個都不好的選項:要嘛跳出「PDF 已損壞」的錯誤訊息、拒絕顯示該頁,要嘛悄悄跳過這個消失的物件,產生一個與原始版面配置不再相符的部分空白頁面。有些檢視器還會保留已刪除影像的快取縮圖,重新開啟該檔案時,這些縮圖可能又會冒出來。

第二個、比較不明顯的問題是,同一份原始影像資料,可能被參照了不只一次。舉例來說,一張以整頁影像形式插入的掃描檔,有時也會被當成標誌縮圖用在頁首。刪除這個物件,會一次移除所有這些出現位置,而這往往不是使用者真正想要的結果。而且,由於 PDF 格式並沒有提供編輯器一個安全的「移除並修補」基本操作,每一種因應辦法,都必須手動針對檔案結構自行實作。

白色替換法如何讓檔案維持有效

Remove Images from PDF 這款工具,靠著保持每一個原始參照完整不變、只替換每個符合資格之 XObject 內部的影像位元組,來解決上述問題。這項實作建構在 pdf-lib PDFRawStream 基本結構 之上,走訪頁面資源字典,找出每一個符合支援規範的間接影像物件,並用一份有效的 1×1 白色 JPEG 內容,改寫該物件的串流字典。

從 PDF 檢視器的角度來看,結構上沒有任何改變:這一頁具名影像資源的數量不變,內容串流仍然以相同的名稱呼叫 Do,這個間接物件也依然能正常解析。改變的,是被繪製出來的內容——一個 1 像素的白色方塊,取代了原本的照片或掃描圖。由於頁面其餘部分是這款工具不會碰觸的文字、向量筆畫,或其他類型的內容,因此被清空區域周圍的版面配置,會維持在原本的位置上。

這款工具在儲存之後,也會執行一道結構驗證步驟。它會用 pdf-lib 開啟這份新的 PDF,再用 Mozilla PDF.js 開啟一次,確認頁數沒有改變,並確認每一個應該被替換的影像物件,都確實是一份有效的替代內容。只要其中任何一項檢查失敗,就不會提供這份檔案供下載。

在您的瀏覽器中從 PDF 移除影像

  1. 開啟 Remove Images from PDF 工具,選取一份本機的 PDF 檔案。這款工具一次只接受一份文件,且來源 PDF 大小必須在 25 MB 以下。
  2. 等待本機檢查完成。這款工具會走訪文件中每一個間接的影像 XObject,逐一比對支援的編碼規範。
  3. 選擇 Remove eligible images。如果這份文件中有任何一張影像,是這款工具無法安全替換的,它就會停止執行、不儲存任何輸出結果,因此您不會得到一份假裝已經完成、實際上只做了一半的檔案。
  4. 開啟新的 PDF 預覽,逐頁捲動檢視。確認白色替代內容確實落在原始影像所在的位置,也確認文字、連結,以及其他非影像內容,都仍然在正確的位置上。
  5. 只有在預覽畫面看起來正確無誤時,才下載這份新的 PDF。原始的來源檔案會留在您的電腦上,不受任何影響。

這款工具能替換的影像類型(以及會被拒絕的類型)

PDF 中的影像編碼方式這款工具的處理方式
未加遮罩的 8 位元 DCTDecode JPEG,DeviceRGB替換成一張 1×1 的白色 JPEG
未加遮罩的 8 位元 DCTDecode JPEG,DeviceGray替換成一張 1×1 的白色 JPEG
帶有遮罩、DecodeParms,或調色盤的 JPEG拒絕整份文件
JPX(JPEG 2000)、JBIG2、LZW、Flate,或其他濾鏡拒絕整份文件
CMYK、索引色,或內嵌影像拒絕整份文件
已加密、受密碼保護,或已簽署的 PDF拒絕;這款工具不會繞過密碼,也不會保留簽章

這份支援清單刻意訂得很窄。一款對不支援的編碼「盡力而為」的工具,要不是悄悄產生一份已損壞的 PDF,就是悄悄把複雜的影像留在原地、卻回報成功。這種全有或全無的檢查機制,能保證只有在整份文件都真正被正確處理過之後,下載按鈕才會出現,這也是為什麼在下載之前先檢視預覽,仍然是一個有用、而非多餘的最後步驟。

輸出的 PDF 中,哪些內容維持不變

頁面元素執行這款工具後的狀態
頁面幾何資訊(大小、邊界、旋轉角度)保留
可選取的文字與字型資源在來源 PDF 支援的情況下保留
超連結,以及大綱/書籤結構保留
向量繪圖、形狀,與筆畫保留
符合資格的內嵌 JPG 影像物件在同一個參照位置,替換成一張 1×1 的白色 JPEG
直接繪製在內容串流中的內嵌影像本版本不宣稱能移除
PDF 中繼資料、文件歷程紀錄、先前的修訂版本從來源保留

由於這款工具並不是一款像素編輯器,可見的結果,取決於原始影像上方疊放了什麼東西。如果有其他頁面元素被繪製在該照片上方——例如浮水印、便利貼,或註解——這些疊層會維持在原地,而底下被清空的,是它下方的那個白色方塊。因此,這項輸出結果,是對底層影像 XObject 所做的結構性清理,而不是強制對其上方所有覆蓋內容做視覺遮蔽。

什麼情況下不該用這款工具

這款工具是為一項特定的清理工作而打造的:清空單純放置的照片或掃描圖,同時讓文件其餘部分維持可用。有幾項常見的 PDF 任務,並不是這款工具的設計目的,若強行拿它來用,可能會浪費時間,或產生令人誤解的結果。

  • 法律、安全,或隱私等級的資訊遮蔽。 白色替換只是對影像串流做的一項結構性變更。可還原的中繼資料、先前的修訂版本,以及無障礙標籤,仍可能參照著原始像素,疊放在該影像上方的其他內容,也依然可見。若目標是可證明地徹底移除敏感內容,請使用專門的資訊遮蔽工作流程。
  • 已加密或受密碼保護的 PDF。 這款工具不接受密碼,也不會嘗試繞過加密。如果您的檔案必須輸入密碼才能開啟,請先對來源檔案執行一道移除密碼的步驟——且僅限您本身有權使用的密碼。
  • 已數位簽署的 PDF。 編輯影像串流會讓現有的簽章失效。如果您需要一份已簽署的文件,請在清理後的副本上重新產生一份新的簽章,而不要依賴原本的那一份。
  • 由 JPEG 以外的多種影像格式組成的 PDF。 如果您的文件是以 JPEG 2000 掃描而成、是從某款設計工具以 LZW 壓縮匯出的,或含有 CMYK 或索引色影像,這款工具會拒絕執行這項工作。在這種情況下,可以考慮先把文件轉換成純文字,或從頭重建版面配置。
  • 只想移除某一張特定圖片、同時保留其他圖片。 這款工具會替換文件中每一張符合資格的影像。如果您只想從某一頁移除某一個標誌,改用另一套工作流程做頁面層級的編輯,會更適合。
如果您的目標剛好相反——是要把影像從 PDF 中

取出,而不是就地清空——Extract Images from PDF 會把每一張符合資格的 JPG 儲存到一份本機封存檔中,這對在清理步驟之前先保留一份原始影像副本很有用。對於白色佔位圖可以接受、優先考量是讓檔案能正常開啟、文字與連結仍可選取的日常文件而言,這種本機替換做法,是一種不需要把檔案上傳到任何地方,就能把照片從 PDF 中剝除出來的簡單方法。

若想深入了解,請參閱 How to Remove a PDF Password in Adobe Using Your Browser

若想深入了解,請參閱 How to Extract Images from a PDF Without Illustrator