====== 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