Domino 9 und frühere Versionen > ND7: Entwicklung

Größe von eingebetteten Bildern ermitteln

<< < (2/4) > >>

eknori:

--- Zitat ---nein, mit LS2CAPI kann man da nix machen, da Lotusscript keine Callbacks unterstützt.
--- Ende Zitat ---
Kleine Korrektur: Mit ein paar Tricks geht das doch in gewissen Grenzen. Wie das funktioniert, verrate ich auf dem EntwicklerCamp

eknori:
Nochmal zurück zur Ausgangsfrage:

--- Zitat ---kennt ihr zufällig eine Möglichkeit mir der ich die Größe von eingebetteten Bildern in einem RTF ermitteln kann?
--- Ende Zitat ---

Ja, es gibt (mindestens) eine Möglichkeit.

1 - Lotusscript:
keine Standardfunktion; man kommt aber über das parsen der CD Records in einem Richtext Feld an die Informationen heran. ( Zeige ich auf dem EntwicklerCamp 2010 ).
Allerdings ist der Aufwand bei unbekanntem Inhalt des RT Feldes enorm. Man einige hundert Definitionen in einem Select behandeln. Das ist zwar nicht zeitintensiv aus Sicht der Codeverarbeitung, aber enorm arbeitsintensiv, was das Zusammensuchen der Informationen und das Einbinden in eine ScriptLib angeht.

2 -C-API:
Die wohl "einfachste" Art, diese Funktion zu realisieren. Code habe ich ja bereits oben gepostet. Den kann man als DLL aufbauen. Da muss man zu dem gezeigten Code noch ein paar Zeilen dazustricken. Das ist kein Hexenwerk.
Funktionsprototyp muss dann in der Declaration section angegeben werden.

3 -LSX:
Hier steht dann die Funktion aus (2) auch im Designer zur Verfügung. Macht Sinn, wenn man eh schon eine LSX hat, in die man die Funktion einbaut. "From Scratch" lohnt sich das Erstellen einer LSX für nur eine Funktion nicht.
Da kann man auf die DLL aus (2) ausweichen; auch eine LSX ist ja eine DLL und muss extra verteilt werden.

flaite:
Mit Java sollte es auch gehen.
Denk aber, das dieser DXL Code von Andre Guirard (spell?) die einfachste Lösung darstellt.  ;D
http://www-10.lotus.com/ldd/bpmpblog.nsf/dx/rt-validation-image

koehlerbv:
Der Code von der IBM-Seite funktioniert aber mit R7 noch nicht, Axel.

Bernhard

flaite:
Mit Java hat man das Problem auf eingettete Bilder ranzukommen. Attachments sind kein Problem.
Wir haben das hier (für Attachments) auf Basis von dem gelöst:
http://kickjava.com/src/imageinfo/ImageInfo.java.htm
Damit kann man auch Thumbnails erzeugen.
Vor vielen, vielen Jahren.
Heute gibts vermutlich bessere Lösungen.

Eingebettete Bilder sind allerdings wirklich ein Problem (mit Java). Da braucht man C-code für, um an den InputStream ranzukommen.

Keine Zeit das jetzt auszuprobieren. Was funktioniert da mit R7 nicht?  
Der Code von Andre Guriard (spell?) kann jedenfalls als gute Vorlage dienen.

Imho könnte das so schon mit R7 funktionieren:

--- Code: ---Sub Querysave(Source As Notesuidocument, Continue As Variant)
        Dim doc As NotesDocument
        On Error Goto oops
        Source.Refresh True ' update rich text data into back end.
        Set doc = Source.Document
        Dim session As New NotesSession
        Dim stream As NotesStream
        Dim dxle As NotesDXLExporter
        Dim domp As NotesDOMParser
        Dim domd As NotesDOMDocumentNode
        Dim nl As NotesDOMNodeList
        Set stream = session.CreateStream
       
        Set dxle = session.CreateDXLExporter(doc, stream)
        dxle.RestrictToItemNames = "Body"
        ' at this point you might want to set additional properties for efficiency, e.g. to omit attachments
        ' please note that if you want to disallow certain types of content, you can use a Rich Text Lite field,
        ' so this is not the preferrred way to block users from adding an image.
        dxle.Process
        Set domp = session.CreateDOMParser(stream)
        domp.Parse
        Set domd = domp.Document
        Set nl = domd.GetElementsByTagName("picture")
        If nl.NumberOfEntries <> 1 Then
                Msgbox "You must have exactly one image in the Body field."
                Continue = False
                Exit Sub
        End If
        Dim picture As NotesDOMElementNode
        Set picture = nl.GetItem(1)
        Dim picX As Long, picY As Long
        picX = Clng("0"+Strleft(picture.GetAttribute("width"), "px"))
        picY = Clng("0"+Strleft(picture.GetAttribute("height"), "px"))
        If picX > 400 Or picY > 400 Then
                Msgbox "The image may not exceed 400x400 pixels."
                Continue = False
                Exit Sub
        End If
        If stream.Bytes > 160000 Then
                Msgbox "The image is too large. Please IMPORT the image from a GIF or JPEG file; do not paste graphics or import a BMP file. Thanks."
                Continue = False
                Exit Sub
        End If
        ' else: success!
        Exit Sub
oops:
        ' if a validation failure don't bother to display the error because user already saw one.
        If Err <> 4412 Then Msgbox "Error " & Err & " in Querysave line " & Erl & ": " & Error
        Continue = False
        Exit Sub
End Sub

--- Ende Code ---

In jeden Fall muß man das DXL nicht auf Platte schreiben. Ein parsen der XML Repräsentation reicht aus.
Der code ist für mich die Notes Programmier Entdeckung des Jahres.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln