RTF to HTML (am Besten ohne MS Word)

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    RTF to HTML (am Besten ohne MS Word)

    Hallo Leute,

    als ich dachte ich wäre fertig und es würde alles funktionieren, hat mir Windows 10 wieder einen Strich durch die Rechnung gemacht.

    Ich muss ein RTF in HTML umwandeln. Dazu gibt es viele verschiedene Codeschnippsel im Internet, wovon mir die mit MS Word am besten gefiel, weil "eigentlich" alles klappte.

    Hier die beiden Code-Varianten die grundsätzlich funktionieren.
    Die erste Variante habe ich zuerst integriert, zum Probieren auch noch die zweite weiter unten.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Erste Variante mit Clipboard übergabe
    3. ''' </summary>
    4. ''' <param name="sRTF"></param>
    5. ''' <returns></returns>
    6. ''' <remarks></remarks>
    7. Public Function sRTF_To_HTML(ByVal sRTF As String) As String
    8. Dim MyWord As Word.Application
    9. Dim oDoNotSaveChanges As Object = Word.WdSaveOptions.wdDoNotSaveChanges
    10. Dim sReturnString As String = ""
    11. Dim sConvertedString As String = ""
    12. MyWord = CType(CreateObject("Word.Application"), Word.Application) 'CreateObject("Word.application")
    13. Try
    14. MyWord.Visible = False
    15. MyWord.Documents.Add()
    16. Dim doRTF As New System.Windows.Forms.DataObject
    17. doRTF.SetData("Rich Text Format", sRTF)
    18. Clipboard.SetDataObject(doRTF)
    19. MyWord.Windows(1).Selection.Paste()
    20. MyWord.Windows(1).Selection.WholeStory()
    21. MyWord.Windows(1).Selection.Copy()
    22. sConvertedString = Clipboard.GetData(System.Windows.Forms.DataFormats.Html).ToString
    23. sConvertedString = sConvertedString.Substring(sConvertedString.IndexOf("<html"))
    24. sConvertedString = sConvertedString.Replace("Â", "")
    25. sReturnString = sConvertedString
    26. If Not MyWord Is Nothing Then
    27. MyWord.Quit(oDoNotSaveChanges)
    28. MyWord = Nothing
    29. End If
    30. Catch ex As Exception
    31. If Not MyWord Is Nothing Then
    32. MyWord.Quit(oDoNotSaveChanges)
    33. MyWord = Nothing
    34. End If
    35. MsgBox("Error converting Rich Text to HTML")
    36. End Try
    37. Return sReturnString
    38. End Function



    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Zweite Variante mit Datei speichern
    3. ''' </summary>
    4. ''' <param name="r"></param>
    5. ''' <returns></returns>
    6. ''' <remarks></remarks>
    7. Public Function ConvertRTFToHTML(r As RichTextBox) As String
    8. Dim RTFDatei As String = Path.Combine(BONitERP2_LokalerOrdner, "temp.rtf")
    9. Dim HTMDatei As Object = Path.Combine(BONitERP2_LokalerOrdner, "temp.htm")
    10. r.SaveFile(RTFDatei)
    11. Dim w As Word.Application
    12. w = New Word.Application
    13. Dim d As Word.Document
    14. d = w.Documents.Open(FileName:="" + RTFDatei + "", ConfirmConversions:=False)
    15. d.SaveAs(HTMDatei, Word.WdSaveFormat.wdFormatHTML)
    16. 'Würde das Dokument als PDF speichern
    17. 'd.ExportAsFixedFormat("c:\test.pdf", Word.WdExportFormat.wdExportFormatPDF, True, Word.WdExportOptimizeFor.wdExportOptimizeForPrint, Word.WdExportRange.wdExportAllDocument)
    18. d.Close()
    19. w.Quit()
    20. Return "" 'wird vorerst noch nix zurückgegeben, weil die Funktion erst mit Word unter Windows 10 funktionieren muss
    21. End Function


    Beide Varianten funktionieren unter Windows 7 und Windows 8 mit Word 2007 einwandfrei.
    Nachdem die Funktion fertig ausgeführt wurde, ist Winword nicht mehr im Tastkmanager auffindbar - wurde also rasch beendet und entladen.

    Bei folgenden Rechner/Word Kombinationen entlädt sich WORD nicht sofort, sondern erst nach 10-15 Sekunden und blockiert solange den Bildschirmaufbau der eigenen Anwendung.
    * Windows 10 mit Word 2016
    * Windows 10 mit Word 365

    Als Verweis eingebunden wurde Microsoft.Word 12.0 Object Library

    Falls Ihr eine Idee habt warum das so ist und wie ich dieses Blockieren verhindern kann, dann wäre das super.

    Oder noch besser:
    Wenn Ihr eine Alternative (gerne auch kostenpflichtige) Komponeten für RTF to HTML kennt oder schon benutzt habt, dann wäre ich Euch für einen Hinweis darauf sehr verbunden.
    Eine externe, von Word unabhängige Komponente, wäre ohnehin besser. Denn alle User ohne MS Word können obigen Code nicht nutzen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Wenn du WPF nutzt: code.msdn.microsoft.com/window…-RTF-and-aaa02a6e#content
    Weiß nicht ob man das so auch in WinForms nutzen kann.

    Desweiteren ist dein Try-Catch ziemlich öde; das behindert doch das Debuggen und die Fehlersuche ungemein.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Desweiteren ist dein Try-Catch ziemlich öde; das behindert doch das Debuggen und die Fehlersuche ungemein.

    Schon klar, dass es bei der Fehlersuche auskommentiert wird. Aber es kommt ja keine Fehlermeldung. Das ist das Eigenartige.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Aber es kommt ja keine Fehlermeldung. Das ist das Eigenartige.
    Erwartest Du eine? Wenn ja, an welcher Stelle? Schließ doch erstmal aus, dass es an Word selber insofern liegt, dass es einfach von sich aus sehr lange zum Verabschieden braucht. Öffne und schließe per VB mal Word und schau, wie lange es im TaskManager bleibt. Geht es schnell, pack eben immer mehr bisherigen Code dazu, bis Du den Störenfried entdeckt hast.

    Kurzer Einwurf:

    VB.NET-Quellcode

    1. Public Function sRTF_To_HTML(ByVal sRTF As String) As String
    2. Try
    3. '...
    4. If Not MyWord Is Nothing Then
    5. MyWord.Quit(oDoNotSaveChanges)
    6. MyWord = Nothing
    7. End If
    8. Catch ex As Exception
    9. If Not MyWord Is Nothing Then
    10. MyWord.Quit(oDoNotSaveChanges)
    11. MyWord = Nothing
    12. End If
    13. MsgBox("Error converting Rich Text to HTML")
    14. End Try

    m.E. besser:

    VB.NET-Quellcode

    1. Public Function sRTF_To_HTML(ByVal sRTF As String) As String
    2. Try
    3. '...
    4. Catch ex As Exception
    5. MsgBox("Error converting Rich Text to HTML")
    6. Finally
    7. If Not MyWord Is Nothing Then
    8. MyWord.Quit(oDoNotSaveChanges)
    9. MyWord = Nothing
    10. End If
    11. End Try


    ##########

    Bei mir dauert Word 2016 öffnen und schließen ohne irgendwelchen Zusatzcode ca. 10 Sekunden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Öffne und schließe per VB mal Word und schau, wie lange es im TaskManager bleibt.


    Hab ich eh gemacht (nur das Word-Objekt erstellt und wieder geschlossen). Daher ist es mir ja auch aufgefallen, weil der "Versuch" Word zu öffnen wird beim ersten Programmstart aufgerufen um zu sehen ob Word installiert ist (dann ist HTML Email aktiviert) oder nicht (dann ist TEXT Email aktiviert). Auf insgesamt 5 Rechnern (1x Win7, 1x Win8 und 3x Win10) hats bei den Win10 Rechnern nur ungenügend funktioniert. Es scheint so, als ob WORD im Hintergrund noch werkelt oder im Speicher ist und damit die Hauptanwendung extrem bei der Leistung beschneidet - also so, dass man in 10 Sekunden zusehen kann wie sich die Form Control für Control aufbaut.

    Ich habe die Word-Methode mittlerweile wieder verworfen und mich einer anderen Möglichkeit zugewandt, welche aber auch nur halbversprechend ist. Von Sautinsoft (sautinsoft.net) gibt es da eine fertige .dll Komponente die eigentlich das macht was ich brauche. Jedoch hat die ein Problem die Bilder aus dem RTF-Text korrekt zu extrahieren (die extrahiert zwar die Bilder, aber in einer völlig überdimensionierten Pixelgröße. Das dürfte ein Bug sein. Habe den Hersteller mal angeschrieben. Obwohl die Komponente 400 USD kostet, wäre es das wert - jedoch muss das mit den Grafiken funktionieren.

    Eine weitere Möglichkeit die ich jetzt noch ausprobiere ist sevMail. Die habe ich 2009 mal für meine alte VB6 Anwendung erworben und die hat auch die Möglichkeit RTF in HTML umzuwandeln. Muss nur sehen ob sevMail auch Grafiken verarbeiten kann - und ich denke die hatte auch Probleme mit den Farben. Aber da muss ich mal probieren.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Weil ich WPF nicht kann und nicht verstehe. Bin ein WinForms Programmierer ;)
    Ich werde es jetzt mit der vorhandenen sevMail Komponente machen. Sieht vielversprechend aus und kostet mir nichts, da ich die Komponente schon mal gekauft hatte. Noch dazu hat die nur 131kb wogegen die "teure" fast 1 MB groß ist.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    So Leute. Meine Endgültige Lösung ist die Konvertierung von RTF in HTMl mit der sevMail Komponente. Eine Header-Grafik kann der User optional einfügen und die wird dann manuell in die HTML-Email integriert und mit der Email mitgeschickt. Hier noch die Screenshots was am Ende im Email-Client rauskommt:
    Bilder
    • 28102018211116.jpg

      650,56 kB, 1.280×936, 146 mal angesehen
    • 28102018211145.jpg

      377,85 kB, 960×803, 144 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Magst du den Part mal zeigen wo aus dem rtf html gemacht wird? :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das ist recht unspektakulär:

    VB.NET-Quellcode

    1. Imports sevMailActiveX


    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Mit sevMail
    3. ''' </summary>
    4. ''' <param name="RT_Text">RTF-Inhalt aus der Richtextbox</param>
    5. ''' <returns></returns>
    6. ''' <remarks></remarks>
    7. Public Function ConvertRTFToHTML(RT_Text As String) As String
    8. Dim sHTMLText As String
    9. Dim oMessage As New sevMail
    10. sHTMLText = oMessage.RTF2HTM(RT_Text, False)
    11. oMessage = Nothing
    12. Return sHTMLText
    13. End Function



    Das Header-Image füge ich manuell in den HTML-Code ein und schicke das Image dann mit der Email als Anhang mit. Der Code sucht im HTML-String nach dem ersten >. Das der HTML-String nur <body> </body> als äußere Tags verwendet, kann ich damit nach dem einleitenden BODY-Tag das Image schreiben. Somit ist es an oberster Stelle der Email zu finden.

    Achtung: hier seht ihr noch vb6 Codeteile - nicht darauf reagieren - ändere ich morgen auf .NET Sprache ;)

    VB.NET-Quellcode

    1. TempSTR = oMessage.RTF2HTM(RT_Text, False)
    2. If LokalesEmailHeaderImageFile <> "" And File.Exists(LokalesEmailHeaderImageFile) Then
    3. Dim IMGString As String = "<img src=""" + Path.GetFileName(LokalesEmailHeaderImageFile) + """>"
    4. Dim Posi As Integer = InStr(TempSTR, ">")
    5. sHTMLText = Left(TempSTR, Posi) + IMGString + Right(TempSTR, TempSTR.Length - Posi)
    6. Else
    7. 'Kein Bild im Email-Content
    8. sHTMLText = TempSTR
    9. End If

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    Cool danke. Klappt es denn sauber wenn ich manuell Bilder einfügen?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ja, man muss nur wissen wo man die einfpgen möchte. Ist normaler HTML Code.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at