Lewati ke konten

Ratakan bidang formulir menjadi konten halaman statis

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().

Terminal window
composer require nextpdf/core:^3

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.

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().

<?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 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',
'email' => '[email protected]',
'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 form

Keluaran tersebut menampilkan nilai yang sama, tanpa bidang interaktif. Pembaca tanpa dukungan formulir merendernya dengan cara yang sama.

  • 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 sebelum save(). Memanggilnya tanpa bidang tidak melakukan apa pun, sehingga aman.
  • Bidang tanda tangan tidak diratakan. Permukaan visual bidang /Sig adalah 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 atau Off hanya 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().

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.

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.

PernyataanSpesifikasiKlausareference_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.