แฟลตเทนฟิลด์ของฟอร์มให้เป็นเนื้อหาหน้าแบบคงที่
ภาพรวมโดยย่อ
หัวข้อที่มีชื่อว่า “ภาพรวมโดยย่อ”ใช้สูตรนี้เพื่อแฟลตเทน AcroForm แบบโต้ตอบใน NextPDF โดย NextPDF จะวาดค่าปัจจุบันของแต่ละฟิลด์ลงในสตรีมเนื้อหาของหน้าเป็นกราฟิกปกติ แล้วจึงลบดิกชันนารี AcroForm ออก ผลลัพธ์ที่ได้คือฟอร์มแบบไม่โต้ตอบ ซึ่งเป็นภาพแทนแบบคงที่ของฟิลด์ที่แสดงผลเหมือนกันทุกที่ แม้เปิดด้วยโปรแกรมอ่านที่ไม่รองรับฟอร์ม (ISO 32000-2 §12.7) สูตรนี้สร้างฟอร์มจาก examples/30-form-fields.php แล้วจึงเรียก flattenForms()
การติดตั้ง
หัวข้อที่มีชื่อว่า “การติดตั้ง”composer require nextpdf/core:^3ภาพรวมเชิงแนวคิด
หัวข้อที่มีชื่อว่า “ภาพรวมเชิงแนวคิด”การแฟลตเทนคือการ “พิมพ์” แต่ละวิดเจ็ตลงบนหน้าที่วิดเจ็ตนั้นอยู่ ฟิลด์ข้อความจะกลายเป็นข้อความ BT … Tj … ET เช็กบ็อกซ์และปุ่มเรดิโอจะกลายเป็นพาธที่วาดขึ้น ฟิลด์ตัวเลือกจะเรนเดอร์รายการที่เลือกไว้ ปุ่มกดจะเรนเดอร์เป็นกล่องคล้ายปุ่มแบบคงที่ แนวทางนี้สอดคล้องกับโมเดลตามข้อกำหนดสำหรับลักษณะที่ปรากฏที่กำหนดแบบคงที่เมื่อทราบเนื้อหาของฟิลด์ล่วงหน้า (ISO 32000-2 §12.7) เนื่องจาก NextPDF ฝังค่าต่างๆ ลงในหน้าโดยตรง จึงไม่จำเป็นต้องใช้กลไก NeedAppearances ที่เลิกใช้แล้ว
โปรไฟล์นี้คือ structural เอกสารมีเทรลเลอร์ /ID ซึ่งขั้นตอนภายหลังจะปรับให้เป็นมาตรฐานก่อนเปรียบเทียบการรันสองครั้ง
พื้นผิว API
หัวข้อที่มีชื่อว่า “พื้นผิว API”NextPDF\Core\Concerns\HasFormFields::flattenForms(): static จะแฟลตเทนทุกฟิลด์ที่สร้างขึ้นในเอกสารให้เป็นเนื้อหาหน้าแบบคงที่และลบ AcroForm ออก ถ้าไม่มีฟิลด์อยู่ จะไม่มีการดำเนินการใดๆ ภายในเมธอดนี้จะมอบหมายงานให้ NextPDF\Form\FormFlattener
สร้างฟอร์มด้วยคอนสตรักเตอร์ของฟิลด์ สำหรับขั้นตอนโดยละเอียด โปรดดู สร้างและกรอกข้อมูลล่วงหน้าในฟอร์ม PDF จากนั้นเรียก flattenForms() ก่อน 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";ตัวอย่างโค้ด — สำหรับใช้งานจริง
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — สำหรับใช้งานจริง”ตัวอย่างฉบับเต็มด้านล่างสร้างฟอร์มหลายส่วนจาก examples/30-form-fields.php โดยกรอกข้อมูลล่วงหน้าในฟอร์ม แฟลตเทนฟอร์ม และเขียนไปยัง NEXTPDF_COOKBOOK_OUTPUT สำหรับฮาร์เนส
<?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";ผลลัพธ์ที่คาดหวัง:
Wrote flattened registration formผลลัพธ์จะแสดงค่าที่กรอกไว้ โดยไม่มีฟิลด์แบบโต้ตอบ โปรแกรมอ่านที่ไม่รองรับฟอร์มจะเรนเดอร์เอกสารในลักษณะเดียวกัน
กรณีขอบและข้อควรระวัง
หัวข้อที่มีชื่อว่า “กรณีขอบและข้อควรระวัง”- การแฟลตเทนย้อนกลับไม่ได้ หลังจากเรียก
save()แล้ว ฟิลด์แบบโต้ตอบจะหายไป ควรเก็บต้นฉบับที่ยังไม่แฟลตเทนไว้ หากอาจต้องแก้ไขค่าต่างๆ ในภายหลัง - ลำดับการเรียก เรียกใช้
flattenForms()หลังจากสร้างฟิลด์แล้วและก่อนsave()การเรียกใช้เมื่อไม่มีฟิลด์จะไม่ทำสิ่งใดและปลอดภัย - ฟิลด์ลายเซ็นจะไม่ถูกแฟลตเทน พื้นผิวที่มองเห็นได้ของฟิลด์
/Sigคือลักษณะที่ปรากฏที่สร้างจาก SignedData ของ Cryptographic Message Syntax (CMS) ไม่ใช่ค่าที่สามารถเรนเดอร์ใหม่ได้ การแรสเตอร์ไรซ์ใหม่จะสร้างกราฟิกแบบคงที่ที่เป็นเพียงภาพค้างและไม่ตรงกับลายเซ็นที่ตรวจสอบได้อีกต่อไป ด้วยเหตุนี้ ตัวแฟลตเทนจึงตั้งใจข้ามฟิลด์ลายเซ็น ให้แฟลตเทนฟอร์ม ก่อน ลงนาม ไม่ใช่หลังจากนั้น - ค่าที่ถือว่าเป็นจริงของเช็กบ็อกซ์ เช็กบ็อกซ์จะเรนเดอร์เครื่องหมายถูกเมื่อค่าของเช็กบ็อกซ์คือ
Yes/On/1/trueค่าที่ว่างหรือOffจะเรนเดอร์เฉพาะกล่องเท่านั้น - ฟอนต์สำหรับข้อความที่แฟลตเทน ข้อความที่แฟลตเทนจะใช้ฟอนต์ปัจจุบัน หากไม่ได้ตั้งค่าฟอนต์ไว้ จะใช้ Helvetica เป็นค่าสำรอง สำหรับค่าฟิลด์ภาษาจีน ญี่ปุ่น และเกาหลี (CJK) หรือค่าฟิลด์ที่ต้องใช้ฟอนต์กำหนดเอง ให้ตั้งค่าฟอนต์ที่ต้องการก่อน
flattenForms()
ประสิทธิภาพ
หัวข้อที่มีชื่อว่า “ประสิทธิภาพ”ปริมาณงานของการแฟลตเทนเพิ่มขึ้นเชิงเส้นตามจำนวนฟิลด์ สำหรับแต่ละฟิลด์ NextPDF จะเพิ่มบล็อกเนื้อหาที่จำกัดขอบเขตไว้ แล้วจึงลบออบเจกต์ AcroForm ออก ฟอร์มทั่วไปจะอยู่ภายในงบประมาณ 1500 ms / 64 MB ได้อย่างสบาย
หมายเหตุด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “หมายเหตุด้านความปลอดภัย”การแฟลตเทนทำให้แก้ไขค่าฟิลด์ในโปรแกรมอ่านทั่วไปไม่ได้ นี่เป็นการเปลี่ยนแปลงด้านการนำเสนอ ไม่ใช่การควบคุมการเข้าถึง ค่าต่างๆ ยังคงมองเห็นได้ในเนื้อหาของหน้า และเครื่องมือข้อความใดๆ ก็สามารถดึงค่าเหล่านั้นออกมาได้ อย่าถือว่าการแฟลตเทนเป็นการลบข้อมูล (redaction) หรือเป็นการปกป้องค่าที่ละเอียดอ่อน เพื่อรักษาความลับ ให้ใช้ เข้ารหัสลับพร้อมสิทธิ์ โปรดอ่านข้อควรระวังเรื่องการพึ่งพาความร่วมมือของโปรแกรมอ่านในหน้านั้นด้วย เพราะบิตสิทธิ์ก็ไม่ได้บังคับข้อจำกัดการอ่านเช่นกัน อย่าแฟลตเทนเอกสารที่ลงนามแล้วเด็ดขาด แฟลตเทนก่อน แล้วจึงลงนาม
ความสอดคล้องตามข้อกำหนด
หัวข้อที่มีชื่อว่า “ความสอดคล้องตามข้อกำหนด”| ข้อความระบุ | ข้อกำหนด | ข้อ | รหัสอ้างอิง (reference_id) |
|---|---|---|---|
| ฟอร์มที่แฟลตเทนแล้วเป็นภาพแทนของฟิลด์แบบไม่โต้ตอบ (คงที่) | ISO 32000-2 | §12.7 | |
| ลักษณะที่ปรากฏของฟิลด์กำหนดแบบคงที่เมื่อทราบเนื้อหาไว้ล่วงหน้า | ISO 32000-2 | §12.7 | |
ลักษณะที่ปรากฏซึ่งฝังไว้ทำให้ไม่จำเป็นต้องใช้แฟล็ก NeedAppearances ที่เลิกใช้แล้ว | ISO 32000-2 | §12.7 |
NextPDF สร้างโครงสร้างแบบคงที่ตามที่อธิบายไว้ในข้อที่อ้างอิง NextPDF ไม่ได้อ้างว่าเป็นไปตาม ISO 32000-2 อย่างครอบคลุมทั้งหมด