Ich würde gerne in meine PDF 2 Bilder einbetten, die im Internet stehen.
z.B.
https://xojo.com/images/raspberryPi-Logo.png
und
https://xojo.com/images/code.png
Ich würde normal das Bild jeweils herunterladen und übergeben. Dabei habe ich nur das Problem, dass ich immer wieder einen Absturz mit NIL bekomme. Da wohl das Bild noch nicht fertig geladen ist, wenn ich zum nächsten Befehl übergehe. Gibt es hier ein typisches Best-Practice?
Wie ladet ihr Bilder?
HTTPSocket? CURL Plugin? Shell Befehl?
Idealerweise für DynaPDF liegen die Bilder in einem Ordner. Dann können wir nur die laden, die wir gerade brauchen und das spart Arbeitsspeicher.
Gruß
Christian
Die Bilder liegen in einem “SAP Archivserver”, riesen komplexes System. Letztendlich stellt das Ding aber eine Art Webserver bereit, so dass man einfach nur URLs abfragen muss.
Sieht nicht anders aus wie z.B. diese URL: https://xojo.com/images/raspberryPi-Logo.png
Beispiel, wie ich es aktuell mache:
dim URL_Ansicht1 As string
URL_Ansicht1 = "http://url/Artikel_" + "4060000414_702_1_klein" + ".png" // "4060000414_702_1_klein" ist normal eine Variable die dynamisch berechnet wird
DIM Socket_BildDa as new HTTPSecureSocket
DIM temp_Ansicht1 as string = Socket_BildDa.get(URL_Ansicht1,0)
// Wenn das Bild wirklich existiert, dann bekomme ich eine 200 vom Server zurück:
if str(Socket_BildDa.HTTPStatusCode) = "200" then
dim ImageView_Zwischenspeicher As New WebImageView
ImageView_Zwischenspeicher.URL = URL_Ansicht1
call pdf.InsertPicture(ImageView_Zwischenspeicher.Picture, 20,20,50,50) // ich weiss, dass das Bild immer als 50x50 Pixel geliefert wird, daher hardcodiert
else
dim Artikelfoto as Picture = Bild_Artikel_fehlt_klein // hier greife ich auf ein lokales zurück, dass klappt
call pdf.InsertPicture(Artikelfoto, 20,20,50,50)
end if
Beim mir Crasht es in er Zeile
call pdf.InsertPicture(ImageView_Zwischenspeicher.Picture, 20,20,50,50)
mit dem Hinweis NIL. Also ist das Bildwohl noch nicht fertig geladen, wenn ich drauf zugreife.
Kann ich das “Socket_BildDa” solange “warten” lasse, bis das Bild geladen ist und erst dann fortsetzen?
Evtl. habe ich eine Lösung:
Dim socket As New HTTPSocket
Dim data As String = socket.Get(URL_Ansicht1, 500) ' using synchronous GET
If socket.HTTPStatusCode = 200 Then ' OK
Dim p As Picture = Picture.FromData(data)
If p <> Nil Then
call pdf.InsertPicture(p, 20,20,50,50)
Else
MsgBox("Not a picture.")
End If
Else ' errors, redirects, etc.
MsgBox("HTTP Status: " + Str(socket.HTTPStatusCode))
End If
Ich würde das Picture.Open und InsertPicture weglassen und direkt die Daten einfügen mit InsertImage
InsertImage erwartet ja ein FolderItem, das habe ich ja nicht, da die Bilder online sind.
InsertImageFromBuffer(PosX as double, PosY as double, ScaleWidth as double, ScaleHeight as double, Buffer as string, index as integer = 1) as integer
das mein ich.
Spart berraschungen mit den Farbrumen.
Wenn Picture.Open das Bild von CMYK nach RGB konvertiert und DynaPDF das einfgt, sieht es vielleicht nicht so gut aus wie ein CMYK Bild direkt einzufgen.