Autor Thema: HTML in Richtext einlesen  (Gelesen 2759 mal)

Offline StefanP1962

  • Frischling
  • *
  • Beiträge: 23
  • Geschlecht: Männlich
HTML in Richtext einlesen
« am: 17.10.14 - 10:23:13 »
Hallo zusammen,

habe lange probiert und gesucht. Vieles auch Dank diesen Artikels von pram (besonderen Dank Dir!) http://atnotes.de/index.php/topic,52040.0.html ausgetüftelt.

Mein Problem war folgendes: Zur Dokumentierung von Vorgängen kann ich Notes-Dokumente aus meinem Mailfile als Antworten an die Vorgänge hängen. Soweit so gut. Nun habe ich zuätzlich Mails im Webmail (GMX oder web.de), welche als HTML speichere und nun als Antwortdokument ablegen muss. Da die Doku nur lesen ist, geht es nicht über UIDOC.Import. :((

Also ran ans Backend. Das HTM-File auswählen, Zeichenfolgen für das Subject und das Datum suchen, den blöden GMX Hinweistext rauschmeissen und dann das ganze in das RTF als HTML rein.  

Das ist dabei rausgekommen.
[...]

   ' HTML Quellcode holen
   fileName = ws.OpenFileDialog(False,"Bitte eine HTML-Datei wählen","HTML-Dateien|*.html","D:\PDF-TempFile")
   
   If Not IsArray( fileName ) Then
      Exit Function
   End If
   
      
   ' Stream öffnen (*** ACHTUNG: Open unbedingt mit charset versehen, sonst fehlen die Umlaute ***)
    Set stream = session.CreateStream
      
    If Not stream.Open( fileName( 0 ), "UTF-8" ) Then
      MessageBox fileName,, "Open failed"
       Exit Function
    End If
   
   If stream.Bytes = 0 Then
       MessageBox fileName,, "File has no content"
      Exit Function
    End If

   ' Characterset des Stream merken
    StreamCharset = stream.Charset   
               
   ' neues Dokument erstellen
    Set NewDoc = curDB.CreateDocument( )
   
   ' Felder im Dokument besetzen (neue Felder und Inhalte aus dem Hauptdokument)
        Call NewDoc.ReplaceItemValue("Form", ResponseForm)
        Call NewDoc.ReplaceItemValue( "Icon", "13x13_WebMail.png" )
        Call NewDoc.ReplaceItemValue( "Autor", CurDoc.Autor )
        Call NewDoc.ReplaceItemValue( "Leser", CurDoc.Leser )
        Call NewDoc.ReplaceItemValue( "Icon", "13x13_WebMail.png" )
   
     ' Stream auslesen und manipulieren
      
        ' Inhalte des Stream ermitteln
        content = stream.ReadText   
      
   ' Subject (Dies ist sicher GMX spezifisch und muss angepasst werden)      
    eadfrom = InStr( UCase( content ), {<DIV CLASS="MAIL-HEADER">} )
   
         If readfrom <> 0 Then
      eadfrom = InStr( readfrom, UCase( content ), {<H1 ID} )
      
      SingleChar = Mid( content, readfrom, 1 )
      
       ' weiterlesen    
      Do While SingleChar <> ">"
                       SingleChar = Mid( content, readfrom, 1 )   
              readfrom = readfrom + 1
       Loop
         
        ' weiterlesen    
      SingleChar = Mid( content, readfrom, 1 )
       readto = readfrom
       
                Do While SingleChar <> "<"
            SingleChar = Mid( content, readto, 1 )   
           readto = readto + 1
         Loop
            
        subjectStr = Mid( content, readfrom, readto - 1 - readfrom )
      Else
        subjectStr = "ohne Betreff"
      End If

   
     ' Datum
        readfrom = InStr( readto, UCase( content ), {DATUM:} )
     If readfrom <> 0 Then
        readfrom = InStr( readfrom, UCase( content ), {<DD>} )
        readfrom = readfrom + 4
         
        whenStr = Mid( content, readfrom, 19 )
      Else
         whenStr = CStr( Today )
     End if
    Call NewDoc.ReplaceItemValue( "Datum", CDat( whenStr ) )
   
   
     ' Titel erstellen
    whatStr = "WebMail"
        TitelStr  = whatStr + " v. " + whenStr + " - " + subjectStr
        Call NewDoc.ReplaceItemValue( "Titel", TitelStr )
   
   ' Inhalt manipulieren (Das ist der blöde Text!)
    content = Replace( content, {<h1 class="accessibility" role="contentinfo">
Wenn Sie ein Bildschirmleseprogramm verwenden, dann empfehlen wir Ihnen, folgende Seite zu verwenden: <a role="link" href="https://mm.gmx.net">https://mm.gmx.net</a>
</h1>}, "" )
    Call stream.Truncate   ' Streaminhalt löschen und
    Call stream.Writetext( content )  'Streaminhalt neu schreiben
      
            
   ' Convert MIME merken und ausschalten (nicht vergessen!)
        ' ***ACHTUNG: Ab hier KEIN Exit Sub/Function verwenden, sondern "Goto Ende" wegen Rücksetzen Convert   MIME
    oldMIME = session.Convertmime
    Session.ConvertMIME = False
         
   'Create the MIME headers
    Set body = NewDoc.CreateMIMEEntity
   Set mh = body.CreateHeader({MIME-Version})
   Call mh.SetHeaderVal("1.0")
   Set mh = body.CreateHeader("Content-Type")
   Call mh.SetHeaderValAndParams( {multipart/alternative;boundary="=NextPart_="} )
   
     ' -----------------------------------------
   ' wird nicht benötigt, sofern kein alternativer Plain-Text zur Verfügung stehen soll
        ' Send the plain text part first
     ' Set mc = body.createChildEntity()
   ' Call mc.setContentFromText(stream, {text/plain}, ENC_NONE)
    ' -----------------------------------------
   
    'Now send the HTML part. (Reihenfolge: immer nach Plain-Text!)
     Set mc = body.createChildEntity()
    Call mc.setContentFromText(stream, {text/html;charset="} & StreamCharset & {"}, ENC_NONE )
   
      
   'Stream schliessen
   Call stream.close()
   
      
   ' Zur Antwort machen und speichern
   Call NewDoc.MakeResponse( curDoc )
   Call NewDoc.Save( True, False, True )
   
   
    Ende:
   ' MIME zurücksetzen   
   Session.ConvertMIME = oldMIME

 End Sub
« Letzte Änderung: 17.10.14 - 10:34:31 von StefanP1962 »

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: HTML in Richtext einlesen
« Antwort #1 am: 22.10.14 - 08:58:05 »
... du hast ein paar CopyPaste-Fehler drin bei readform:
 
Zitat
eadfrom = InStr( UCase( content ), {<DIV CLASS="MAIL-HEADER">} )

... nur so als Hinweis
Grüßle Toni :)

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: HTML in Richtext einlesen
« Antwort #2 am: 30.10.14 - 11:23:25 »
ein NewDoc.closeMimeEntities fehlt noch vor

 Call NewDoc.MakeResponse( curDoc )

Zitat zu closeMimeEntities aus der Hilfe:
This method allows you terminate the scope of MIME processing so you can safely work on items through the item interface. Do not work on items directly without first closing MIME processing.

=> es kann der Server/Client sonst abstürzen

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz