跳轉到

文件權限

PDF 加密文件可以限制使用者對文件的操作,例如禁止列印、複製文字或修改內容。Permission 旗標(bitfield)定義了這些限制,儲存在 PDF 加密字典的 P 欄位中。

權限旗標

use NextPDF\Security\Permission;
use NextPDF\Security\EncryptionConfig;

// 按位元組合多個權限
$config = Configuration::create(
    encryption: EncryptionConfig::aes256(
        userPassword: 'user',
        ownerPassword: 'owner',
        permissions: Permission::PRINT
            | Permission::PRINT_HIGH_QUALITY
            | Permission::COPY,
    ),
);

完整權限旗標列表

常數 位元 說明
Permission::PRINT bit 3 允許列印(可能是低品質)
Permission::MODIFY bit 4 允許修改文件(除表單外)
Permission::COPY bit 5 允許複製文字與圖形
Permission::ADD_ANNOTATIONS bit 6 允許新增或修改標注
Permission::FILL_FORMS bit 9 允許填寫表單欄位
Permission::EXTRACT_ACCESSIBILITY bit 10 允許擷取文字(無障礙用途)
Permission::ASSEMBLE bit 11 允許文件組裝(插入/刪除/旋轉頁面)
Permission::PRINT_HIGH_QUALITY bit 12 允許高品質列印
Permission::NONE 0 禁止所有操作
Permission::ALL 全部 允許所有操作

常用權限組合

// 唯讀文件(可查看、可列印,不可修改)
Permission::PRINT | Permission::PRINT_HIGH_QUALITY | Permission::EXTRACT_ACCESSIBILITY

// 可填寫表單(不可修改文件結構)
Permission::FILL_FORMS | Permission::EXTRACT_ACCESSIBILITY

// 可存取(無障礙使用)
Permission::EXTRACT_ACCESSIBILITY

// 完全鎖定(只能查看)
Permission::NONE

權限的實際限制

需要理解的重要事項:PDF 權限是「軟性」限制,僅在符合規範的 PDF 閱讀器中執行。使用擁有者密碼可以解除所有限制,且部分第三方工具可能忽略權限設定。

對於需要強制執行的機密性保護,應考慮: 1. 使用 DRM(數位版權管理)方案 2. 限制文件的散佈渠道 3. 結合數位簽章確保完整性

密碼安全性

SASLprep 正規化

根據 PDF 2.0 規範,密碼在使用前必須經過 SASLprep(RFC 4013)正規化,確保 Unicode 密碼在不同系統間的一致性:

use NextPDF\Security\PasswordNormalizer;

// NextPDF 內部自動執行,開發者通常不需要直接呼叫
$normalized = PasswordNormalizer::saslprep($rawPassword);

// 注意:部分 Unicode 字元在 SASLprep 後可能改變或被拒絕
// 若密碼包含非 ASCII 字元,建議先驗證
$isValid = PasswordNormalizer::isValidForPdf($rawPassword);

密碼強度建議

最低要求(生產環境):
- 擁有者密碼:至少 16 字元,包含大小寫、數字、特殊字元
- 使用者密碼:至少 8 字元(若使用的話)

警告:
- 禁止使用空擁有者密碼(等同無保護)
- 禁止使用者密碼 = 擁有者密碼(無法區分角色)
- PDF 最大密碼長度:127 bytes(UTF-8 編碼後)

參見

  • 加密 — AES-256 加密設定
  • 數位簽章 — 結合簽章的文件保護
  • 設定 — 加密與權限的設定入口