Mã hóa (HasSecurity)
Trait HasSecurity trên Document cung cấp mã hóa AES-256 qua engine Aes256Encryptor. TCPDF-Next chỉ implement security handler PDF 2.0 (AESV3, Revision 6, V5) — RC4 và AES-128 bị loại bỏ có chủ đích. Mật khẩu được chuẩn hóa qua SASLprep (RFC 4013) để xử lý Unicode đúng, và key derivation dùng Algorithm 2.B (iterative SHA-256/384/512).
Bật mã hóa
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->setProtection(
permissions: ['print', 'copy'],
userPass: 'reader-password',
ownerPass: 'owner-secret-password',
)
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'This PDF is AES-256 encrypted', newLine: true)
->save('encrypted.pdf');Mật khẩu User và Owner
- User password — người đọc phải nhập mật khẩu này để mở và xem PDF. Khi trống, document mở không cần prompt nhưng hạn chế quyền vẫn áp dụng.
- Owner password — cấp truy cập đầy đủ, bỏ qua mọi hạn chế quyền. Khi trống, owner password ngẫu nhiên 32 byte được tạo nội bộ.
Cả hai mật khẩu được chuẩn hóa qua SASLprep (RFC 4013) trước key derivation. Điều này đảm bảo mật khẩu Unicode như "Pässwörd" được xử lý nhất quán trên mọi trình xem PDF.
Cờ quyền
Truyền bất kỳ tổ hợp cờ chuỗi nào trong mảng $permissions:
| Cờ | Mô tả |
|---|---|
print | Cho phép in (độ phân giải thấp) |
modify | Cho phép sửa đổi nội dung |
copy | Cho phép trích xuất văn bản và hình ảnh |
annotate | Cho phép thêm chú thích |
fill-forms | Cho phép điền trường form |
extract | Cho phép trích xuất trợ năng |
assemble | Cho phép chèn, xoay và xóa trang |
print-highres | Cho phép in độ phân giải cao |
Khi $permissions trống, mọi thao tác bị hạn chế (cần owner password cho bất kỳ action nào).
Kiến trúc bảo mật
TCPDF-Next thực thi chuẩn mã hóa PDF mạnh nhất:
- Algorithm: AES-256-CBC (AESV3), Revision 6, V5
- Key length: 256 bit
- Không legacy: RC4 và AES-128 bị loại bỏ có chủ đích
Không tương thích PDF/A
Mã hóa không được phép trong tài liệu tuân thủ PDF/A. Nếu bạn gọi setProtection() trên document đã bật chế độ PDF/A, PdfAException sẽ được throw.
Ví dụ đầy đủ
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->setTitle('Confidential Report')
->setAuthor('Security Team')
->setProtection(
permissions: ['print-highres', 'copy'],
userPass: 'open-me',
ownerPass: 'full-access-2026',
)
->addPage()
->setFont('Helvetica', 'B', 18)
->cell(0, 15, 'Confidential Report', newLine: true)
->setFont('Helvetica', '', 12)
->multiCell(0, 6, 'This document is protected with AES-256 encryption. '
. 'Readers can print and copy, but cannot modify or annotate.')
->save('confidential-report.pdf');