Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: magic_halli am 19.02.09 - 16:02:42

Titel: Bilder im RichText
Beitrag von: magic_halli am 19.02.09 - 16:02:42
Hi,

ich habe eine Notes-intern versendete Mail mit 2 Bildern im Textfeld (body). Normalerweise liest mein zuständiger Agent sämtliche Anhänge und Bilder aus (und speichert diese), nur in dem Fall nicht!
Bisher behandle ich Anhänge bzw. Bilder zum einen so: (Auszug)
Code
If ( doc.HasEmbedded ) Then
		If ( attachment.Type = RICHTEXT ) Then
			Forall o In attachment.EmbeddedObjects
				If ( o.Type = EMBED_ATTACHMENT ) Then

zum anderen über 'NotesMIMEEntity'. Das klappt auch 1a.

Bei dieser Mail jedoch greift keine Methode. Hier sehen außerdem vom Maildokument die body-Items so aus (mehr steht jeweils nicht drin):
Code
Feldname: Body
Datentyp: Rich Text
Datenlänge: 44268 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 0
Feld-Flags: SIGN SEAL

Hiervon gibts 32 body-Items mit laufender Nr. bei 'Doppeleintrags-ID' und unterschiedlicher 'Datenlänge'!

Wie komme ich hier erstmal grundsätzlich an so ein Bild ran?


Danke und Gruß

Rico.


Titel: Re: Bilder im RichText
Beitrag von: TRO am 19.02.09 - 16:29:10
Die Mail ist verschlüsselt!

Wo läuft denn der Agent? Durch den Client gestartet oder als Serverinstanz?

Thomas
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 19.02.09 - 16:32:31
Agent wird vom User per Button ausgeführt...

Verschlüssselt? Aha! Woran erkennt man das und was bedeutet das für mich, wenn ich an die Bilder ran will?

Rico.
Titel: Re: Bilder im RichText
Beitrag von: TRO am 19.02.09 - 20:00:06
Verschlüssselt? Aha! Woran erkennt man das ...

An der Eigenschaft SEAL in DocPropertyFenster bei diesem Item

Agent wird vom User per Button ausgeführt...

... und was bedeutet das für mich, wenn ich an die Bilder ran will?

Rico.

Normalerweise sollte das Decrypten beim Zugriff auf die Items in dem NotesDocument automatisch passieren .... vorausgesetzt der den Button betätigende User hat den korrekten Private-Key (wenn ich mal vom Fall der Mailverschlüsselung ausgehe).

Thomas
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 20.02.09 - 13:01:48
Mh... nun gut.
Aber ich so richtig bin ich hier jetzt leider nicht weiter gekommen.

Wie komme ich denn nun an solche (verschlüsselten oder auch nicht) Bilder im body(RichText) ran?
Welche Methoden gibt es hierfür?

Rico.
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 12.03.09 - 10:40:46
Hallo,

ich muss das Thema nochmal aufgreifen, da ich einfach nicht weiterkomme...

Mein Maildokument enthält Bilder direkt sichtbar im Mailtext.
Wenn ich nun, wie im 1.Post beschrieben die Attachments auslesen will:
Code
If ( doc.HasEmbedded ) Then
...
...dann ist diese Bedingung hier schon false!!!
Wieso hat das Maildokument angeblich keine EmbeddedObjects, wenn ich die Bilder doch aber sehe?
Wie komme ich an diese blöden Bilder ran? Die Hilfe hat mich in dem Falle auch nicht schlauer gemacht, da ich lt. Hilfe bereits korrekt vorgehe!

Rico.
Titel: Re: Bilder im RichText
Beitrag von: Ralf_M_Petter am 12.03.09 - 11:15:51
Wenn das Bild in den Richtext eingfügt ist, dann ist es kein Dateianhang. Von daher ist es völlig korrekt, dass die Abfrage false ergibt.

Meines Wissens, gibt es nur eine Methode die Bilder zu bekommen und die geht über DXL.

Grüße

Ralf
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 12.03.09 - 12:32:23
Zitat
Meines Wissens, gibt es nur eine Methode die Bilder zu bekommen und die geht über DXL.
Der NotesDXLExporter wäre hierfür mein Ansprechpartner?!
Damit konvertiere ich ja aber das NotesDocument (mein Maildokument) erstmal komplett in ein XML-File! Habe dazu auch schon Code getestet - klappt erstmal, d.h. ich habe auf Platte jetzt ein XML-File meines Maildokuments.
Code
Dim exporter As NotesDXLExporter
Dim streamDXL As NotesStream
Dim fname As String
fname = "D:\temp\DXLoutput.xml"
Set streamDXL = session.CreateStream
Call streamDXL.Open(fname)
Call streamDXL.Truncate
Set exporter = session.CreateDXLExporter(docMail)
Call exporter.SetOutput(streamDXL)
Call exporter.Process
Call streamDXL.Close

Ich will aber im Endeffekt NUR die evtl. enthaltenen Bilder auslesen und speichern.
Habt ihr hierfür Beispiele/Links/Lektüre etc. zur Hand?

Wie kann ich außerdem im Code außerdem eine Fallunterscheidung treffen, dass nur Dokumente abgearbeitet werden sollen, wo Bilder im RichText eingefügt sind?


Danke und Gruß

Rico.
Titel: Re: Bilder im RichText
Beitrag von: Ralf_M_Petter am 12.03.09 - 12:47:43
Ich habe es selber noch nicht gemacht, aber schau dir doch mal die Datenbank von Openntf an. In der sollte alles drinnen sein was du brauchst http://www.openntf.org/Projects/codebin/codebin.nsf/CodeBySubType/DE60568D19EA514F86257057006BF308

Grüße

Ralf
Titel: Re: Bilder im RichText
Beitrag von: Axel am 12.03.09 - 13:31:21
Ich habe es schon einmal eingesetzt. Funktioniert problemlos.

Axel

Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 12.03.09 - 16:45:13
Zitat
Ich habe es selber noch nicht gemacht, aber schau dir doch mal die Datenbank von Openntf an. In der sollte alles drinnen sein was du brauchst http://www.openntf.org/Projects/codebin/codebin.nsf/CodeBySubType/DE60568D19EA514F86257057006BF308

Erfolg!!!  ;D
Ich hab den Code von dieser Datenbank bei mir implementiert und noch etwas angepasst... es funktioniert endlich - ich bekomme nun meine RichText-Bilder extrahiert!

Was allerdings bei ein paar wenigen Mails noch seltsam ist:
Es werden teilweise auch die kleinen Icons von "richtigen" Anhängen als gif extrahiert - zusätzlich zu den eigentlichen Attachment-Files!

Werden denn Attachment-Icons auch irgendwie als RichText-Bild am Dokument gespeichert - ist da was bekannt? ...dann würde mich das Verhalten nicht sonderlich wundern.


Gruß

Rico.
Titel: Re: Bilder im RichText
Beitrag von: Ralf_M_Petter am 12.03.09 - 16:58:22
Ja sicher müssen die auch im DXL vorkommen. Du kannst mal eines suchen im DXL und schauen, ob diese irgendwie erkennbar sind und diese dann ausnehmen.

Grüße

Ralf
Titel: Re: Bilder im RichText
Beitrag von: pram am 12.03.09 - 17:38:24
Verschlüssselt? Aha! Woran erkennt man das ...

An der Eigenschaft SEAL in DocPropertyFenster bei diesem Item

Das ist so nicht ganz richtig:
Die Eigenschaft SEAL bedeutet, dass das Feld verschlüsselt werden KANN.
Erst beim "doc.encrypt" wird das Dokument (und alle Items die das SEAL Property haben) mit den "PublicEncryptionKeys" und/oder "SecretEncryptionKeys" verschlüsselt.
Bei geschlossenem Dokument im Eigenschaftsfenster der Ansicht sieht man dann nur noch das $Seal und $SealData Item

Aber zurück zu deinem Problem: Eingebettete Bilder können mit Notes-Bordmitteln nicht heraus geholt werden. Die einzigen Möglichkeiten die ich hierzu kenne sind per DXL oder das Bild vom HTTP-Task zu holen.

Gruß
Roland
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 13.03.09 - 09:16:24
Zitat
Ja sicher müssen die auch im DXL vorkommen. Du kannst mal eines suchen im DXL und schauen, ob diese irgendwie erkennbar sind und diese dann ausnehmen.
Ich habe herausgefunden, woran es liegt, dass Icons mit gespeichert werden:

Icons von Attachments und normale BMP´s, die inline im Mailtext enthalten sind, stehen in der DXL-Datei (xml) vom NotesDXLExporter zwischen den Tags <notesbitmap></notesbitmap>.
Durch 'NotesDXLExporter.ConvertNotesBitmapsToGIF=True' werden BMP´s in GIF´s konvertiert. GIF´s werden wiederrum vom Programm mit gespeichert (soll ja so sein). Icons von Attachments sind anscheinend BMP´s bzw. werden von 'NotesDXLExporter.ConvertNotesBitmapsToGIF' definitiv behandelt!

Somit ist klar, warum auch die Icons mit gespeichert werden - da sie ja in gif´s umgewandelt werden. Ein Teufelskreislauf!

Wenn man nun 'NotesDXLExporter.ConvertNotesBitmapsToGIF=False' setzt, werden keine Icons mehr mit gespeichert, allerdings werden dann auch keine BMP´s, die inline im Mailtext angezeigt werden, mehr mit behandelt und gespeichert!  :(

Soweit erstmal der Stand der Dinge...
Fällt dazu jemand noch irgendwas ein?


Gruß

Rico.
Titel: Re: Bilder im RichText
Beitrag von: Ralf_M_Petter am 13.03.09 - 09:19:20
Ich bleibe dabei, die Icons sind sicher im DXL anders gekennzeichnet als normale Bilder. Eventuell schau mal die darüberliegenden Tags an. Eventuell kannst du auch mal ein Beispiel DXL posten in dem sowohl Bilder als auch Icons vorkommen. Natürlich anonymisiert.

Grüße

Ralf
Titel: Re: Bilder im RichText
Beitrag von: pram am 13.03.09 - 09:28:04
bei Attachments ist ein <attachmentref> herum:

Code
<attachmentref name="run.pdf" displayname="run.pdf">
<picture width="41px" height="47px">
<gif originalformat="notesbitmap">
R0lGODlhKQAvAOcAAP///wAAAOjo6LCwsODg4ODg6EgAAPjY2NjY2EhISMjI0KiosNjY4MDAwMDA
yNDQ0KioqNDQ2PDw8Li4wKCgoPgYGGBgYLCwuOjo8PAICPgIEPggKPgoKFBQUMjIyJiYmKCgqMgA
AOCAgOgACPgQGPgYIPgwMPh4ePiIiEBAQFhYWLi4uOioqOiwsOjg6PgQEPggIPgoMPgwOPhoaPiA
....
LJBCEjh0QcagKLvUVW02WnYuZpppOuUdZ50RYNK1hBduuOErEODn4ow3vqeeDVnHFnTW8UlddJdX
7hCda9XpOeV19snncnmO3vnpjYv+UkAAOw==
</gif>
</picture>
</attachmentref>

Ein Preprocessing mit XSLT sollte es ermöglichen, alle  <attachmentref> und Unterelemente zu entfernen

Den Base64-Stream kann man übrigens mithilfe des NotesMimeEntity wieder in binär umwandeln

Gruß
Roland
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 13.03.09 - 09:33:11
So, hier mal ein Auszug aus der DXL (xml)... mit 'ConvertNotesBitmapsToGIF = False'. Somit sieht man erstmal die Tags in ihrer eigentlichen Form.

1. Ein BMP, welches inline im Mailtext sichtbar ist:
Code
<par def='2'><picture height='768px' width='1024px'><notesbitmap>
<!-- hier der Base64-Stream des BMP -->
</notesbitmap></picture></par>

2. Ein Icon eines Attachments:
Code
<attachmentref name='BMP-Test.bmp' displayname='BMP-Test.bmp'>
<picture height='47px' width='78px'><notesbitmap>
<!-- hier der Base64-Stream des Icon -->
</notesbitmap></picture></attachmentref>

Rico.
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 13.03.09 - 09:37:55
Zitat
Ein Preprocessing mit XSLT sollte es ermöglichen, alle  <attachmentref> und Unterelemente zu entfernen.
Aha?! Wie meinst Du das bzw. was soll das im Klartext für mein Problem heißen?

EDIT: Ach, das soll heißen, dass ich mittels XSLTransformer aus der DXL die Tags <attachmentref> und alles was dazwischen liegt entfernen soll? Erst danach wird mittels MimeEntity.SetContentFromBytes der Stream in Binärdaten umgewandelt und die Files gespeichert.
Hab ich das richtig interpretiert?

Rico.
Titel: Re: Bilder im RichText
Beitrag von: pram am 13.03.09 - 11:45:43
Die DB von openntf.org verwendet genau die Technik die ich skizziert habe:
Zitat
- uses internal DXL and MIME classes for extracting the images and decode base64 data

ich hab mal den Code überflogen, die "schnipseln" die Image-Tags mit String-Operationen raus, ich würde das eher über einen SAX-Parser machen (xslt ist hier wohl overkill), man kann dann den DXL-Exporter und den SAX-Parser kaskadieren:

Der Sax-Parser hat als Eingabestrom den NotesDXLExporter.

der SAX-Parser hat dabei 3 relevante Events: Sax_Start_Element, Sax_End_Element, Sax_characters.
dann baust dir eine "State-Machine":
Code
dim gif%, jpg%, attachment%
sub Sax_start_element (source, elName, attr) 
  select case lcase(elName)
     case "attachmentref": attachment = attachment + 1 ' Attachment-Tag betreten
     case "gif": gif = gif + 1 ' gif-tag betreten
  end select
end sub

sub Sax_end_element (source, elName) 
  select case lcase(elName)
     case "attachmentref": attachment = attachment - 1 ' Attachment-Tag verlassen
     case "gif": gif = gif - 1 ' gif-tag verlassen
  end select
end sub

sub Sax_characters(...)
  if attachmentref = 0 and gif = 1 then ' keinen Attachmentref-Tag betreten, aber einen GIF-Tag
    ... exportiere GIF
  end if
end sub

soweit in etwa klar?
analog dazu kannst du auch noch die Fileattachments extrahieren

Gruß
Roland
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 13.03.09 - 11:54:21
Zitat
Die DB von openntf.org verwendet genau die Technik die ich skizziert habe
Wo finde ich denn diese DB - ich finde die einfach nicht.
Titel: Re: Bilder im RichText
Beitrag von: pram am 13.03.09 - 12:48:35
8. Antwort:
http://www.openntf.org/Projects/codebin/codebin.nsf/CodeBySubType/DE60568D19EA514F86257057006BF308
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 13.03.09 - 13:18:48
Danke.
Ich hatte Dich leider ein wenig falsch verstanden! Mein Fehler!  ;) Sorry.
Diese DB bzw. den Code habe/nutze ich bereits. Ich dachte nur, Du hast dort Code zum SAXParser gefunden. Das hat mich eben nur gewundert...

Summary:
Ich möchte aus meinem vorhandenen DXLExporter (XML) "einfach" alle Tags <attachmentref>...</attachmentref> und alles was dazwischen liegt entfernen/löschen. Dazu sollte/kann man den NotesSAXParser verwenden?! (XSLT nicht nötig!; DOMParser evtl. noch eine Alternative?)
Dieser bekommt als Input meinen vorhandnen DXLExporter, parst/bearbeitet diesen und liefert als Output den veränderten DXLExporter zurück.
Mit diesem arbeite ich dann ganz normal weiter.

So habe ich das jetzt verstanden und es erscheint mir logisch. Werde dazu die Hilfe interviewen. Dann sollte es schon klappen?!


Ich danke euch für euer Bemühen und die "Geduld"  ;)


Gruß

Titel: Re: Bilder im RichText
Beitrag von: pram am 13.03.09 - 17:38:51
deine Summary ist soweit richtig.

für jedes öffnende Element (z.B. "<gif>") löst der Sax-Parser das Event "Sax_Start_Element" aus.
Hier erhöhst du einen Zähler wenn das Element vorbei kommt. (Zähler deshalb weil manche Elemente geschachtelt vorkommen können).
Evtl musst du dir noch die Attribute für den Filenamen merken

für die schließenden Tags erniedrigst du den Zähler in der Sax_End_Element.

Für den Text zwischen den Tags wird die Sax-Characters-Funktion aufgerufen.
Hier kannst du anhand der Zähler überprüfen, wo du dich befindest...

Steht der Zähler für die GIF-Tags nun nicht auf 0 dann befindest du dich zwischen einen Gif-Tag, also hier irgendwo: <gif>  ;D </gif>
(wenn gleichzeitig der attRef-Counter <> 0 ist, bist du hier irgendwo <attachmentref>...<gif> ;D </gif>..</attachmentref>)

Die Sax-Characters-Fkt bekommt als Eingabestrom den Base64-codierten String zwischen den Tags. Den wandelst du mittels NotesMimeEntity (siehe openntf-DB) nach binär und schreibst ihn auf die Platte

XSLT ist nicht nötig da du hier nur schwierig mehrere Bilder extrahieren kannst. DOM-Parser ginge evtl auch, ist aber meist sehr ressourcenhungrig. (und unter Notes im Gegensatz zu anderen Implementierungen wenig bis kaum zu gebrauchen)



Gruß
Roland
Titel: Re: Bilder im RichText
Beitrag von: magic_halli am 16.03.09 - 16:31:56
Ich konnte mein Problem nun endlich lösen!  ;D

Summary:
Ich wollte RichText-Pictures aus einer Mail extrahieren und speichern.
Dazu habe ich als Codegrundlage die Datenbank von Openntf genommen - die 'ExportPictures'-Funktion aus der Scriptbibliothek 'ExportPicturesLib'.
Hierbei wird aus einem Dokument mittels DXLExporter ein XML-String erzeugt (inkl. aller Inline-Pictures). Aus diesem XML-String werden dann alle Inline-Pictures auf Platte gespeichert. Funktioniert soweit erstmal prima, aber...

mein Problem hierbei:
Es wurden auch alle Attachment-Icons von Nicht-RichText-Bildern mit ausgeleitet/gespeichert. Das soll in meinem Fall (und ich denke auch allgemein) eigentlich nicht sein!

Lösung:
Nach etlichen Versuchen mittels NotesSAXParser die Attachment-Icons aus dem XML-String rauszuparsen und alles wieder irgendwie in DXL bzw. XML-String "zusammenzubauen", bin ich dann auf eine sehr einfache Lösung gestoßen!!!  ;)  Ich frag mich jetzt noch, warum nicht gleich so!  :-:
Der Anfang der benutzten 'ExportPicture'-Funktion aus der Datenbank von Openntf.org sieht so aus:
Code
...
Set thisDB = session.CurrentDatabase
Set exporter = session.CreateDXLExporter
exporter.ConvertNotesBitmapsToGIF = True
...
Lediglich durch einfügen einer Zeile ergibt sich folgender Code, wobei hier alle Pictures, welche zwischen den Tags <attachmentref...>...</attachmentref> stehen und Attachment-Icons repräsentieren, nicht mit in den XML-String übernommen werden!!! Das wars dann auch schon - so einfach kanns manchmal laufen!
Code
Set thisDB = session.CurrentDatabase
Set exporter = session.CreateDXLExporter	
exporter.ConvertNotesBitmapsToGIF = True
' NEU: auslassen von Attachment-Icons im XML-String
exporter.OmitRichtextAttachments = True
...
Allerdings ist diese Property erst ab Release 8 verfügbar.

Ich danke euch für eure Hilfe/Unterstützung/Tips!!!


Danke und Gruß

Rico.