ข้ามไปยังเนื้อหา

แฟลตเทนฟิลด์ของฟอร์มให้เป็นเนื้อหาหน้าแบบคงที่

ใช้สูตรนี้เพื่อแฟลตเทน AcroForm แบบโต้ตอบใน NextPDF โดย NextPDF จะวาดค่าปัจจุบันของแต่ละฟิลด์ลงในสตรีมเนื้อหาของหน้าเป็นกราฟิกปกติ แล้วจึงลบดิกชันนารี AcroForm ออก ผลลัพธ์ที่ได้คือฟอร์มแบบไม่โต้ตอบ ซึ่งเป็นภาพแทนแบบคงที่ของฟิลด์ที่แสดงผลเหมือนกันทุกที่ แม้เปิดด้วยโปรแกรมอ่านที่ไม่รองรับฟอร์ม (ISO 32000-2 §12.7) สูตรนี้สร้างฟอร์มจาก examples/30-form-fields.php แล้วจึงเรียก flattenForms()

Terminal window
composer require nextpdf/core:^3

การแฟลตเทนคือการ “พิมพ์” แต่ละวิดเจ็ตลงบนหน้าที่วิดเจ็ตนั้นอยู่ ฟิลด์ข้อความจะกลายเป็นข้อความ BT … Tj … ET เช็กบ็อกซ์และปุ่มเรดิโอจะกลายเป็นพาธที่วาดขึ้น ฟิลด์ตัวเลือกจะเรนเดอร์รายการที่เลือกไว้ ปุ่มกดจะเรนเดอร์เป็นกล่องคล้ายปุ่มแบบคงที่ แนวทางนี้สอดคล้องกับโมเดลตามข้อกำหนดสำหรับลักษณะที่ปรากฏที่กำหนดแบบคงที่เมื่อทราบเนื้อหาของฟิลด์ล่วงหน้า (ISO 32000-2 §12.7) เนื่องจาก NextPDF ฝังค่าต่างๆ ลงในหน้าโดยตรง จึงไม่จำเป็นต้องใช้กลไก NeedAppearances ที่เลิกใช้แล้ว

โปรไฟล์นี้คือ structural เอกสารมีเทรลเลอร์ /ID ซึ่งขั้นตอนภายหลังจะปรับให้เป็นมาตรฐานก่อนเปรียบเทียบการรันสองครั้ง

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',
'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";

ผลลัพธ์ที่คาดหวัง:

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 อย่างครอบคลุมทั้งหมด