VB-Tec.de Visual Basic - Technik, FAQ, Tricks, BeispieleHome / Workshops / PDF / Bilder Bilddateien in PDF einfügen |
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