MBSDynaPDFPlugin Starter -> Bilder einbetten

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.