====== std.pdf.forms ====== PDF AcroForms (WP-PDF-18): Interaktive Formularfelder — Textfelder, Checkboxen, Radio-Buttons und Dropdown-Listen (ComboBox). Alle Felder werden als Widget-Annotations mit Appearance-Streams in das AcroForm-Dictionary eingebettet. Optional können alle Felder mit ''PdfFlattenForms'' in statischen Seiteninhalt umgewandelt werden. → [[lyx_-_programmiersprache:units:pdf:annot|std.pdf.annot]] · [[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]] · [[lyx_-_programmiersprache:units|Standard Library]] ---- ===== Koordinaten-Packing ===== Position und Größe werden als gepackte ''int64''-Werte übergeben (gleiche Konvention wie ''[[lyx_-_programmiersprache:units:pdf:shading|std.pdf.shading]]''): * ''pos = PdfPackCoords(x100, y100)'' — linke untere Ecke * ''size = PdfPackCoords(w100, h100)'' — Breite × Höhe * ''size100'' — bei quadratischen Feldern (Checkbox, Radio) ein einzelner Seitenlängenwert ×100 Alle Werte sind in **×100-Einheiten** (100 = 1 PDF-Punkt). ---- ===== Funktionen ===== ==== Felder hinzufügen ==== ^ Signatur ^ Rückgabe ^ Beschreibung ^ | ''PdfAddTextField(doc, page, pos, size, name: pchar, defaultValue: pchar): int64'' | ''fieldId'' / −1 | Einzeiliges bearbeitbares Textfeld. ''name'': Feldname (/T). ''defaultValue'': Initialwert (/V), ''0'' für leer. | | ''PdfAddCheckbox(doc, page, pos, size100, name: pchar, checked: int64): int64'' | ''fieldId'' / −1 | Quadratische Checkbox. ''size100'': Seitenlänge ×100. ''checked'': 1 = anfangs aktiviert, 0 = deaktiviert. | | ''PdfAddRadioButton(doc, page, pos, size100, groupName: pchar, value: pchar): int64'' | ''fieldId'' / −1 | Radio-Button in einer benannten Gruppe. Gruppen werden bei erstmaliger Nennung automatisch angelegt. ''value'': Wert-String dieses Buttons (z. B. ''„Option1"''). | | ''PdfAddComboBox(doc, page, pos, size, name: pchar): int64'' | ''fieldId'' / −1 | Dropdown-Liste. Items separat mit ''PdfComboAddItem'' hinzufügen. | ==== Items und Aktionen ==== ^ Signatur ^ Beschreibung ^ | ''PdfComboAddItem(doc: int64, fieldId: int64, item: pchar): void'' | Hängt einen Eintrag an die Option-Liste einer ComboBox. Mehrfachaufruf für mehrere Einträge. | | ''PdfFlattenForms(doc: int64): void'' | Wandelt alle Formularfelder in statischen Seiteninhalt um. Das PDF wird danach nicht mehr interaktiv — Viewer zeigen die Felder als gezeichnetes Bild. Nützlich für Archivierung oder Druck. | ---- ===== Vollständige Signaturen ===== pub fn PdfAddTextField(doc: int64, page: int64, pos: int64, size: int64, name: pchar, defaultValue: pchar): int64 pub fn PdfAddCheckbox(doc: int64, page: int64, pos: int64, size100: int64, name: pchar, checked: int64): int64 pub fn PdfAddRadioButton(doc: int64, page: int64, pos: int64, size100: int64, groupName: pchar, value: pchar): int64 pub fn PdfAddComboBox(doc: int64, page: int64, pos: int64, size: int64, name: pchar): int64 pub fn PdfComboAddItem(doc: int64, fieldId: int64, item: pchar): void pub fn PdfFlattenForms(doc: int64): void ---- ===== Verwendung ===== ==== Einfaches Formular ==== import std.pdf.forms; import std.pdf.shading; // für PdfPackCoords fn AddContactForm(doc: int64, page: int64): void { // Textfeld "Name" — Position (50, 700), Größe 200×20 (×100: 5000×2000) var nameField := PdfAddTextField(doc, page, PdfPackCoords(5000, 70000), PdfPackCoords(20000, 2000), "name", "Ihr Name"); // Textfeld "E-Mail" var mailField := PdfAddTextField(doc, page, PdfPackCoords(5000, 67000), PdfPackCoords(20000, 2000), "email", ""); // Checkbox "Newsletter" var cbNews := PdfAddCheckbox(doc, page, PdfPackCoords(5000, 64000), 1500, // 15 × 15 Punkte "newsletter", 1); // anfangs aktiviert } ==== Radio-Gruppe ==== import std.pdf.forms; import std.pdf.shading; fn AddRadioGroup(doc: int64, page: int64): void { // Drei Radio-Buttons in Gruppe "priority" PdfAddRadioButton(doc, page, PdfPackCoords(5000, 70000), 1500, "priority", "high"); PdfAddRadioButton(doc, page, PdfPackCoords(5000, 67500), 1500, "priority", "medium"); PdfAddRadioButton(doc, page, PdfPackCoords(5000, 65000), 1500, "priority", "low"); } ==== ComboBox mit Einträgen ==== import std.pdf.forms; import std.pdf.shading; fn AddCountryDropdown(doc: int64, page: int64): void { var combo := PdfAddComboBox(doc, page, PdfPackCoords(5000, 70000), PdfPackCoords(15000, 2000), "country"); PdfComboAddItem(doc, combo, "Deutschland"); PdfComboAddItem(doc, combo, "Österreich"); PdfComboAddItem(doc, combo, "Schweiz"); PdfComboAddItem(doc, combo, "Liechtenstein"); } ==== Formular flattening für Archivierung ==== import std.pdf.forms; fn SaveFlattened(doc: int64, path: pchar): void { // Alle Felder zeichnen und AcroForm entfernen PdfFlattenForms(doc); PdfSave(doc, path); } ---- ===== Hinweise ===== * ''fieldId'' ist der nullbasierte Index des Feldes im internen Feld-Array — stabil für ''PdfComboAddItem''. * ''PdfAddRadioButton'': Gruppen werden automatisch bei erstmaliger Nennung von ''groupName'' angelegt. Alle Buttons derselben Gruppe teilen sich einen übergeordneten /Btn-Parent-Widget. * ''PdfFlattenForms'' setzt intern das ''FORMFLAT''-Flag: ''PdfSave'' überspringt dann das ''/AcroForm''-Dictionary und die Widget-Annotations. * Das AcroForm-Objekt-ID wird beim ersten ''PdfAddTextField''/''PdfAddCheckbox''-Aufruf lazy angelegt — kein Overhead wenn keine Felder verwendet werden. * Koordinatensystem: Ursprung (0, 0) unten links, Y wächst nach oben (PDF-Standard). A4: 595 × 842 Punkte, also ×100: 59 500 × 84 200. ---- ===== Verwandte Units ===== * ''[[lyx_-_programmiersprache:units:pdf:annot|std.pdf.annot]]'' — Hyperlink- und sonstige Annotations * ''[[lyx_-_programmiersprache:units:pdf:shading|std.pdf.shading]]'' — ''PdfPackCoords'' / ''PdfPackColor'' * ''[[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]]'' — Dokumenterstellung (PdfCreate, PdfSave) Letzte Aktualisierung: 2026-06-05