Einfügen eines GIF-Bildes in ein Richtext-Feld via Lotus Script / DXL

Via Lotus Script ist es mit den Standard-Bordmitteln nicht möglich, dass man ein Bild in ein Richtext einfügt.

Mittels DXL ist dies allerdings doch machbar.

Da Bilder im DXL BASE64 kodiert sein müssen, werden Funktionen benötigt, die diese Kodierung durchführen. Diese können unter folgendem Link gefunden werden: http://www.nsftools.com/tips/NotesTips.htm#lsencryption

Das Beispiel führt hierbei folgende Schritte durch:

  • Erzeugung des Dokuments
  • Export der DXL Datei
  • Laden der DXL Datei in einem Parser
  • Erstellung der notwendigen Element-Tags
  • Kodierung des GIF-Files
  • Export des Parserinhalts in eine DXL-Datei
  • Importieren der DXL-Datei

Der Export erfolgt über den “DXLExporter”, hierbei wird das erzeugte Dokument (doc) als Eingabe verwendet und ein Stream (inputStream) als Ausgabe:

Set inputStream = s.CreateStream
Set outputStream = s.CreateStream
Set dxlexporter = s.CreateDXLExporter(doc,inputStream)
Call dxlexporter.process()

Dieser Stream wird anschließend in den DOM-Parser importiert:

Set domParser=s.CreateDOMParser(inputStream, outputStream)
domParser.Process
Set docNode = domParser.Document

In die docNode sind nun im ersten Richtext-Element ein Paragraph-Element, mit einem Picture-Element, das ein Gif-Element enthält einzufügen (par/picture/gif):

Set nodeList = docnode.GetElementsByTagName(“richtext”)
Set node = nodelist.GetItem(1)

Set parnode = docNode.CreateElementNode(“par”)
Call node.AppendChild(parnode)

Anschließend ist das Gif-File zu konvertieren und als TextNode in das GIF einzufügen:

Set textNode = docNode.CreateTextNode(picture)
Call gifnode.AppendChild(textNode)

Nun muss der DOMParser seinen Inhalt in den OutputStream schreiben:

Call domparser.serialize()

Als letzter Schritt ist dieser Stream nun wieder zum Importieren:

Dim importer As NotesDXLImporter
Set importer = s.CreateDXLImporter ( outputstream , db )
importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
importer.ExitOnFirstFatalError = False
Call importer.Process

Der gesamte Code sieht nun so aus:

Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim inputStream As NotesStream
Dim outputStream As NotesStream
Dim dxlexporter As NotesDXLExporter
Dim docNode As NotesDOMDocumentNode
Dim nodeList As NotesDOMNodeList
Dim node As NotesDOMNode
Dim parnode As NotesDOMNode
Dim textnode As NotesDOMNode
Dim pictureNode As NotesDOMElementNode
Dim gifNode As NotesDOMNode

Set db = s.CurrentDatabase
Set doc = db.CreateDocument

doc.Form = "Test"

Set rtitem = doc.CreateRichTextItem("Body")
Call doc.save(True,False)

Set inputStream = s.CreateStream
Set outputStream = s.CreateStream
Set dxlexporter = s.CreateDXLExporter(doc,inputStream)
Call dxlexporter.process()

Set domParser=s.CreateDOMParser(inputStream, outputStream)
domParser.Process

'get the document node
Set docNode = domParser.Document
' process here

Set nodeList = docnode.GetElementsByTagName("richtext")
Set node = nodelist.GetItem(1)

Set parnode = docNode.CreateElementNode("par")
Call node.AppendChild(parnode)

Set pictureNode = docNode.CreateElementNode("picture")
Call parnode.AppendChild(pictureNode)

Dim heightAttr As NotesDOMAttributeNode
Dim widthAttr As NotesDOMAttributeNode

Set gifnode = docNode.CreateElementNode("gif")
Call pictureNode.AppendChild(gifnode)

Dim picture As String
Dim fin As Integer
Dim finOpen As Integer
Dim worktext As String, leftover As String

fin = Freefile

picture=""
Open "c:test.gif" For Input As fin

Const CHUNKSIZE = 15000
datain = GetFileChunk(fin, CHUNKSIZE)
Do While (Len(datain) > 0)
leftover = leftover & datain
While (Len(leftover) > 57)
worktext = Left$(leftover, 57)
leftover = Mid$(leftover, 58)
dataout = EncodeBase64(worktext)
picture=picture+dataout
Wend
datain = GetFileChunk(fin, CHUNKSIZE)
Loop

'** encode anything we had left, and close the files
If (Len(leftover) > 0) Then
picture=picture+EncodeBase64(leftover)
End If

Close #fin

Set textNode = docNode.CreateTextNode(picture)
Call gifnode.AppendChild(textNode)

Call domparser.serialize()

Dim importer As NotesDXLImporter
Set importer = s.CreateDXLImporter ( outputstream , db )
importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
importer.ExitOnFirstFatalError = False
Call importer.Process

End Sub

Ich wünsche viel Spass und Erfolg!

This entry was posted in Development, DXL, Lotus Domino. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s