Ratakan bidang formulir menjadi konten halaman statis
Sekilas
Bagian berjudul “Sekilas”Gunakan resep ini untuk meratakan AcroForm interaktif. NextPDF menggambar nilai terkini setiap bidang ke dalam aliran konten halaman sebagai grafik biasa, lalu menghapus kamus AcroForm. Hasilnya adalah formulir non-interaktif: representasi statis dari bidang yang tampil sama di mana pun, bahkan pada pembaca tanpa dukungan formulir (ISO 32000-2 §12.7). Resep ini membangun formulir dari examples/30-form-fields.php, lalu memanggil flattenForms().
Instalasi
Bagian berjudul “Instalasi”composer require nextpdf/core:^3Gambaran konseptual
Bagian berjudul “Gambaran konseptual”Perataan “mencetak” setiap widget ke halamannya. Bidang teks menjadi teks BT … Tj … ET. Kotak centang dan tombol radio menjadi jalur yang digambar. Bidang pilihan merender item yang dipilih. Tombol tekan dirender sebagai kotak statis yang menyerupai tombol. Hal ini sesuai dengan model spesifikasi untuk tampilan yang didefinisikan secara statis ketika isi bidang sudah diketahui sebelumnya (ISO 32000-2 §12.7). Karena NextPDF menanamkan nilai tersebut ke dalam halaman, mekanisme NeedAppearances yang sudah usang tidak lagi diperlukan.
Profilnya adalah structural. Dokumen ini menyertakan trailer /ID, yang dinormalisasi oleh tahap pascaproses sebelum dua kali proses dibandingkan.
Permukaan API
Bagian berjudul “Permukaan API”NextPDF\Core\Concerns\HasFormFields::flattenForms(): static meratakan setiap bidang yang dibuat pada dokumen menjadi konten halaman statis dan menghapus AcroForm. Jika tidak ada bidang, metode ini tidak melakukan apa pun. Secara internal, metode ini mendelegasikan pekerjaan ke NextPDF\Form\FormFlattener.
Buat formulir dengan konstruktor bidang. Untuk langkah-langkah terperinci, lihat Membangun dan mengisi awal formulir PDF. Kemudian panggil flattenForms() sebelum save().
Contoh kode — Mulai cepat
Bagian berjudul “Contoh kode — Mulai cepat”<?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";Contoh kode — Produksi
Bagian berjudul “Contoh kode — Produksi”Contoh lengkap di bawah ini membangun formulir multibagian dari examples/30-form-fields.php. Contoh ini mengisi nilai awal formulir, meratakannya, lalu menulis ke NEXTPDF_COOKBOOK_OUTPUT untuk harness.
<?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";Keluaran yang diharapkan:
Wrote flattened registration formKeluaran tersebut menampilkan nilai yang sama, tanpa bidang interaktif. Pembaca tanpa dukungan formulir merendernya dengan cara yang sama.
Kasus tepi & jebakan
Bagian berjudul “Kasus tepi & jebakan”- Perataan tidak dapat dibatalkan. Setelah Anda memanggil
save(), bidang interaktif tersebut hilang. Simpan sumber yang belum diratakan jika Anda mungkin perlu mengedit nilainya nanti. - Urutan pemanggilan. Jalankan
flattenForms()setelah Anda membuat bidang dan sebelumsave(). Memanggilnya tanpa bidang tidak melakukan apa pun, sehingga aman. - Bidang tanda tangan tidak diratakan. Permukaan visual bidang
/Sigadalah tampilan yang dihasilkan dari Cryptographic Message Syntax (CMS) SignedData-nya, bukan nilai yang dapat dirender ulang. Merasterisasinya ulang akan menciptakan grafik “hantu” statis yang tidak lagi cocok dengan tanda tangan apa pun yang dapat diverifikasi. Karena itu, perata sengaja melewati bidang tanda tangan. Ratakan formulir sebelum Anda menandatangani, jangan pernah setelahnya. - Nilai kebenaran kotak centang. Kotak centang merender tanda centang ketika nilainya adalah
Yes/On/1/true. Nilai kosong atauOffhanya merender kotaknya saja. - Fon untuk teks yang diratakan. Teks yang diratakan menggunakan fon saat ini. Jika tidak ada fon yang diatur, sistem akan kembali ke Helvetica. Untuk nilai bidang berbahasa Tionghoa, Jepang, dan Korea (CJK) atau yang menggunakan fon khusus, atur fon yang diinginkan sebelum
flattenForms().
Kinerja
Bagian berjudul “Kinerja”Perataan berskala linear seiring jumlah bidang. Untuk setiap bidang, NextPDF menambahkan blok konten yang terbatas, lalu menghapus objek AcroForm. Formulir pada umumnya tetap jauh di bawah anggaran 1500 ms / 64 MB.
Catatan keamanan
Bagian berjudul “Catatan keamanan”Perataan membuat nilai bidang tidak dapat disunting di pembaca biasa. Ini adalah perubahan presentasi, bukan kontrol akses. Nilai tersebut tetap terlihat di konten halaman, dan alat teks apa pun dapat mengekstraknya. Jangan menganggap perataan sebagai redaksi atau sebagai perlindungan atas nilai sensitif. Untuk kerahasiaan, gunakan Enkripsi dengan izin. Baca juga peringatan di sana tentang ketergantungan pada kepatuhan pembaca, karena bit izin pun tidak menegakkan pembatasan baca. Jangan pernah meratakan dokumen yang telah ditandatangani. Ratakan terlebih dahulu, baru tanda tangani.
Kesesuaian
Bagian berjudul “Kesesuaian”| Pernyataan | Spesifikasi | Klausa | reference_id |
|---|---|---|---|
| Formulir yang diratakan adalah representasi non-interaktif (statis) dari bidang. | ISO 32000-2 | §12.7 | |
| Tampilan bidang didefinisikan secara statis ketika isinya sudah diketahui sebelumnya. | ISO 32000-2 | §12.7 | |
Tampilan yang ditanamkan membuat flag NeedAppearances yang sudah usang menjadi tidak diperlukan. | ISO 32000-2 | §12.7 |
NextPDF menghasilkan struktur statis seperti yang dijelaskan oleh klausa yang dikutip. NextPDF tidak mengklaim kesesuaian menyeluruh terhadap ISO 32000-2.