從 PDF 中萃取嵌入圖片,意思是在自己的機器上把原始的點陣位元組從文件中拉出來。基於瀏覽�器的萃取工具會讀取 PDF 的影像字典、識別嵌入的影像物件,並為每個瀏覽器能安全處理的影像提供下載連結。兩種永遠能正常運作的情況是 DCTDecode 串流——也就是 PDF 對嵌入 JPEG 的稱呼——以及使用 8 位元 DeviceRGB 或 DeviceGray 色彩的簡單 FlateDecode 串流。那些位元組會在本地端掃描,絕不會離開當前的分頁,並以可立即使用的 JPG 或 PNG 檔案形式存到你的電腦上。其他所有的情況,包括遮罩、索引色盤、CMYK、JPX、JBIG2、LZW、預測器以及鏈接的濾鏡,都會被回報為略過,而不是被錯誤解碼。這種嚴格的、位元組層級的做法,正是真正的萃取工具與只會把頁面畫出來的截圖工具之間的差別。

「從 PDF 萃取圖片」實際上的意思是什麼
PDF 是一個容器,而不是一張平面圖片。一個頁面可以包含從字型繪出的文字、從數學公式繪出的向量路徑,以及以獨立串流形式放置的點陣影像物件。當你要求從 PDF「萃取圖片」時,你是在要求取得那些點陣物件——照片、公司標誌、掃描的簽名、從其他檔案貼進來的圖表。從 PDF 萃取圖片工具正是為這個工作而設計的。它會在當前的瀏覽器分頁中走訪 PDF 的影像 XObject,並為每個符合支援編碼的物件提供下載連結。
這和把 PDF 頁面轉換成圖片是不同的做法。頁面轉換工具會把整個頁面——文字、向量、排版、空白——全部渲染成一張平面點陣圖。當你需要分享頁面的樣貌時,這是正確的工具。當你只想要碰巧位於第 4 頁的某個標誌時,它就是錯誤的工具。截圖也會重新壓縮像素,因此一張原本在 PDF 內以無失真方式儲存的照片,出來時會帶有 JPEG 式的瑕疵。真正的萃取工具會在 DCTDecode 情況下保持儲存的位元組不變,並把簡單的 Flate 情況膨脹成一個乾淨的 PNG,全程不會經過任何失真編解碼器重新壓縮。
瀏覽器掃描如何找到嵌入的圖片
工具會開啟本地端的 PDF 檔頭,將其驗證為一個有界 PDF,接著使用 pdf-lib 列舉間接影像 XObject。對於 DCTDecode 影像,PDF 實際上只是包裝一個 JPEG 位元串流,因此萃取工具會把那些儲存的位元組拉出來,原封不動地以 JPG 下載方式交給你。對於使用 8 位元 DeviceRGB 或 DeviceGray 色彩、沒有遮罩也沒有 DecodeParms 預測器的簡單 FlateDecode 影像,瀏覽器會膨脹原始像素串流——也就是 MDN DecompressionStream API 中所記載的同一個膨脹步驟——把像素放到本地端的畫布上,然後編碼為 PNG。在那裡使用 PNG,是因為原始的 Flate 影像串流本身不是普通應用程式能開啟的獨立影像檔案。
任何不符合這兩種支援模式的東西,都會刻意被略過,並被列為略過,而不是以錯誤的顏色解碼,或是以損壞的檔案形式回傳。
| PDF 影像情況 | 工具的動作 | 你得到的輸出 |
|---|---|---|
| DCTDecode(嵌入 JPEG) | 匯出儲存的 JPEG 位元組,不重新渲染 | JPG,原始品質 |
| FlateDecode,8 位元 DeviceRGB 或 DeviceGray,無遮罩,無預測器 | 在瀏覽器中膨脹原始像素串流,並於本地編碼 | PNG |
| JPXDecode、JBIG2Decode、LZWDecode | 略過——不同的濾鏡,不會悄悄重新編碼 | 列為略過 |
| 索引色、CMYK、軟遮罩、影像遮罩 | 略過——否則會以錯誤的顏色或損壞的檔案解碼 | 列為略過 |
| 鏈接濾鏡(多個 /Filter 項目) | 略過——合併的串流不會被打散 | 列為略過 |
為何有些嵌入圖片會被刻意略過
PDF 的影像儲存有許多合理的變化形式,而這個工具把每個濾鏡鏈視為各自獨立的情況來處理,而不是去猜測。一個使用 JPXDecode(JPEG 2000)、JBIG2Decode 或 LZWDecode 的影像字典,不會在執行時被改造成另一種編解碼器,因為那會默默地改變色彩模型或壓縮瑕疵。索引色盤、CMYK 色彩空間、軟遮罩、影像遮罩以及 DecodeParms 預測器,都帶有瀏覽器無法在本地端自行重建的額外詮釋資料,強行處理有產生損壞檔案的風險。相同的謹慎也適用於鏈接兩個或更多濾鏡的串流。
略過會被回報,而不是被隱藏。工具會把每個被略過的物件顯示出來,讓你知道哪些沒有被匯出。這讓你能夠分辨這個 PDF 是只包含少數全部成功輸出的影像,還是包含較多但其中一部分被刻意留下的物件。同一個儲存資產的重複間接參考也只會被檢查一次,因此一個標誌不會被膨脹成一大堆令人困惑的重複下載。
如何在瀏覽器中從 PDF 萃取圖片
整個流程都在單一的瀏覽器分頁中執行。不需要帳號、不需要電子郵件、不需要上傳。以下是從你打開工具那一刻起,它所走過的步驟。
- 選擇一個本地端的 PDF,大小上限為 25 MB。檔案選擇器只會讀取你的瀏覽器已經能存取的位元組;不會有任何東西被送到伺服器。
- 選擇萃取圖片,在瀏覽器中掃描有界的嵌入影像物件。工具會走訪 PDF 的間接影像 XObject,並為每個符合支援編碼的物件加上標記。
- 檢視每個結果旁顯示的格式與尺寸。這個清單會告訴你該項目是儲存的 JPG 還是剛編碼出來的 PNG,以及從影像字典中取得的像素寬度與高度。
- 使用每張圖片的下載連結,下載每個支援的 JPG 或 PNG 檔案。當你選擇另一個檔案或離開工具時,暫時性的下載網址就會被釋放。
如果某個結果看起來令人意外——顏色錯誤、主體錯誤,或在你預期是完整照片的地方出現了微小的佔位圖——請保留原始 PDF,重新開啟工具,並在你重複使用下載的檔案之前,先確認尺寸與格式。
萃取工具在任何下載之前強制執行的限制
在工具配置大型的輸出緩衝區之前,它會根據一組安全預算來檢查 PDF 和候選影像。這些預算是為了防止單一異常龐大的物件耗盡分頁的記憶體,也讓最終的下載清單只包含在其他應用程式中真正可用的影像。
| 限制 | 數值 | 存在的原因 |
|---|---|---|
| PDF 大小上限 | 25 MB | 在開始解碼前先限制掃描範圍 |
| 影像尺寸上限 | 單邊 12,000 像素 | 拒絕過大的影像字典 |
| 每張影像的最大百萬像素數 | 40 MP | 防止單張影像耗盡畫布預算 |
| 整個掃描的總百萬像素數 | 100 MP | 整份文件影像內容的上限 |
| 解碼後的 Flate 位元組上限 | 100 MB | FlateDecode 串流原始像素資料的上限 |
| 受密碼保護的 PDF | 拒絕——不會繞過 | 工具不會嘗試移除加密 |
| 格式錯誤或異常複雜的 PDF | 仍可能失敗 | 不修復、不驗章、不聲稱信任 |
對於想深入了解膨脹步驟實際如何運作的讀者,在不設定 Python 的情況下從 PDF 萃取圖片指南為來自命令列背景的使用者,把同一套工作流程詳細拆解開來。
什麼時候頁面轉換工具更合適
當你需要的是嵌入的素材時——一張被放進 PDF 的照片、一個從設計檔案匯入的標誌、一張以單一影像物件形式存在的掃描圖——萃取工具就是正確的工具。當你需要的是整個可見頁面,包括文字、向量圖案與邊距時,頁面轉換工具才是正確的工具。針對那項工作,可使用 PDF 轉 PNG 工具取得每頁的無失真輸出,或使用 PDF 轉 JPG 轉換器 來調整縮放與品質。兩者都在瀏覽器中執行,無需上傳文件。
一個實用的經驗法則:如果你能在另一個檢視器中用單次點擊選中那張圖,你大概會想要用萃取工具。如果你需要的是擷取文字與圖案在頁面上的相對配置,那你會想要用頁面轉換工具。這兩個工具共享相同的隱私特性——一切都在當前的分頁中——但它們回答的是不同的問題;用錯工具的結果,通常就是得到一張截圖而不是一項素材。
想更深入了解,可參閱 離線 JPG 轉 PDF:在瀏覽器中於本地轉換照片。