Kontakt
DSVGO
Tipp: Die hier vorgestellten Code-Ausschnitte sind auch im Download enthalten.
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.
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
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
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