Ga naar inhoud

Formuliervelden afvlakken tot statische pagina-inhoud

Gebruik dit recipe om een interactief AcroForm af te vlakken. NextPDF tekent de huidige waarde van elk veld als gewone grafische elementen in de content stream van de pagina en verwijdert daarna de AcroForm-dictionary. Het resultaat is een niet-interactief formulier: een statische weergave van de velden die er overal hetzelfde uitziet, zelfs in een reader zonder formulierondersteuning (ISO 32000-2 §12.7). In dit recipe wordt het formulier opgebouwd uit examples/30-form-fields.php en wordt daarna flattenForms() aangeroepen.

Terminal window
composer require nextpdf/core:^3

Bij het afvlakken wordt elke widget op de bijbehorende pagina „afgedrukt”. Tekstvelden worden BT … Tj … ET-tekst. Selectievakjes en keuzerondjes worden getekende paden. Keuzevelden tonen het geselecteerde item. Drukknoppen verschijnen als een statisch, knopachtig kader. Dit komt overeen met het model uit de specificatie voor een statisch gedefinieerde weergave wanneer de inhoud van het veld vooraf bekend is (ISO 32000-2 §12.7). Omdat NextPDF de waarden rechtstreeks in de pagina opneemt, is het verouderde NeedAppearances-mechanisme niet nodig.

Het profiel is structural. Het document bevat een trailer-/ID, die door de post-pass wordt genormaliseerd voordat twee runs worden vergeleken.

NextPDF\Core\Concerns\HasFormFields::flattenForms(): static vlakt elk veld dat in het document is aangemaakt af tot statische pagina-inhoud en verwijdert het AcroForm. Wanneer er geen velden aanwezig zijn, doet de methode niets. Intern delegeert de methode het werk aan NextPDF\Form\FormFlattener.

Bouw het formulier op met de veldconstructors. Raadpleeg voor gedetailleerde stappen Een PDF-formulier bouwen en vooraf invullen. Roep daarna flattenForms() aan vóór 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";

Het volledige voorbeeld hieronder bouwt het formulier met meerdere secties op uit examples/30-form-fields.php. Het vult het formulier vooraf in, vlakt het af en schrijft het resultaat voor de harness naar 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";

Verwachte uitvoer:

Wrote flattened registration form

De uitvoer bevat dezelfde waarden, maar geen interactieve velden. Een reader zonder formulierondersteuning geeft het document op dezelfde manier weer.

  • Afvlakken is onomkeerbaar. Zodra je save() aanroept, zijn de interactieve velden weg. Bewaar de niet-afgevlakte bron als je de waarden later mogelijk nog moet bewerken.
  • Aanroepvolgorde. Voer flattenForms() uit nadat je de velden hebt aangemaakt en vóór save(). Aanroepen zonder velden doet niets, wat veilig is.
  • Handtekeningvelden worden niet afgevlakt. Het visuele oppervlak van een /Sig-veld is de weergave die wordt geproduceerd uit de bijbehorende Cryptographic Message Syntax (CMS) SignedData, geen opnieuw renderbare waarde. Opnieuw rasteren zou een statische „spook”-afbeelding opleveren die niet langer overeenkomt met een verifieerbare handtekening. Om die reden slaat de flattener handtekeningvelden bewust over. Vlak het formulier af voordat je ondertekent, nooit erna.
  • Waarheidswaarde van selectievakjes. Een selectievakje toont zijn vinkje wanneer de waarde Yes/On/1/true is. Bij een lege of Off-waarde wordt alleen het vakje weergegeven.
  • Lettertype voor afgevlakte tekst. Afgevlakte tekst gebruikt het huidige lettertype. Als er geen lettertype is ingesteld, valt het terug op Helvetica. Stel voor Chinese, Japanse en Koreaanse (CJK) veldwaarden of veldwaarden met een aangepast lettertype vóór flattenForms() het gewenste lettertype in.

Het afvlakken schaalt lineair met het aantal velden. Voor elk veld voegt NextPDF een begrensd inhoudsblok toe en verwijdert daarna het AcroForm-object. Typische formulieren blijven ruim binnen het budget van 1500 ms / 64 MB.

Door het afvlakken worden veldwaarden in gangbare readers niet-bewerkbaar. Dit is een wijziging in de presentatie, geen toegangsbeheer. De waarden blijven zichtbaar in de pagina-inhoud, en elke tekstextractietool kan ze uitlezen. Beschouw afvlakken niet als redactie of als bescherming van gevoelige waarden. Gebruik voor vertrouwelijkheid Versleutelen met permissies. Lees ook daar de kanttekening over de medewerking van de reader, want permissiebits dwingen evenmin leesbeperkingen af. Vlak nooit een ondertekend document af. Vlak eerst af, onderteken daarna.

BeweringSpecificatieClausulereference_id
Een afgevlakt formulier is een niet-interactieve (statische) weergave van de velden.ISO 32000-2§12.7
De weergave van een veld is statisch gedefinieerd wanneer de inhoud ervan vooraf bekend is.ISO 32000-2§12.7
Vast ingebouwde weergaven maken de verouderde NeedAppearances-vlag overbodig.ISO 32000-2§12.7

NextPDF produceert de statische structuur die in de aangehaalde clausules wordt beschreven. Het claimt geen algehele ISO 32000-2-conformiteit.