Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

PDF 圖片數量對不上?分清物件、放置次數與實際可見畫面

同一圖片重用、頁外放置和不透明遮蓋會帶來不同計數。四組實測對照說明,各種檢查分別能驗收什麼。

原創示意圖:四組受控PDF比較獨立xref、image-info出現次數、預設裁切圖片區塊及實際算繪觀察到的藍塊;不同計數回答不同問題。
原創示意圖:四組受控PDF比較獨立xref、image-info出現次數、預設裁切圖片區塊及實際算繪觀察到的藍塊;不同計數回答不同問題。 Watch at Ease

PDF 圖片清單不等於讀者眼前能看見的圖片數。我們的受控樣例只有一個嵌入點陣圖,卻放置三次:兩處與頁面相交,一處在頁外。在頁內第二處上方加入白色不透明遮蓋後,算繪畫面從兩個藍色方塊變成一個,圖片清單卻沒有改變。

先明確需要的是獨立嵌入素材、每次放置紀錄,還是頁面算繪外觀,再保留對應證據。現有 PyMuPDF 擷取與裁切方法仍然有效;本文補充的檢查是:即使圖片邊界框與頁面相交,也不能證明它在最終畫面中可見。

先定義輸出,再選擇計數

匯出素材時,記錄嵌入圖片身分與擷取結果;同一圖在多頁重用,不一定要當作多個獨立素材。製作放置清單時,則應保留每次出現的頁碼、bbox和transform,即使xref重複。要取得頁面視覺裁切,應算繪目標區域,不能假設匯出的原始圖片等同於合成畫面。

這些目標不能共用一個成功數字。依xref去重可以適用於素材庫,但若把它當成唯一清單,就會失去放置紀錄。反過來,資源列數也不能證明有同樣多的獨立原圖。PyMuPDF 已說明重複出現、可能存在未繪製資源,以及xref為0代表內嵌式圖片或無法識別的參照。不要把所有xref為0的項目合併為一個已知素材。

建立唯讀的出現紀錄

記錄準確PDF雜湊、實體頁碼、函式庫版本與輸出目標。下列程式對適當大小、已獲授權的工作副本檢查第一頁,不重寫PDF。保留出現序號、xref、bbox和transform,不要改成只以xref為鍵的字典。其他頁面使用對應的從零開始索引。 ```python import pymupdf with pymupdf.open("input.pdf") as doc: page = doc[0] # first physical page refs = page.get_images(full=True) placements = page.get_image_info(xrefs=True) print("resource rows:", len(refs)) print("unique positive xrefs:", len({r[0] for r in refs if r[0] > 0})) print("placements:", len(placements)) for occurrence, item in enumerate(placements): print(occurrence, item["xref"], item["bbox"], item["transform"]) ```

獨立檢查可用 pdfimages -list "input.pdf",它列出頁碼、圖片編號、類型和物件ID,不寫擷取圖片。檢查結束狀態並比較重複物件ID,不要把每列當作獨立素材。報告中的寬高描述嵌入像素,而非頁面上的繪製大小;mask和smask會以不同類型列出,本次簡單實驗沒有這兩類。

先解釋裁切差異,再認定圖片遺失

PyMuPDF 的image-info清單不限制在可見頁面矩形內,而 get_text('dict') 預設使用該範圍,並只包含完全位於裁切區內的圖片。既有支援討論以 clip=pymupdf.INFINITE_RECT() 解決計數差異;clip=None 仍採一般頁面範圍。這裡承認既有解法,不把它包裝成新發現。

無限裁切改變的是清單範圍,不會讓頁外內容在頁面算繪中變得可見。get_text('dict') 還會載入圖片二進位資料,get_image_info 則避免載入這些位元組。只有確實需要比較時,才在適當大小的受影響頁執行較重檢查。點陣圖清單為空也不代表頁面為空,文字與向量繪製命令屬於其他內容。

看四組實測對照

我們建立並重新開啟四份200×150點、無旋轉的單頁PDF,點陣圖為自製20×20像素RGB方塊。單次放置組有1個獨立xref、1次image-info出現、1個預設圖片區塊,算繪可見1個藍塊。三次放置組把同一xref用於兩處頁內和一處頁外位置:資源紀錄3、出現次數3、預設圖片區塊2、無限範圍圖片區塊3,與頁面相交邊界框2。

在頁內第二處上方再畫白色不透明向量矩形,所有上述清單數字不變,畫面卻只剩第一個藍塊。像素取樣驗證未遮蓋處為藍色、遮蓋處為白色。另一個純向量方塊樣例的資源、image-info和圖片區塊都為0,但算繪仍有藍色圖形。Poppler 在兩組重用樣例中皆列出物件ID相同的三筆圖片紀錄。九項有意義的斷言通過;這些已知對照不構成通用可見性偵測器。

依任務目標驗收

若要放置清單,匯出前比較完整出現紀錄與預期位置;若要素材,另行說明身分與去重規則;若要外觀,則檢查頁面算繪,例如 page.get_pixmap(),以及真正需要的裁切。保留原PDF,不要因為數字不一致就刪圖片。頁面相交只是幾何判斷,白色遮蓋對照已證明它不能單獨保證可見。

實驗限於Linux下的PyMuPDF 1.26.6、MuPDF 1.26.11與pdfimages 24.02.0,沒有測試遮罩、透明度、旋轉頁面、Form XObject、可選內容、註解或私人文件。複雜重疊與合成還需要更多檢查。看起來正確的裁切只證明外觀結果,不證明物件已刪除,也不是遮蔽去識別化或安全稽核。

原創示意圖:同一圖片在兩組中皆出現三次、兩個邊界框與頁面相交,但不透明遮蓋讓可見藍塊從兩個變成一個。
原創示意圖:同一圖片在兩組中皆出現三次、兩個邊界框與頁面相交,但不透明遮蓋讓可見藍塊從兩個變成一個。 Watch at Ease