İçeriğe geç

Form alanlarını statik sayfa içeriğine düzleştirme

Bu tarifi, etkileşimli bir AcroForm’u düzleştirmek için kullanın. NextPDF, her alanın geçerli değerini sayfa içerik akışına sıradan grafikler olarak çizer ve ardından AcroForm sözlüğünü kaldırır. Sonuç, form desteği olmayan okuyucularda bile her yerde aynı görünen, alanların statik temsili olan etkileşimli olmayan bir formdur (ISO 32000-2 §12.7). Tarif, formu examples/30-form-fields.php dosyasından oluşturur ve ardından flattenForms() çağrısını yapar.

Terminal window
composer require nextpdf/core:^3

Düzleştirme, her bileşeni bulunduğu sayfaya “basar”. Metin alanları BT … Tj … ET metnine dönüşür. Onay kutuları ve radyo düğmeleri çizilmiş yollara dönüşür. Seçim alanları, seçili öğelerini işler. İtme düğmeleri, düğmeye benzer statik bir kutu olarak işlenir. Bu davranış, alan içeriği önceden bilindiğinde statik olarak tanımlanmış görünüm için belirtilen spesifikasyon modeliyle eşleşir (ISO 32000-2 §12.7). NextPDF değerleri sayfaya gömdüğü için kullanımdan kaldırılan NeedAppearances mekanizmasına gerek yoktur.

Profil structural olarak ayarlanmıştır. Belge, bir fragman (trailer) /ID değeri taşır; bu değer, iki çalıştırma karşılaştırılmadan önce son geçişte normalleştirilir.

NextPDF\Core\Concerns\HasFormFields::flattenForms(): static, belgede oluşturulan her alanı statik sayfa içeriğine düzleştirir ve AcroForm’u kaldırır. Hiç alan yoksa, hiçbir şey yapmaz. Dahili olarak işi NextPDF\Form\FormFlattener sınıfına devreder.

Formu alan oluşturucularıyla kurun. Ayrıntılı adımlar için bkz. PDF formu oluşturma ve önceden doldurma. Ardından flattenForms() işlevini save() çağrısından önce çağırın.

<?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";

Aşağıdaki tam örnek, çok bölümlü formu examples/30-form-fields.php dosyasından oluşturur. Formu önceden doldurur, düzleştirir ve test koşumu için NEXTPDF_COOKBOOK_OUTPUT değerine yazar.

<?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";

Beklenen çıktı:

Wrote flattened registration form

Çıktı, etkileşimli alanlar olmadan aynı değerleri gösterir. Form desteği olmayan bir okuyucu da aynı şekilde işler.

  • Düzleştirme geri alınamaz. save() çağrısını yaptıktan sonra etkileşimli alanlar kaybolur. Daha sonra değerleri düzenlemeniz gerekebilirse, düzleştirilmemiş kaynağı saklayın.
  • Çağrı sırası. flattenForms() işlevini, alanları oluşturduktan sonra ve save() öncesinde çalıştırın. Alan yokken çağrılması hiçbir işlem yapmaz; bu güvenlidir.
  • İmza alanları düzleştirilmez. Bir /Sig alanının görsel yüzeyi, yeniden işlenebilir bir değer değil, kendi Cryptographic Message Syntax (CMS) SignedData yapısından üretilen bir görünümdür. Bu yüzeyi yeniden rasterleştirmek, artık doğrulanabilir hiçbir imzayla eşleşmeyen statik bir “hayalet” grafik oluşturur. Bu nedenle düzleştirici, imza alanlarını bilerek atlar. Formu imzalamadan önce düzleştirin, asla sonra değil.
  • Onay kutusu doğruluk değeri. Bir onay kutusu, değeri Yes/On/1/true olduğunda onay işaretini işler. Boş değer veya Off değeri yalnızca kutuyu işler.
  • Düzleştirilmiş metnin yazı tipi. Düzleştirilmiş metin, geçerli yazı tipini kullanır. Yazı tipi ayarlanmamışsa Helvetica’ya geri döner. Çince, Japonca ve Korece (CJK) veya özel yazı tipi içeren alan değerleri için istediğiniz yazı tipini flattenForms() öncesinde ayarlayın.

Düzleştirme, alan sayısıyla doğrusal olarak ölçeklenir. Her alan için NextPDF, sınırlandırılmış bir içerik bloğu ekler ve ardından AcroForm nesnesini kaldırır. Tipik formlar, 1500 ms / 64 MB bütçesinin oldukça altında kalır.

Düzleştirme, alan değerlerini normal okuyucularda düzenlenemez hale getirir. Bu, erişim denetimi değil, bir sunum değişikliğidir. Değerler sayfa içeriğinde görünür kalır ve herhangi bir metin aracı bunları çıkarabilir. Düzleştirmeyi, bir karartma (redaction) veya hassas değerler için koruma yöntemi olarak görmeyin. Gizlilik için İzinlerle şifreleme sayfasını kullanın. İzin bitleri de okuma kısıtlamalarını zorunlu kılmadığından, bu sayfadaki okuyucu iş birliğine dayalı uyarıyı da okuyun. İmzalanmış bir belgeyi asla düzleştirmeyin. Önce düzleştirin, sonra imzalayın.

İfadeSpesifikasyonMaddereference_id
Düzleştirilmiş bir form, alanların etkileşimli olmayan (statik) bir temsilidir.ISO 32000-2§12.7
Alan görünümü, içeriği önceden bilindiğinde statik olarak tanımlanır.ISO 32000-2§12.7
Gömülü görünümler, kullanımdan kaldırılan NeedAppearances bayrağını gereksiz kılar.ISO 32000-2§12.7

NextPDF, alıntılanan maddelerde açıklanan statik yapıyı üretir. Genel bir ISO 32000-2 uygunluğu iddiasında bulunmaz.