在不安裝 imagick、pdftotext 等外部工具的前提下,利用 PDF 檔案內部結構特徵,即可快速提取頁數。本文提供一個純 PHP 函數,適用於共享主機、容器化環境等受限場景。
PDF 檔案內部包含 /Count N 關鍵字標示頁數(N 為整數)。掃描檔案內容,取最大值即為總頁數。此特性源自 PDF 規範中的頁面樹結構。
<?php
/**
* 獲取 PDF 總頁數
* @param string $path PDF 檔案路徑
* @return int|false 頁數,失敗回傳 false
*/
function getPdfPageCount($path) {
// 以二進位唯讀模式開啟
$fp = @fopen($path, 'rb');
if (!$fp) {
error_log("無法開啟檔案:$path");
return false;
}
$maxPages = 0;
// 分塊讀取,避免大檔案記憶體溢位
while (!feof($fp)) {
$line = fgets($fp, 1024);
// 匹配 /Count 後接數字
if (preg_match('/\/Count\s+(\d+)/', $line, $matches)) {
$pages = (int)$matches[1];
if ($pages > $maxPages) $maxPages = $pages;
}
}
fclose($fp);
return $maxPages ?: false; // 0 頁視為失敗
}
// 使用範例
$pageCount = getPdfPageCount('/path/to/document.pdf');
if ($pageCount !== false) {
echo "PDF 共 $pageCount 頁";
} else {
echo "解析失敗,請確認檔案路徑與格式";
}
?>
rb:跨平台相容,避免 Windows 換行符干擾。fgets($fp, 1024):不將整個檔案載入記憶體,支援大檔案。/\/Count\s+(\d+)/:比原文 /\/Count [0-9]+/ 更精確,直接捕獲數字組。/Count(如頁面樹節點),葉節點值最大。| 場景 | 支援度 | 說明 |
|---|---|---|
| 標準 PDF 1.4+ | ✅ 完美 | 多數現代 PDF 產生工具皆相容 |
| 加密/受保護 PDF | ❌ 不支援 | 內容加密導致關鍵字不可讀 |
| 線性化 (Fast Web View) PDF | ✅ 支援 | 結構特徵不變 |
| 掃描件/影像型 PDF | ✅ 支援 | 頁數資訊獨立於內容類型 |
更多 PHP 檔案操作、正則表達式、Office 文件處理、陣列技巧、排序演算法、資料結構、資料庫操作匯總,請參考本站專題系列。