Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Workshops / PDF / Bilder

Bilddateien in PDF einfügen

Bilder in PDF

Tipp: Die hier vorgestellten Code-Ausschnitte sind auch im Download enthalten.

Motivation

PDF bietet von Haus aus schon relativ mächtige Zeichenoperationen (vgl. auch meine beiden vorigen PDF-Artikel). Doch manchmal müssen trotzdem binäre Bilddateien eingefügt werden, etwa bei der Darstellung von Logos (Stichwort "Corporate Identity"), Bildschirmkopien/Hardcopies und Fotos.

Beispiel

Der folgende Code-Ausschnitt fügt ein 96x60 Points großes Bild (hier im GIF-Format) zweimal am Ende einer Seite ein. Das erste Bild wird linsbündig in Farbe ausgegeben; das zweite wird rechtsbündig als Graubild ausgegeben und zusätzlich (durch Angabe einer negativen Breite) horizontal gespiegelt:

y = pdf.Height - pdf.TopMargin - 60 'untenbündig
x = pdf.LeftMargin                  'linksbündig
pdf.DrawPicture x, y, 96, 60, App.Path & "\test.gif"
x = pdf.Width - pdf.LeftMargin - 96 'rechtsbündig
pdf.DrawPicture x, y, -96, 60, App.Path & "\test.gif", True

Code / Quelltext

Bilddaten in ein Byte-Array schreiben

Der folgende Code-Ausschnitt benutzt (aus Performance-Gründen) die API-Funktion GetPixel, um jeden einzelnen Pixel als Farbcode auszulesen. Dieser wird in seine Farbanteile aufgesplittet (vgl. auch "VB-Farbenlehre"). Soll das Bild in Grau dargestellt werden, so wird aus den drei Farbanteilen ein Helligkeitswert berechnet:

hDC = CreateCompatibleDC(0)
hTmp = SelectObject(hDC, hPic)
For y = 0 To bmp.bmHeight - 1
  For x = 0 To bmp.bmWidth - 1

    col = GetPixel(hDC, x, y)
    r = col And &HFF&
    g = (col And &HFF00&) \ &H100&
    b = (col And &HFF0000) \ &H10000

    If ForceGrey Then
      i = i + 1
      Bytes(i) = (77 * r + 151 * g + 28 * b + 127) \ 256
    Else
      Bytes(i + 1) = r
      Bytes(i + 2) = g
      Bytes(i + 3) = b
      i = i + 3
    End If

  Next x
Next y
SelectObject hDC, hTmp
DeleteDC hDC

(Komprimierten) Bytestream schreiben

Das erzeugte Byte-Array wird versuchsweise RLE-komprimiert. Nur wenn dabei tatsächlich Speicherplatz gespart werden kann, wird in dem PDF-Dokument die komprimierte Version des Bildes gespeichert (sonst eben unkomprimiert):

RLE = RLEEncodeBytes(Bytes)
If UBound(RLE) + 7 < UBound(Bytes) Then
  StreamDrawing "/F /RL"
  StreamDrawing "ID " & StrConv(RLE, vbUnicode) & Chr$(128)
Else
  StreamDrawing "ID " & StrConv(Bytes, vbUnicode) & ">"
End If

Man beachte, dass je nach "Speichermodus" ein anderes Zeichen als Ende-Markierung für den Datenstrom verwendet wird.

© Jost Schwider, 22.05.2005-22.05.2005 - http://vb-tec.de/pdf-picture.htm