Làm phẳng các trường biểu mẫu thành nội dung trang tĩnh
Tổng quan nhanh
Phần tiêu đề “Tổng quan nhanh”Dùng công thức này để làm phẳng một AcroForm tương tác. NextPDF vẽ giá trị hiện tại của từng trường vào luồng nội dung trang dưới dạng đồ họa thông thường, rồi xóa từ điển AcroForm. Kết quả là một biểu mẫu không tương tác: biểu diễn tĩnh của các trường, hiển thị nhất quán ở mọi nơi, kể cả trong trình đọc không hỗ trợ biểu mẫu (ISO 32000-2 §12.7). Công thức này tạo biểu mẫu từ examples/30-form-fields.php, rồi gọi flattenForms().
Cài đặt
Phần tiêu đề “Cài đặt”composer require nextpdf/core:^3Tổng quan khái niệm
Phần tiêu đề “Tổng quan khái niệm”Việc làm phẳng sẽ “in” từng widget lên trang của nó. Các trường văn bản trở thành văn bản BT … Tj … ET. Các hộp kiểm và nút radio trở thành các nét vẽ. Các trường lựa chọn kết xuất mục đang được chọn. Các nút bấm kết xuất thành khung tĩnh giống nút. Điều này phù hợp với mô hình trong đặc tả về diện mạo được định nghĩa tĩnh khi nội dung của trường đã biết trước (ISO 32000-2 §12.7). Vì NextPDF ghi cố định các giá trị lên trang, nên cơ chế NeedAppearances đã lỗi thời không còn cần thiết.
Hồ sơ là structural. Tài liệu có trailer /ID; bước hậu xử lý sẽ chuẩn hóa trailer này trước khi so sánh hai lần chạy.
Bề mặt API
Phần tiêu đề “Bề mặt API”NextPDF\Core\Concerns\HasFormFields::flattenForms(): static làm phẳng mọi trường được tạo trong tài liệu thành nội dung trang tĩnh và loại bỏ AcroForm. Khi không có trường nào, nó không làm gì cả. Bên trong, nó ủy thác công việc cho NextPDF\Form\FormFlattener.
Tạo biểu mẫu bằng các hàm khởi tạo trường. Để biết các bước chi tiết, hãy xem Dựng và điền sẵn một biểu mẫu PDF. Sau đó gọi flattenForms() trước save().
Mẫu mã — bắt đầu nhanh
Phần tiêu đề “Mẫu mã — bắt đầu nhanh”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();$doc->setTitle('Flattened Form');$doc->addPage();
$doc->textField(name: 'full_name', x: 20, y: 30, w: 90, h: 8, default: 'Ada Lovelace');$doc->checkBox(name: 'agree', x: 20, y: 45, size: 5, checked: true);
// Bake the field values into the page; the AcroForm is removed.$doc->flattenForms();
$doc->save(__DIR__ . '/flattened.pdf');echo "Wrote flattened.pdf (no interactive fields)\n";Mẫu mã — dùng trong sản xuất
Phần tiêu đề “Mẫu mã — dùng trong sản xuất”Ví dụ đầy đủ bên dưới tạo biểu mẫu nhiều phần từ examples/30-form-fields.php. Ví dụ này điền sẵn biểu mẫu, làm phẳng biểu mẫu, rồi ghi ra NEXTPDF_COOKBOOK_OUTPUT cho bộ kiểm thử.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();$doc->setTitle('Customer Registration — Flattened');$doc->addPage();
$doc->setFont('helvetica', 'B', 20);$doc->cell(0, 14, 'Customer Registration (read-only copy)', newLine: true);$doc->ln(4);
$leftMargin = 15.0;$fieldX = 70.0;$fieldW = 120.0;$fieldH = 8.0;$rowSpacing = 12.0;
$prefill = [ 'full_name' => 'Ada Lovelace', 'phone' => '+44 20 7946 0000', 'company' => 'Analytical Engines Ltd',];
$y = 40.0;$doc->setFont('helvetica', '', 10);foreach ($prefill as $name => $value) { $doc->setXY($leftMargin, $y); $doc->cell(50, $fieldH, ucwords(str_replace('_', ' ', $name)) . ':'); $doc->textField(name: $name, x: $fieldX, y: $y, w: $fieldW, h: $fieldH, default: $value); $y += $rowSpacing;}
$y += 6;$doc->setXY($leftMargin, $y);$doc->cell(0, 7, 'Newsletter');$doc->checkBox(name: 'newsletter', x: $leftMargin + 70, y: $y, size: 5, checked: true);
// Flatten: widgets become static page content; the AcroForm is dropped.$doc->flattenForms();
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT');$doc->save($out !== false ? $out : __DIR__ . '/registration-flattened.pdf');
echo "Wrote flattened registration form\n";Kết quả mong đợi:
Wrote flattened registration formKết quả hiển thị cùng các giá trị, nhưng không còn trường tương tác nào. Trình đọc không hỗ trợ biểu mẫu cũng kết xuất tài liệu theo cách đó.
Trường hợp biên & điểm cần lưu ý
Phần tiêu đề “Trường hợp biên & điểm cần lưu ý”- Việc làm phẳng là không thể đảo ngược. Sau khi bạn gọi
save(), các trường tương tác sẽ biến mất. Hãy giữ lại bản nguồn chưa làm phẳng nếu sau này bạn có thể cần chỉnh sửa các giá trị. - Thứ tự gọi. Hãy chạy
flattenForms()sau khi bạn tạo các trường và trướcsave(). Nếu gọi khi không có trường nào, hàm sẽ không làm gì cả; trường hợp đó an toàn. - Các trường chữ ký không được làm phẳng. Phần hiển thị của trường
/Siglà diện mạo được tạo từ Cryptographic Message Syntax (CMS) SignedData của nó, chứ không phải một giá trị có thể kết xuất lại. Việc raster hóa lại phần này sẽ tạo ra một đồ họa “ma” tĩnh không còn khớp với bất kỳ chữ ký có thể xác minh nào. Vì lý do đó, trình làm phẳng cố ý bỏ qua các trường chữ ký. Hãy làm phẳng biểu mẫu trước khi bạn ký, không bao giờ làm sau đó. - Tính đúng/sai của hộp kiểm. Hộp kiểm kết xuất dấu tích khi giá trị của nó là
Yes/On/1/true. Giá trị rỗng hoặcOffchỉ kết xuất phần khung. - Phông chữ cho văn bản đã làm phẳng. Văn bản đã làm phẳng dùng phông chữ hiện tại. Khi chưa đặt phông chữ nào, nó mặc định quay về Helvetica. Với các giá trị trường bằng tiếng Trung, tiếng Nhật và tiếng Hàn (CJK), hoặc với các giá trị cần phông chữ tùy chỉnh, hãy đặt phông chữ bạn muốn trước
flattenForms().
Hiệu năng
Phần tiêu đề “Hiệu năng”Việc làm phẳng có độ phức tạp tăng tuyến tính theo số lượng trường. Với mỗi trường, NextPDF nối thêm một khối nội dung có kích thước giới hạn, sau đó xóa đối tượng AcroForm. Các biểu mẫu thông thường nằm gọn trong ngân sách 1500 ms / 64 MB.
Ghi chú bảo mật
Phần tiêu đề “Ghi chú bảo mật”Việc làm phẳng khiến các giá trị trường không thể chỉnh sửa trong các trình đọc thông thường. Đây là thay đổi về cách trình bày, không phải cơ chế kiểm soát truy cập. Các giá trị vẫn hiển thị trong nội dung trang, và bất kỳ công cụ trích xuất văn bản nào cũng có thể lấy chúng. Đừng coi việc làm phẳng là biện pháp che giấu hay bảo vệ các giá trị nhạy cảm. Để bảo mật, hãy dùng Mã hóa kèm quyền hạn. Hãy đọc cả cảnh báo ở đó về tính phụ thuộc vào sự hợp tác của trình đọc, vì các bit quyền hạn cũng không buộc trình đọc phải thực thi hạn chế đọc. Đừng bao giờ làm phẳng tài liệu đã ký. Làm phẳng trước, rồi mới ký.
Tuân thủ
Phần tiêu đề “Tuân thủ”| Tuyên bố | Đặc tả | Điều khoản | reference_id |
|---|---|---|---|
| Biểu mẫu đã làm phẳng là biểu diễn không tương tác (tĩnh) của các trường. | ISO 32000-2 | §12.7 | |
| Diện mạo của trường được định nghĩa tĩnh khi nội dung của nó được biết trước. | ISO 32000-2 | §12.7 | |
Các diện mạo đã được ghi cố định khiến cờ NeedAppearances đã lỗi thời không còn cần thiết. | ISO 32000-2 | §12.7 |
NextPDF tạo ra cấu trúc tĩnh được mô tả trong các điều khoản được trích dẫn. NextPDF không tuyên bố tuân thủ toàn diện ISO 32000-2.