std.pdf

PDF-Bibliothek für vollständige PDF-Erstellung und -Analyse aus Lyx — ohne externe Abhängigkeiten. Erzeugt Standard-konforme PDFs (PDF 1.7) mit Text, Vektorgrafiken, Rasterbildern, TrueType-Schriften, Farbverläufen, Sonderfarben, Annotationen, Formularen, Lesezeichen, Metadaten, XMP-Streams und optionaler zlib-Kompression. Für Langzeitarchivierung: PDF/A-1b, -2b, -3b.

Einsatzbereiche: Berichte, Rechnungen, Zertifikate, Dokumentationen, Präsentationen, ZUGFeRD/Factur-X-Rechnungen, formularbasierte Dokumente.

std.pdf.graphics · std.pdf.builder · std.pdf.page


Architektur

Übersicht der internen Schichten und Abhängigkeiten:

┌──────────────────────────────────────────────────────────────────┐
│  std.pdf  (öffentliche API)                                      │
├──────────────┬──────────────┬──────────────┬─────────────────────┤
│ Seiten       │ Schriften     │ Farbe        │ Interaktiv          │
│ pdf.page     │ pdf.fonts     │ pdf.shading  │ pdf.annot           │
│ pdf.graphics │ pdf.ttfont    │ pdf.spot     │ pdf.forms           │
│ pdf.image    │               │              │ pdf.outline         │
│ pdf.xobject  │               │              │ pdf.namedest        │
├──────────────┴──────────────┴──────────────┴─────────────────────┤
│ Metadaten & Konformität                                          │
│ pdf.meta · pdf.xmp · pdf.pdfa · pdf.attach · pdf.layer          │
│ pdf.pagelabels · pdf.transition · pdf.viewprefs · pdf.reader     │
├──────────────────────────────────────────────────────────────────┤
│  pdf.builder  (XRef-Tabelle, Trailer, Objekt-Flattening)        │
├──────────────────────────────────────────────────────────────────┤
│  pdf.objects  (Byte-Buffer, Objekt-Nummerierung)                 │
│  pdf.compress (zlib/DEFLATE für Streams)                         │
└──────────────────────────────────────────────────────────────────┘


Einstieg: std.pdf

std.pdf stellt die vollständige öffentliche API bereit. Alle anderen PDF-Units werden automatisch als Abhängigkeiten gezogen — direkter Import der Untermodule ist nicht nötig.

unit main;
import std.io;
import std.string;
import std.pdf;

fn main(): int64 {
    var doc: int64 := PdfNew();

    // Metadaten
    PdfSetTitle(doc, "Rechnung 2026-001"c);
    PdfSetAuthor(doc, "Musterfirma GmbH"c);

    // Seite anlegen — A4 sind 595 x 842 Punkte
    var page: int64 := PdfAddPage(doc, 595.0, 842.0);

    // Text ausgeben
    PdfSetFont(doc, page, PDF_FONT_HELVETICA_BOLD, 18.0);
    PdfSetFillColor(doc, page, 0.0, 0.2, 0.6);
    PdfTextAt(doc, page, 72.0, 750.0, "Rechnung 2026-001"c);

    PdfSetFont(doc, page, PDF_FONT_HELVETICA, 11.0);
    PdfSetFillColor(doc, page, 0.0, 0.0, 0.0);
    PdfTextAt(doc, page, 72.0, 720.0, "Datum: 2026-05-22"c);

    // Trennlinie: Pfad aufbauen, dann zeichnen
    PdfSetStrokeColor(doc, page, 0.0, 0.0, 0.0);
    PdfSetLineWidth(doc, page, 1.0);
    PdfMoveTo(doc, page, 72.0, 710.0);
    PdfLineTo(doc, page, 540.0, 710.0);
    PdfStroke(doc, page);

    var rc: int64 := PdfSave(doc, "rechnung.pdf"c);
    Print("PdfSave rc = "); PrintLn(IntToStr(rc));
    PdfFree(doc);
    return 0;
}

PdfSave rc = 0

 
Es gibt keine Typen Pdf und PdfPage. Dokument und Seite sind int64-Handles. Ältere Fassungen dieser Seite zeigten Typnamen, die der Compiler nicht kennt.

Jede zeichnende Funktion nimmt doc und pagePdfSetFont(doc, page, …), nicht PdfSetFont(page, …). Ebenso gibt es weder PdfSetColor noch PdfDrawText oder PdfDrawLine; richtig sind PdfSetFillColor, PdfTextAt und der Dreischritt PdfMoveToPdfLineToPdfStroke.

Units im Überblick

Alle PDF-Units gruppiert nach Aufgabenbereich:

Kern-Infrastruktur

Unit Beschreibung
std.pdf Öffentlicher Einstiegspunkt: PdfNew, PdfSave, PdfAddPage
std.pdf.objects Primitive für PDF-Buffer: Byte-Schreiboperationen, Objekt-Nummerierung
std.pdf.builder Dokument-Builder: XRef-Tabelle, Trailer, Objekt-Flattening
std.pdf.compress zlib/DEFLATE-Kompression für PDF-Streams (intern genutzt)

Seiten & Inhalt

Unit Beschreibung
std.pdf.page Seitenverwaltung: PdfAddPage, PdfSetLandscape, Seitengrößen (A4, Letter, …)
std.pdf.graphics Content-Stream: Text ausgeben, Pfade zeichnen, Farben setzen, Transformationen, Clipping
std.pdf.image Rasterbilder: PdfAddImage (JPEG/RGB), PdfDrawImage mit Positionierung
std.pdf.xobject Form-XObjects: einmal zeichnen, beliebig oft auf beliebigen Seiten platzieren

Schriften

Funktionen für Schriftart-Verwaltung:

Unit Beschreibung
std.pdf.fonts Standard-14-Schriftarten (Helvetica, Times, Courier, …) und AFM-Metrik-Tabellen
std.pdf.ttfont TrueType-Schriften einbetten mit automatischem Unicode-Subsetting (Type0/CIDFontType2, UTF-8-Text)

Farbe

Unit Beschreibung
std.pdf.shading Farbverläufe: lineare (axiale) und radiale Gradient-Füllungen
std.pdf.spot Sonderfarben (Separation-Farbraum): PANTONE und andere benannte Farben mit CMYK-Alternativwert

Metadaten & Konformität

Unit Beschreibung
std.pdf.meta Dokument-Metadaten: Titel, Autor, Thema, Schlüsselwörter, Erstellungsdatum
std.pdf.xmp XMP-Metadaten-Stream im PDF-Katalog: PdfSetXMP, PdfGenerateXMP
std.pdf.pdfa PDF/A-Konformität (A-1b/A-2b/A-3b): OutputIntent, sRGB-ICC-Profil, pdfaid-XMP-Namespace
Unit Beschreibung
std.pdf.annot Annotationen: URI-Links, GoTo-Links, Text-Notizen
std.pdf.forms AcroForms: interaktive Felder — Text, Checkbox, Radio-Button, ComboBox; PdfFlattenForms
std.pdf.outline Outlines (Lesezeichen): PdfOutlineAdd, verschachtelte Hierarchie
std.pdf.namedest Benannte Sprungziele für interne Links und Outline-Verweise
std.pdf.pagelabels Seitenbeschriftung: römisch, dezimal, alphabetisch
std.pdf.transition Seitenübergänge für Präsentationen (Dissolve, Wipe, Push, Split)
std.pdf.viewprefs Viewer-Einstellungen: Toolbar, Vollbild, Öffnungs-Action

Sonstiges

Weitere Hilfsfunktionen:

Unit Beschreibung
std.pdf.reader PDF-Lesen: PdfOpen, Seitenanzahl, Metadaten-Extraktion
std.pdf.attach Eingebettete Dateianhänge: PdfAttachFile (Pflicht für PDF/A-3b)
std.pdf.layer Optional-Content-Groups (Layer/OCG): sicht- und ausblendbare Ebenen

Funktionen (std.pdf)

Signatur Sichtbarkeit Beschreibung
PdfNew(): Pdf pub Erstellt neues leeres PDF-Dokument
PdfAddPage(doc: Pdf): PdfPage pub Fügt neue A4-Seite hinzu
PdfAddPageSized(doc: Pdf, width: f64, height: f64): PdfPage pub Fügt Seite mit benutzerdefinierter Größe hinzu
PdfSave(doc: Pdf, path: pchar): bool pub Speichert Dokument als PDF-Datei
PdfFree(doc: Pdf): void pub Gibt Dokumentspeicher frei
 
PdfAddPageSized existiert nicht — der Aufruf meldet undefined symbol. Für abweichende Seitengrößen bis auf Weiteres PdfAddPage verwenden.
(Issue #1246)

Letzte Aktualisierung: 2026-08-09