若要在 JavaScript 中取得 PDF 頁數,可以使用 PDF 解析函式庫(例如 pdf-lib)載入檔案,然後在解析後的文件上呼叫該函式庫的 getPageCount() 方法 —— 你取得的數字是 PDF 頁面樹中儲存的結構性頁數,而非根據檔案大小估算,也不是列印張數或可見頁碼標籤的計數。頁面樹是每個符合規範的 PDF 的一部分,因此這個做法可作用於任何未加密且格式正確的文件,並在解析完成時立即回傳結果。如果你只需要為單一 PDF 取得一次性答案,而且不想設定 Node、打包工具、npm 套件或伺服器端點,那麼 PDF 頁數計算器 在你的瀏覽器中所顯示的,也是同一個結構性頁數。這兩種方法都在本機讀取 PDF,都會忽略雙面列印設定以及檔案中任何印出的「第 3 頁 / 共 12 頁」之類的標籤,並且都會讓文件保留在你自己的機器上。兩者之間的選擇,取決於你需要在執行中的 JavaScript 應用程式內取得頁數,還是只是需要對單一檔案進行快速的隱私檢查。

how to get pdf page count in javascript
how to get pdf page count in javascript

為什麼 JavaScript 開發者需要可靠的頁數

在幾乎所有瀏覽器端的 PDF 工作流程中,頁數都驅動著各項決策。上傳表單的驗證閘道會依此拒絕超出限制的檔案。用於分割、合併與重新排序工具的前端,會渲染依賴目前最大值的範圍選擇器。列印估算器會依文件是 2 頁還是 220 頁而分流,因為每一個數量級的成本計算都不同。品保檢查會在可見的「第 1 頁 / 共 6 頁」頁尾與文件內部的結構性頁數不一致時,偵測出損毀或遭到重新編號的檔案。

由於頁數經常會控制邏輯,資料來源必須值得信賴。PDF 中常會出現兩個數字:來自頁面樹的結構性頁數,以及印在頁面上的可見標籤。兩者應該一致,但並非總是如此 —— 文件可能以羅馬數字標示頁碼、從 3 開始編號,或在封面蓋上「第 1 頁」戳印。讀取結構性頁數可以消除這種模糊性,讓 JavaScript 應用程式即使在作者為了列印而重新編號頁碼時,仍能以可預期的方式運作。PDF 規格透過單一根 /Pages 物件定義這個計數,其整數 /Count 項目就是每個符合規範的解析器所回傳的值。

使用 pdf-lib 在 JavaScript 中計算頁數

pdf-lib 是一個採用 Mozilla 授權的 PDF 函式庫,可在 Node 與瀏覽器中執行,並直接公開頁面樹。最小化的瀏覽器模式包含三個部分。首先,一個非同步輔助函式,可將 File 轉為頁數:使用 file.arrayBuffer() 讀取檔案,將緩衝區傳遞給 PDFDocument.load(),然後回傳 pdf.getPageCount()。其次,檔案輸入元素的 change 處理常式,用於接收使用者選擇的檔案並將結果寫回頁面。第三,一小段 HTML —— 一個檔案輸入與一個目標輸出元素 —— 用以承載這兩部分。三者合在一起,就構成了用戶端最小可行的頁數計算器整合。

同一份解析後的文件也公開了每頁的幾何資訊。在 PDFDocument.load() 回傳之後,可以透過 PDFPage.getSize() 取得第一頁以 PDF 點數表示的 MediaBox 尺寸,它會回傳一個包含 widthheight 鍵的物件。將兩者輸出至主控台,US-Letter PDF 會顯示 612 乘 792,A4 PDF 則會顯示 595.28 乘 841.89。使用 pdf.getPages() 進行迭代,可將每頁的尺寸收集到一張對映表中,進而實作與無程式碼工具相同的最先出現分組行為。

PDFDocument.getPageCount 頁面所記載的底層 API 可得幾項限制:加密的 PDF 除非先解密否則會拋出例外,空白的 PDF 會在 load() 時拋出例外,而回傳的數字永遠都是結構性頁數 —— 與旋轉詮釋資料、紙張尺寸標籤或任何渲染過程無關。尺寸呼叫遵循相同的模式,記載於 PDFPage.getSize。請將這兩次呼叫視為 JavaScript 內部的唯讀檢查步驟,而將任何會產生新檔案的作業交給專門的 PDF 工具處理。

不撰寫 JavaScript 也能取得頁數

當你不需要撰寫程式碼,只是想得知單一 PDF 包含多少頁 —— 無論是為了上傳檢查、列印估算、分割計畫或文件品保 —— 本機的 PDF 頁數計算器工具會執行相同的解析,並完全跳過整合步驟。一切都在你目前的分頁中進行。檔案會被讀取,但絕不會被上傳,也不會寫入任何修改後的副本。瀏覽器會在任何數字出現之前先完成載入文件的頁面樹,而工具內部的一個工作識別碼可以防止較慢的舊讀取作業覆蓋較新讀取作業的結果。

  1. 在瀏覽器中開啟 PDF 頁數計算器,並選擇一個不超過 25 MiB 的非空白 PDF。
  2. 等待瀏覽器讀取文件的頁面樹 —— 解析完成後,總頁數就會出現。
  3. 檢視總頁數以及分組後的頁面方框尺寸:等寬等高的項目會被合併,因此若檔案包含兩個 612 乘 792 pt 的頁面與一個 400 乘 500 pt 的頁面,將會以最先出現的順序同時報告這兩種尺寸及其數量。

選取另一個檔案會在處理開始前清除先前的結果,因此顯示的頁數永遠屬於目前指定的那個檔案。超過 25 MiB 上限的檔案、沒有已知密碼的加密文件,以及損壞的交叉參考資料表,會以可見的錯誤呈現,而非靜默地顯示為零;整個操作過程始終嚴格保持唯讀。

結果包含哪些內容,又排除了哪些內容

標題上的數字就是文件 /Pages 陣列的確切長度 —— 亦即結構性頁數。它並非衍生自檔案大小、縮圖渲染過程、任何雙面或 N 合 1 排版下的張數,或印在頁面上的頁碼。JavaScript 端的情況也是如此,因為程式碼與工具讀取的是透過同一底層 PDF 函式庫取得的同一個欄位。

對於每一頁,結果還會以 PDF 點數回報目前頁面方框的寬度與高度,其中 1 點為 1/72 英吋,並由檔案的幾何定義 —— 而非由你的螢幕或印表機決定。顯示精度最高為小數點後兩位,且顯示尺寸相同的項目會依最先出現的順序合併。旋轉詮釋資料可能會影響檢視器呈現頁面的方式,但回報的寬度與高度會鎖定為文件函式庫所回傳的頁面方框值;旋轉永遠不會被重寫,也不會對任何頁面進行標準化。頁面方框不會被標示為 A4、Letter 或任何其他紙張標準,因為將點數對應到具名的紙張格式需要同時做出方向決策並設定容差門檻,這可能會誤導混合尺寸的檔案。

計算器不會估算列印成本、不會計算註解數、不會偵測空白頁、不會計算實體雙面張數、不會渲染縮圖,也不會新增詮釋資料。由於來源檔案並未被修改,因此不會產生下載檔案,結果僅存在於頁面中,直到選擇另一個檔案或關閉分頁為止。

解讀頁面方框尺寸

由於數值是以 PDF 點數回報,在掃視分組後的輸出時,一個快速的對照表會有所幫助。下表將幾種常見紙張標準的點數對應至英吋與公釐 —— 這些是檔案本身在依據標準紙張尺寸製作且未經縮放或旋轉時,應該包含的值。請將這些數字視為幾何資訊,而非品質評分:較大的點數尺寸可能容納低解析度影像,而較小的點數尺寸可能容納在任何縮放比例下都能清晰列印的向量圖稿。

紙張標準寬 × 高 (pt)寬 × 高 (in)寬 × 高 (mm)
US Letter612 × 7928.5 × 11215.9 × 279.4
US Legal612 × 10088.5 × 14215.9 × 355.6
US Tabloid / Ledger792 × 122411 × 17279.4 × 431.8
A4595.28 × 841.898.27 × 11.69210 × 297
A3841.89 × 1190.5511.69 × 16.54297 × 420
A5419.53 × 595.285.83 × 8.27148 × 210

若要從點數換算為公釐,請乘上轉換係數 25.4 mm ÷ 72 pt。對於一個回報為 612 乘 792 pt 的 US Letter 頁面,計算過程如下。

  • 寬度:612 pt × 25.4 mm ÷ 72 pt = 15,544.8 ÷ 72 = 215.90 mm (≈ 8.5 in)。
  • 高度:792 pt × 25.4 mm ÷ 72 pt = 20,116.8 ÷ 72 = 279.40 mm (≈ 11 in)。

若某頁的寬度與高度符合上表中的某一行,通常代表該文件是依據該標準製作的。若與錯誤方向相符,或點數值落在列與列之間,則往往代表使用了非標準的 MediaBox、被裁切的 CropBox,或是原始尺寸從未被標準化的掃描插頁。

得知頁數後常見的後續工作

頁數通常是下一步的輸入。超出上傳限制的檔案需要先縮減才能送出。具有混合頁面方框的檔案需要在邊界處進行分割。應該從「第 1 頁」開始卻從「第 3 頁」開始的檔案,則需要在其上加蓋頁碼。這些動作並非檢查檔案,而是會修改副本。本機 PDF 工具的目錄涵蓋了所有常見的後續步驟。

  • 若檔案過大而無法提交,可在本地透過 壓縮 PDF 縮小檔案,或使用 分割 PDF 在上傳前將其拆分為較小的範圍。
  • 若檔案包含應自成一份文件的封面、摺頁或插頁,請使用依自訂範圍分割的「分割 PDF」功能,或使用 擷取 PDF 頁面 將所選頁面複製到新檔案中。
  • 若文件可見的頁碼從錯誤的數字開始,請使用 為 PDF 新增頁碼 蓋上新的編號。
  • 若檔案的頁面順序錯亂,請使用 重新排列 PDF 頁面 進行調整。
  • 若需要將檔案縮放至單一標準紙張格式,請執行 調整 PDF 尺寸

計算器仍然是快速的隱私檢查步驟,不會動到原始位元組,因此在每次修改後重新執行都是安全的,可用來確認結構性頁數是否與你在輸出檔案中預期的頁碼一致。

延伸閱讀:PDF 圖層疊加:在不遺失頁數的情況下放置圖層

延伸閱讀:線上使用 PDF 頁數計算器是否安全?隱私指南