====== std.pdf.xmp ====== XMP-Metadaten-Stream (WP-PDF-26): Bettet einen ''`/Metadata`''-XMP-Stream in den PDF-Katalog ein. Entweder wird ein eigener XMP-XML-Blob übergeben (''PdfSetXMP'') oder die im Dokument gesetzten ''/Info''-Felder werden automatisch in einen wohlgeformten XMP-Packet konvertiert (''PdfGenerateXMP''). XMP ist Pflicht für PDF/A-Konformität. → [[lyx_-_programmiersprache:units:pdf:pdfa|std.pdf.pdfa]] · [[lyx_-_programmiersprache:units:pdf:meta|std.pdf.meta]] · [[lyx_-_programmiersprache:units|Standard Library]] ---- ===== Funktionen ===== ^ Signatur ^ Beschreibung ^ | ''PdfSetXMP(doc: int64, xmpXml: int64, len: int64): void'' | Speichert einen rohen XMP-XML-Blob (UTF-8, ohne NUL-Terminator). Die Bytes werden in einen internen Puffer kopiert. Ein vorheriger XMP-Blob wird ersetzt. | | ''PdfGenerateXMP(doc: int64): void'' | Liest ''Title'', ''Author'', ''Subject'', ''Keywords'', ''Creator'', ''Producer'' aus dem Dokument-Info-Block und erzeugt daraus automatisch ein wohlgeformtes XMP-Packet. Äquivalent zu ''PdfSetXMP'' mit dem generierten XML. Bei aktivem PDF/A-Modus werden ''pdfaid:part'' und ''pdfaid:conformance'' eingefügt. | ---- ===== PdfSetXMP — Parameter ===== ^ Parameter ^ Typ ^ Beschreibung ^ | ''doc'' | ''int64'' | Dokument-Handle (von ''PdfCreate'') | | ''xmpXml'' | ''int64'' | Pointer auf UTF-8-kodierten XMP-XML-Puffer | | ''len'' | ''int64'' | Länge des Puffers in Bytes (ohne NUL) | Der Puffer muss ein vollständiges XMP-Packet enthalten (''``''). ''PdfSetXMP'' kopiert die Daten — der ursprüngliche Puffer kann danach freigegeben werden. ---- ===== Generiertes XMP-Format ===== ''PdfGenerateXMP'' erzeugt folgendes Grundgerüst (Felder nur wenn belegt): 1 B XML-Sonderzeichen in Metadatenwerten (''&'', ''<'', ''>'', ''"'') werden automatisch escaped. ---- ===== Verwendung ===== ==== Automatisch aus /Info generieren ==== import std.pdf.builder; import std.pdf.meta; import std.pdf.xmp; fn SaveWithXMP(doc: int64, outPath: pchar): void { PdfSetTitle(doc, "Jahresbericht 2026"); PdfSetAuthor(doc, "Andreas Röne"); PdfSetSubject(doc, "Finanzübersicht Q1–Q4"); PdfSetKeywords(doc, "Bericht, Finanzen, 2026"); PdfSetCreator(doc, "SEOLizer PDF Engine"); PdfGenerateXMP(doc); // XMP aus /Info erzeugen PdfSave(doc, outPath); } ==== PDF/A mit XMP ==== import std.pdf.pdfa; import std.pdf.xmp; fn SavePdfa(doc: int64, path: pchar): void { PdfSetConformance(doc, PDF_CONFORMANCE_A2B); PdfGenerateXMP(doc); // pdfaid-Namespace wird automatisch eingefügt PdfSave(doc, path); } ==== Eigenes XMP übergeben ==== import std.pdf.xmp; import std.alloc; import std.string; fn SetCustomXMP(doc: int64): void { var xml: pchar := ""c ""c ""c ""c "Custom Title"c ""c ""c; PdfSetXMP(doc, xml as int64, StrLen(xml)); } ---- ===== Hinweise ===== * ''PdfGenerateXMP'' muss **nach** ''PdfSetTitle'' / ''PdfSetAuthor'' / … und **nach** ''PdfSetConformance'' aufgerufen werden — die Reihenfolge ist wichtig. * Wiederholte Aufrufe von ''PdfGenerateXMP'' ersetzen das vorherige XMP — sinnvoll, wenn Metadaten nach dem ersten Aufruf noch geändert werden. * Bei PDF/A-Konformität ist ein korrekter XMP-Stream mit ''pdfaid''-Namespace Pflicht. ''PdfGenerateXMP'' fügt ihn automatisch ein, wenn ''PdfSetConformance'' zuvor aufgerufen wurde. * Das Encoding des XMP-Packets ist immer UTF-8. Der XML-BOM (''EF BB BF'') wird von ''PdfGenerateXMP'' automatisch eingefügt. * ''PdfSetXMP'' kopiert den übergebenen Puffer — der Originalzeiger kann danach freigegeben werden. ---- ===== Verwandte Units ===== * ''[[lyx_-_programmiersprache:units:pdf:meta|std.pdf.meta]]'' — ''/Info''-Metadaten (Title, Author …) * ''[[lyx_-_programmiersprache:units:pdf:pdfa|std.pdf.pdfa]]'' — PDF/A-Konformität (setzt pdfaid-Namespace im XMP) * ''[[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]]'' — Dokumenterstellung (PdfCreate, PdfSave) Letzte Aktualisierung: 2026-06-05