線性化(快速網頁瀏覽)¶
線性化 PDF(Linearized PDF),又稱「快速網頁瀏覽」(Fast Web View),是一種特殊的 PDF 組織方式,讓瀏覽器在 PDF 尚未完全下載前就能顯示第一頁。對於超過 10 頁或 1 MB 的文件,線性化可顯著改善使用者的感知等待時間。
啟用線性化¶
use NextPDF\Writer\WriterOptions;
use NextPDF\Writer\LinearizationMode;
$pdfBytes = $document->finalize(
writerOptions: WriterOptions::create(
linearization: LinearizationMode::Enabled,
),
);
線性化的物件重排¶
線性化 PDF 將物件依照最佳的存取順序重排:
線性化 PDF 物件順序:
1. 線性化字典(Linearization Dictionary)— 包含文件總體資訊
2. 第一頁所需的所有物件(頁面字典、字型、影像)
3. 第一頁的交叉參考資料(First Page XRef)
4. 文件目錄(Catalog)與 Info 字典
5. 其餘頁面的物件(按頁序排列)
6. 完整交叉參考串流(放在末尾,供本地完整解析使用)
Hint Tables¶
線性化 PDF 包含提示表(Hint Tables),讓 HTTP 伺服器根據使用者導航到特定頁面時,精確發起 HTTP Range Request 只取所需位元組:
Head Hint Table(在文件前端):
- Page Offset Hint Table:各頁面在檔案中的位元組偏移與長度
- Shared Object Hint Table:多頁共享的資源(字型、色彩空間)
Overflow Hint Table(在文件末端):
- 第一頁後的頁面偏移修正值
伺服器配置建議¶
# Nginx:啟用 Range Request 支援
server {
location ~ \.pdf$ {
add_header Accept-Ranges bytes;
# 可選:禁用 sendfile 以允許動態 Range 計算
}
}
線性化後的修改¶
對線性化 PDF 的任何修改(增量更新)會使線性化失效。若需修改線性化 PDF:
// 策略 1:修改後重新線性化
$modifiedPdf = modifyPdf($linearizedPdf);
$relinearizedPdf = $linearizer->linearize($modifiedPdf);
// 策略 2:僅對最終版本進行線性化(推薦)
// 在 document->finalize() 時啟用,確保最終輸出是線性化的
線性化驗證¶
use NextPDF\Writer\LinearizationChecker;
$checker = LinearizationChecker::create();
$result = $checker->check(pdf: $pdfBytes);
echo "Linearized: " . ($result->isLinearized() ? 'Yes' : 'No') . PHP_EOL;
echo "First Page Size: " . $result->getFirstPageBytes() . " bytes" . PHP_EOL;
echo "Hint Table Valid: " . ($result->hasValidHintTable() ? 'Yes' : 'No') . PHP_EOL;