std.pdf.imagefile — Bilder aus Dateien ins PDF

import std.pdf.imagefile;

Eine einzige Funktion: ein Bild aus einer Datei laden und als XObject im Dokument anmelden. Das Dekodieren übernimmt std.image; die Unit setzt nur beides zusammen und kürzt dabei die Kanäle auf das, was PDF kennt.

std.pdf.image · std.pdf


Funktion

Signatur Rückgabe Bedeutung
PdfAddImageFile(doc: int64, path: pchar): int64 Bildindex ab 0, oder -1 Datei dekodieren und wie PdfAddImage anmelden. Der Index geht an PdfDrawImage
Kanäle im Bild Verhalten
1 (Graustufen) direkt übernommen
3 (RGB) direkt übernommen
4 (RGBA) auf RGB gekürzt — der Alphakanal wird verworfen
2 (Grau + Alpha) -1
 
Durchsichtige Bereiche werden deckend. PDF-DeviceRGB kennt keinen Alphakanal; der richtige Weg wäre eine SMask, und die gibt es hier noch nicht. Ein halb umgesetzter Alphakanal wäre schlechter als eine benannte Grenze — deshalb steht sie hier.

Grau + Alpha fällt aus demselben Grund auf -1 durch: den Alphakanal stillschweigend als Grauwert zu nehmen wäre schlimmer als eine Fehlermeldung.

Beispiel

import std.pdf;
import std.pdf.imagefile;
import std.io;
import std.alloc;

fn main(): int64 {
    var doc:  int64 := PdfNew();
    var page: int64 := PdfAddPage(doc, 595.0, 842.0);   // A4 in Punkten

    // 1. Rohe Pixel: 4x4 Graustufen-Verlauf
    var n:  int64 := 4 * 4;
    var px: int64 := alloc(n);
    var i:  int64 := 0;
    while (i < n) { poke8(px + i, (i * 16) & 255); i := i + 1; }
    var idx1: int64 := PdfAddImage(doc, px, 4, 4, 1);
    Print("PdfAddImage (grau) : "); PrintLn(IntToStr(idx1));

    // 2. Bild aus einer Datei
    var idx2: int64 := PdfAddImageFile(doc, "rot.png");
    Print("PdfAddImageFile    : "); PrintLn(IntToStr(idx2));

    // 3. Datei gibt es nicht
    var idx3: int64 := PdfAddImageFile(doc, "fehlt.png");
    Print("fehlende Datei     : "); PrintLn(IntToStr(idx3));

    if (idx1 >= 0) { PdfDrawImage(doc, page, idx1,  72.0, 700.0, 100.0, 100.0); }
    if (idx2 >= 0) { PdfDrawImage(doc, page, idx2, 200.0, 700.0, 100.0, 100.0); }
    PdfSave(doc, "bild.pdf");
    free(px, n);
    PrintLn("PDF geschrieben");
    return 0;
}

Mit einem 8×8-PNG als rot.png im Arbeitsverzeichnis:

PdfAddImage (grau) : 0
PdfAddImageFile    : 1
fehlende Datei     : -1
PDF geschrieben

Die Indizes werden fortlaufend vergeben (0, dann 1) — sie sind die Kennung für PdfDrawImage. Die fehlende Datei liefert -1, und das Programm zeichnet sie schlicht nicht: die Abfrage idx >= 0 vor dem Zeichnen ist der ganze Fehlerpfad.

Höchstens 16 Bilder je Dokument (PDF_INITIAL_IMAGE_CAP); darüber gibt PdfAddImage ebenfalls -1 zurück.


Letzte Aktualisierung: 2026-09-01 — Seite neu angelegt aus std/pdf/imagefile.lyx; Beispiel mit lyxc 1.1.16A gebaut, ausgeführt und das erzeugte PDF geprüft.