首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 解析 PDF 頁數:無需外部擴展的輕量級實作

     編輯:PHP 相關知識

PHP 解析 PDF 頁數:無需外部擴展的輕量級實作

在不安裝 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]+/ 更精確,直接捕獲數字組。
  • 取最大值:PDF 可能包含多個 /Count(如頁面樹節點),葉節點值最大。

適用範圍與限制

場景支援度說明
標準 PDF 1.4+✅ 完美多數現代 PDF 產生工具皆相容
加密/受保護 PDF❌ 不支援內容加密導致關鍵字不可讀
線性化 (Fast Web View) PDF✅ 支援結構特徵不變
掃描件/影像型 PDF✅ 支援頁數資訊獨立於內容類型

替代方案對比

  • Imagick:功能強大但需編譯擴展、記憶體佔用大。
  • Smalot/PdfParser (Composer):純 PHP 解析完整結構,適合需提取文字/元資料場景,但載入整檔較慢。
  • 本文方案:零依賴、極速、記憶體常數級,**僅需頁數時的最佳選擇**。

延伸閱讀

更多 PHP 檔案操作、正則表達式、Office 文件處理、陣列技巧、排序演算法、資料結構、資料庫操作匯總,請參考本站專題系列。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved