PDF 頁數計數器是一個唯讀工具,可開啟單一 PDF、讀取其文件頁面樹,並回報該檔案所含的確切頁數,以及每頁以 PDF 點數表示的寬度與高度。頁數取自 PDF 內部的結構頁面陣列,而非列印紙張設定、縮圖預覽或可見的頁碼標籤,因此一份每張實體紙張上印有「1、2、3、1、2、3」的 30 頁合約,仍會計為 30 頁。除了總頁數之外,計數器也能依相同的寬度與高度配對將頁面分組,這有助於在一份整體統一的文件中辨識封面、拉頁或不小心變更的頁面尺寸。Lizely 上的 PDF 頁數計數器 遵循這個定義:它在目前的瀏覽器分頁中開啟大小不超過 25 MiB 的本機 PDF,讀取頁面樹,並在不上傳或修改檔案的情況下回報總頁數以及每組分組的頁面框尺寸。當問題是結構頁數與尺寸清點時,它是合適的工具;而當需要新檔或修改過的檔案時,它就派不上用場。

PDF 頁數計數器實際上計算的是什麼
PDF 將其頁面儲存在文件主體內的一個樹狀結構中。根頁面節點指向每一個個別的頁面物件,而總頁數等於該陣列的長度。用來計算 PDF 頁數的工具會直接讀取這個結構陣列。根據 PDFDocument.getPageCount 的 pdf-lib API 說明文件,頁數是指文件頁面樹中的頁面數量,這是權威來源。
這一點很重要,因為人們聯想到「頁數」的好幾件事情,其實與結構頁數是脫鉤的。文件可以顯示從「3」開始的頁碼標籤(因為封面未編號)、在前面章節使用羅馬數字,或在雙面列印時讓實體紙張上的頁碼重複。這些標籤都不會改變頁面陣列。遵循結構頁數的計數器,無論檔案在螢幕或紙面上如何編頁,都會回傳相同的總數。
同樣的原則也適用於檔案大小、縮圖數量與列印紙張估算。12 MiB 的 PDF 不一定比 800 KiB 的 PDF 頁數多;縮圖格狀檢視可以顯示文件中並未包含的預覽;雙面列印會讓實體紙張數減半,但不會讓 PDF 頁數減半。結構式計數器會忽略所有這類估算,原樣回傳檔案中頁面樹的長度。
為何頁數與頁面框尺寸要一同回報
PDF 中的每個頁面都帶有定義其可見寬度與高度的頁面框。這些數值以點數表示,由 PDF 自定義其幾何規格,而非由螢幕或印表機決定。pdf-lib API 透過 PDFPage.getSize 公開這些數值,以文件回報的方式傳回目前的頁面框尺寸。
只回報頁數會隱藏一整類重要的問題。由多個來源組裝而成的 PDF,可能封面是一種尺寸、內頁是另一種尺寸、拉頁又是第三種尺寸。只能回傳「42 頁」的計數器,無法告訴你這份檔案內部是否一致,也無法告訴你是否在某個頁面在組裝過程中悄悄變成了不同尺寸。將相同尺寸分組後,頁數就變成了尺寸清單,讓混合尺寸的情形一眼可見。
混合尺寸的 PDF 與首次出現分組法
計數器會讀取每個頁面的頁面框,並將每個寬度與高度四捨五入到小數點後最多兩位以供顯示。接著將顯示尺寸相同的項目合併成單一列,依其在頁面樹中首次出現的順序排列。如果檔案前三頁共用一個框、接下來兩頁共用另一個框、最後一頁使用第三個框,結果會列出三列而非六列。
此工具不會為這些列指派「A4」或「Letter」等紙張標準標籤。這麼做需要決定方向與容差,而計數器刻意避免這類決定,讓輸出反映的是檔案本身,而非對檔案的詮釋。兩張尺寸為 612 乘 792 點的頁面會以計數為二的單一分組列呈現,而非顯示為「兩張 US Letter 頁」,因為檔案是此工具唯一查詢的權威來源。
旋轉、方向以及顯示與幾何規格的差異
PDF 中的旋轉中繼資料會改變檢視器在螢幕上呈現頁面的方式,但頁面框的寬度與高度不會因該旋轉而改變。計數器會以文件函式庫回傳的頁面框數值進行回報,因此旋轉 90 度的頁面所顯示的寬度與高度,仍與未旋轉時相同。這讓尺寸清單對齊的是文件儲存的幾何規格,而非短暫的顯示旋轉,而檔案本身也不會被重寫以「修正」旋轉。
如何在 PDF 中計算頁數並分組尺寸
下列程序完全在目前的瀏覽器分頁中執行,不會儲存新檔,也不會將 PDF 傳送到任何地方。
- 選擇一個大小不超過 25 MiB 的非空 PDF。使用檔案選擇器從您的裝置中選取單一 PDF。超出該大小範圍的檔案、空白的選取項目或非 PDF 檔案,都不會產生頁數。
- 等待瀏覽器讀取文件頁面樹。頁面樹會在本機讀取;一旦瀏覽器完成載入,頁數與尺寸分組就會顯示在同一頁上。
- 檢視總頁數與每組分組的頁面框尺寸。分組中的每一列會列出以 PDF 點數表示的寬度與高度,以及共用這些數值的頁數,依首次出現的順序排列。
選擇另一個檔案會在處理開始前清除先前的結果,而作業識別碼可防止較舊的慢速讀取覆蓋較新選取的輸出。顯示的頁數永遠屬於頁面上目前所標示的檔案,且磁碟上的原始位元組不會被更動。
解讀結果:總頁數與尺寸分組
輸出分為兩個部分。第一個是單一整數:文件頁面樹所含的總頁數。第二個是分組尺寸的清單。每一列包含一個寬度、一個高度與一個計數,而各列依相符頁面在文件中首次出現的順序排列。
想像一份 PDF 含有兩張 612 乘 792 點的頁面,以及一張 400 乘 500 點的頁面。總數為三頁,分組會列出兩列:一列是計數為二的 612 乘 792 框,另一列是計數為一的 400 乘 500 框。這些數字直接取自檔案,因此相同輸入永遠會產生相同輸出,且尺寸代表的是文件幾何規格,而非品質分數。
| 計數器回報的內容 | 計數器忽略的內容 |
|---|---|
| 來自頁面樹的結構總頁數 | 可見的頁碼標籤,包含位移與羅馬數字 |
| 每頁目前框的寬度與高度,以點數表示 | 以檔案大小估算長度 |
| 依首次出現順序分組的相同頁面框尺寸 | 檢視器預覽中的縮圖數量 |
| 目前頁面上的唯讀結果 | 雙面列印紙張數與列印成本 |
工具回報錯誤時
有幾種輸入情況會讓計數器顯示錯誤訊息,而非頁數。空檔案、非 PDF 的選取項目、大於 25 MiB 的檔案、加密或有密碼保護的文件、交叉引用資料損毀的檔案,或任何底層函式庫無法解析的 PDF,都會產生可見的錯誤。
密碼保護不會被略過。如果文件已加密,計數器不會猜測或移除密碼;必須先使用專用工具以正確密碼解鎖檔案,才能進行計數。交叉引用資料損毀通常代表指回頁面樹的尾錄不一致,計數器會將此情況以錯誤呈現,而不是猜測總數。
| 情況 | 結果 |
|---|---|
| 空檔案或非 PDF 的選取項目 | 顯示可見錯誤,不顯示頁數 |
| 大於 25 MiB 的 PDF | 顯示可見錯誤,不顯示頁數 |
| 加密或有密碼保護的 PDF | 顯示可見錯誤,不略過密碼 |
| 交叉引用資料損毀 | 顯示可見錯誤,不顯示頁數 |
| 不支援的 PDF 結構 | 顯示可見錯誤,不顯示頁數 |
計數器不做的事情
計數器嚴格為唯讀,來源 PDF 不會以任何方式被更動。它不會新增中繼資料、修復損毀的檔案、儲存新副本、萃取文字、產生縮圖、計算註解、偵測空白頁、計算實體雙面列印紙張數,或推算列印成本。由於來源不會被修改,因此不會產生下載,且結果只會保留到選擇另一個檔案或關閉分頁為止。
如果任務超出檢查範圍——例如在已知頁數處分割檔案、刪除少數幾頁、重新排列頁面,或將幾何規格調整為單一紙張標準——計數器就派不上用場。它只負責回應結構頁數與頁面框清單,並就此打住,將任何修改交由專用 PDF 工具處理。
延伸閱讀:PDF 頁數計數器入門:以淺顯英文撰寫的指南。
延伸閱讀:列印工作用的 PDF 頁數計數器。