====== std.pdf.xobject ====== PDF Form XObjects (WP-PDF-23): Wiederverwendbare Grafik-Blöcke, die einmal gezeichnet und dann beliebig oft auf beliebigen Seiten platziert werden können. Der XObject-Handle verhält sich wie ein negativer ''page''-Parameter — alle normalen Zeichenfunktionen (''PdfSetFont'', ''PdfTextAt'', ''PdfRect'', ''PdfMoveTo'' …) akzeptieren ihn direkt. → [[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]] · [[lyx_-_programmiersprache:units:pdf:graphics|std.pdf.graphics]] · [[lyx_-_programmiersprache:units|Standard Library]] ---- ===== Funktionen ===== ^ Signatur ^ Beschreibung ^ | ''PdfBeginXObject(doc: int64, w: f64, h: f64): int64'' | Startet einen neuen Form-XObject-Kontext mit BBox-Abmessungen ''w'' × ''h'' (PDF-Punkte). Gibt einen negativen Handle zurück (erster = −1, zweiter = −2, …), der als ''page''-Argument für alle Zeichenfunktionen verwendet wird. | | ''PdfEndXObject(doc: int64, xobj: int64): void'' | Schließt den XObject ab (aktuell No-Op; reserviert für künftige Aufräumlogik). | | ''PdfDrawXObject(doc: int64, page: int64, xobj: int64, x: f64, y: f64): void'' | Platziert den XObject ''xobj'' auf Seite ''page'' an Position (''x'', ''y'') in nativer Größe (1:1 gemäß BBox). | | ''PdfDrawXObjectScaled(doc: int64, page: int64, xobj: int64, x100: int64, y100: int64, scale100: int64): void'' | Platziert den XObject mit einheitlichem Skalierungsfaktor. ''scale100'': 100 = 100 % (nativ), 200 = doppelte Größe, 50 = halbe Größe. Koordinaten in ×100-Einheiten. | ---- ===== Handle-Konvention ===== ''PdfBeginXObject'' gibt einen **negativen** ''int64''-Handle zurück: ^ Index ^ Handle ^ | 0 (erster XObject) | −1 | | 1 (zweiter) | −2 | | n | −(n+1) | Dieser Handle wird direkt als ''page''-Argument an alle Zeichenfunktionen übergeben. ''PdfDrawXObject'' und ''PdfDrawXObjectScaled'' validieren ''xobj >= 0'' als Fehler (Schutz gegen versehentliche Verwechslung mit einer echten Seite). ---- ===== Verwendung ===== ==== Wiederverwendbares Logo ==== import std.pdf.xobject; import std.pdf.graphics; import std.pdf.fonts; fn CreateLogo(doc: int64): int64 { var xobj := PdfBeginXObject(doc, 100.0, 50.0); // Roter Hintergrund PdfSetFillColor(doc, xobj, 10000, 0, 0); PdfRect(doc, xobj, 0.0, 0.0, 100.0, 50.0); PdfFill(doc, xobj); // Weißer Text PdfSetFont(doc, xobj, 0, 14.0); PdfSetTextColor(doc, xobj, 10000, 10000, 10000); PdfTextAt(doc, xobj, 10.0, 18.0, "MyBrand"); PdfEndXObject(doc, xobj); return xobj; } fn AddLogoToAllPages(doc: int64, logo: int64, pageCount: int64): void { var i: int64 := 0; while (i < pageCount) { // Logo oben rechts auf jeder Seite (A4: 595 pt breit) PdfDrawXObject(doc, i, logo, 480.0, 800.0); i := i + 1; } } ==== Skalierter XObject ==== import std.pdf.xobject; fn PlaceLogoScaled(doc: int64, page: int64, logo: int64): void { // 50 % Größe, Position (x=5000, y=75000) in ×100-Einheiten PdfDrawXObjectScaled(doc, page, logo, 5000, 75000, 50); // 150 % Größe, Position (x=10000, y=70000) PdfDrawXObjectScaled(doc, page, logo, 10000, 70000, 150); } ==== Kopf- und Fußzeile als XObject ==== import std.pdf.xobject; import std.pdf.fonts; fn MakeHeader(doc: int64, title: pchar): int64 { var xobj := PdfBeginXObject(doc, 595.0, 30.0); PdfSetFont(doc, xobj, 0, 10.0); PdfTextAt(doc, xobj, 10.0, 10.0, title); PdfEndXObject(doc, xobj); return xobj; } fn ApplyHeader(doc: int64, header: int64, pages: int64): void { var i: int64 := 0; while (i < pages) { PdfDrawXObject(doc, i, header, 0.0, 812.0); // A4: 842 - 30 = 812 pt i := i + 1; } } ---- ===== Hinweise ===== * Der XObject-Handle ist ein **negativer Wert** — niemals als normalen Seitenindex verwenden. * Alle Zeichenoperationen auf einem XObject-Handle werden in den XObject-Content-Stream geschrieben, nicht in eine Seite. * ''PdfDrawXObject'' verwendet ''scale100 = 100'' (nativ). Für Skalierung ''PdfDrawXObjectScaled'' mit ×100-Koordinaten nutzen. * XObjects werden im PDF einmalig eingebettet und per Referenz gezogen — wiederholtes Platzieren erhöht die Dateigröße kaum. * ''PdfEndXObject'' ist aktuell ein No-Op, sollte aber immer aufgerufen werden (Kompatibilität mit zukünftigen Versionen). ---- ===== Verwandte Units ===== * ''[[lyx_-_programmiersprache:units:pdf:graphics|std.pdf.graphics]]'' — Pfade, Farben, Clipping * ''[[lyx_-_programmiersprache:units:pdf:fonts|std.pdf.fonts]]'' — Schriftauswahl * ''[[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]]'' — Dokument- und Seitenverwaltung Letzte Aktualisierung: 2026-06-05