Richtextformat Parsen

  • VB.NET

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

    Richtextformat Parsen

    Hallo Ihr lieben, ich sitze immernoch an meinem Dokument-Verwaltungsprogramm.

    Derzeit bin ich gerade dabei verschiedene Dateikonvertierungen zu implementieren. Dazu bediene ich mich unter anderem an PDFSharp und Migradoc.
    Da im Netz kaum etwas zu finden ist, wie man nun RTF zu Migradoc parst und schließlich zu PDF umwandelt, dachte ich mir, dass ich mich der Sache einmal annehme.
    Grund dafür ist auch, dass ich Docx-Dateien nicht direkt einlesen kann und zu RTF umwandle und somit sollte ich mir in Punkto RTF etwas mehr Mühe geben.

    Hab ihr vielleicht Lust und Zeit mir hier etwas zu helfen, da ich gerade nicht so genau weis, ob ich einen guten Ansatz gewählt habe und wie ich nun von meiner Strukturierung mit Migradoc zusammen komme.

    Hier nachfolgend mein Ansatz:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Text
    2. Imports System.Text.RegularExpressions
    3. Public Class RTF_Parser
    4. Public Property raw As String = ""
    5. Public Property rawLines As List(Of String) = New List(Of String)
    6. Public Property fontList As List(Of Font) = New List(Of Font)
    7. Public Property colorList As List(Of Color) = New List(Of Color)
    8. Public Property commands As List(Of String) = New List(Of String)
    9. Public Sub New(rawRtf As String)
    10. raw = rawRtf
    11. colorList.Add(Color.Black) ' Standard-Color: Black / Colorindexing in RTF begins by 1
    12. Parse()
    13. End Sub
    14. Public Sub Parse()
    15. SplitLines() ' Split lines by CrLf to List(of String)
    16. GenerateFontList() ' Read RTF FontTable
    17. GenerateColorList() ' Read RTF ColorTable
    18. ReadLines() ' Read each command in each line
    19. End Sub
    20. Private Sub SplitLines()
    21. Dim lines As String() = raw.Split(vbNewLine)
    22. For Each line As String In lines
    23. If line.Trim <> "" Then rawLines.Add(line)
    24. Next
    25. End Sub
    26. Private fntListIdx As Integer = 0
    27. Private Sub GenerateFontList()
    28. ' Search line with fonttable and save the index to "fntListIdx"
    29. For i As Integer = 0 To rawLines.Count - 1
    30. If rawLines(i).Contains("{\fonttbl") Then
    31. fntListIdx = i
    32. Exit For
    33. End If
    34. Next
    35. ' Match the name of each font in fonttable
    36. Dim matches As MatchCollection = Regex.Matches(rawLines(fntListIdx), "{\\f[A-z0-9]*\s]*([A-z0-9\s]*);}")
    37. For Each match As Match In matches
    38. If match.Success = True And match.Groups.Count = 2 Then
    39. ' Save it to a List(of Font)
    40. fontList.Add(New Font(match.Groups(1).Value, 11.25))
    41. End If
    42. Next
    43. End Sub
    44. Private colListIdx As Integer = 0
    45. Private Sub GenerateColorList()
    46. ' Search line with colortable and save the index to "colListIdx"
    47. For i As Integer = 0 To rawLines.Count - 1
    48. If rawLines(i).Contains("{\colortbl") Then
    49. colListIdx = i
    50. Exit For
    51. End If
    52. Next
    53. ' Match the Values (red, green, blue) for each Color in table
    54. Dim matches As MatchCollection = Regex.Matches(rawLines(colListIdx), "\\red([0-9]*)\\green([0-9]*)\\blue([0-9]*);")
    55. For Each match As Match In matches
    56. If match.Success And match.Groups.Count = 4 Then
    57. Dim r As Integer = Integer.Parse(match.Groups(1).Value)
    58. Dim g As Integer = Integer.Parse(match.Groups(2).Value)
    59. Dim b As Integer = Integer.Parse(match.Groups(3).Value)
    60. ' Save it to an List(of Color)
    61. colorList.Add(Color.FromArgb(r, g, b))
    62. End If
    63. Next
    64. End Sub
    65. Private Sub ReadLines()
    66. ' Startline after Color- and Fonttable
    67. Dim s As Integer = IIf(fntListIdx > colListIdx, fntListIdx, colListIdx) + 1
    68. ' Holder for free Text (ignores Linebreaks)
    69. Dim txt As String = ""
    70. ' Go through all lines
    71. For lineIdx As Integer = s To rawLines.Count - 1
    72. Dim lineStr As String = rawLines(lineIdx) ' original Raw-Line
    73. ' Holders for command name and value
    74. Dim befStarted As Boolean = False ' is true if char "\" is passed
    75. Dim befName As String = "" ' becomes the command charwise if befStarted = true
    76. Dim befVal As String = "" ' becomes the value for the command (only numeric)
    77. For Each lineLet As Char In lineStr
    78. If lineLet = "\" Then ' command begins!
    79. If befStarted = False Then ' is there an active command? Yes:
    80. addCommand("txt", txt) ' - save the free text
    81. txt = "" ' - reset the free text
    82. befStarted = True ' - start command-recording
    83. Else ' no? Then:
    84. addCommand(befName, befVal) ' - command completed -> save it!
    85. befStarted = False ' - stop command-recording
    86. befName = "" ' - reset command-name
    87. befVal = "" ' - reset command-value
    88. End If
    89. ElseIf lineLet = " " Then ' Spacechar (?in freetext or after last command?)
    90. If befStarted = True Then ' is there an active command? Yes:
    91. addCommand(befName, befVal) ' - command completed -> save it!
    92. befStarted = False ' - stop command-recording
    93. befName = "" ' - reset command-name
    94. befVal = "" ' - reset command-value
    95. Else ' no? Then:
    96. txt &= lineLet ' - add Spacechar to freetext
    97. End If
    98. ElseIf IsNumeric(lineLet) = True Then ' Numeric char! In freetext or command-value?
    99. If befStarted = True Then ' is there an active command? Yes:
    100. befVal &= lineLet ' - add Number to command-value
    101. Else ' no? Then:
    102. txt &= lineLet ' - add Number to freetext
    103. End If
    104. Else ' All other chars (Letters and so on..)
    105. If befStarted = True Then ' is there an active command? Yes:
    106. befName &= lineLet ' - add char to command-name
    107. Else ' no? Then:
    108. txt &= lineLet ' - add char to freetext
    109. End If
    110. End If
    111. Next ' After this "Next" end of Line is reached!
    112. If befStarted = True Then ' is command-recording on? Yes:
    113. addCommand(befName, befVal) ' - command completed -> save it!
    114. befStarted = False ' - stop command-recording
    115. befName = "" ' - reset command-name
    116. befVal = "" ' - reset command-value
    117. End If
    118. Next
    119. End Sub
    120. Private Sub addCommand(name As String, value As String)
    121. commands.Add(name & "=" & value) ' Save name and value to an List(of String) -> for Debug!
    122. Select Case name
    123. Case "pard" ' begin of Paragraph and end of last Paragraph
    124. ' Value = ""
    125. Case "par" ' linebreak
    126. ' Value = ""
    127. Case "f" ' font-selector
    128. ' Value = indexnumber at Fontlist
    129. Case "fs" ' font-size
    130. ' Value = size in half-points
    131. Case "cf" ' font-color
    132. ' Value (>0) = indexnumber at colorlist / Value (=0) = end of the last color
    133. Case "b" ' bold font
    134. ' Value ("") = Start / Value ("0") = End
    135. Case "i" ' italic font
    136. ' Value ("") = Start / Value ("0") = Ende
    137. Case "ul" ' underlining start
    138. ' Value = ""
    139. Case "ulnone" ' underlining stop/end
    140. ' Value = ""
    141. Case "tab" ' text indent
    142. ' Value = ""
    143. Case "'B" ' symbol
    144. ' Value (7) = · (Point for Lists)
    145. Case Else
    146. Debug.WriteLine("Unknown Command: " & name & "=" & value)
    147. End Select
    148. End Sub
    149. End Class



    Die Verwendung kann so aussehen:

    - Form mit Richtextbox + PropertyGrid

    VB.NET-Quellcode

    1. Dim rtfParser As New RTF_Parser(RichTextBox1.Rtf)
    2. PropertyGrid1.SelectedObject = rtfParser


    RTF-Inhalt für die Richtextbox ist im Anhang!

    Ich würde mich über Tipps zur Verbesserung und allgemeine Mithilfe echt freuen!

    Danke und Gruß Hassowuff
    Dateien
    • test.rtf

      (41,69 kB, 63 mal heruntergeladen, zuletzt: )
    • RTF-Parser.vb

      (8,38 kB, 35 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

    Richtextformat Parsen, Schritt 2

    :thumbsup: Hallo Ihr lieben,

    bin hier schon ein ganzes Stück weiter!
    Würde mich wirklich freuen, wenn Ihr mithelfen würdet.

    Im Anhang liegt eine Zip mit dem gesamten Projekt zum RTF-Parser, als einziges NUGET-Paket ist "Migradoc GDI" installiert, was "PDFSharp GDI" beinhaltet.

    Aktuell liefert der Parser auf Knopfdruck ein PDF, bei dem es aber noch an so einigem fehlt:
    • Umlaute und Sonderzeichen wie äöü
    • PNG-Bilder (pngblip) werden noch nicht gelesen
    • Auflistungen
    • Tabellen
    • Textrichtungen und -ausrichtungen
    • Rahmen und Linien
    Und ja, ich hatte oben erwähnt, dass ich nicht genau weiß, ob ich mit meinem Codeansatz an Migradoc ran komme..
    Dazu kann ich nur sagen, jaein: Grundstruktur war schon gut, aber Migradoc hat eigene Klassen und Enumerationen für Color, Font und Underline.
    Wahrscheinlich noch viel mehr, aber das ist das, wo ich bislang angestoßen bin.

    Danke und einen schönen Tag!

    Gruß Hassowuff
    Dateien
    • RTF-Parser.zip

      (1,36 MB, 58 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]
    Geht's um Funktion oder Codeverbesserungen? Zu Zweiterem:
    empfohlene VS-Einstellungen aktivieren, IIF() durch If() ersetzen, ein Char wird so "geschrieben": "."c, Boolean-Vergleiche mit True sind überflüssig, leere EventHandler löschen, Fange nur Exceptions ab, die Du kennst und sinnvoll bearbeiten kannst
    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.
    Danke @VaporiZed !
    Das sind alles alte Gewohnheiten und habe das ganze natürlich sofort angepasst.

    Zum Thema Funktion habe ich noch ein dickes Problem! In meinem RTF-Dokument ist ein Absatz mit einer anderen Schriftart "Spongeboy", welche bei mir im System registriert ist.
    Aus dem RTF lese ich den Font-Table und erstelle mir eine List(of Font).
    Migradoc hat jedoch eine eigene Klasse dafür: MigraDoc.DocumentObjectModel.Font

    Das Problem
    Erstelle ich nun eine Instanz mit

    VB.NET-Quellcode

    1. Dim myFnt as new MigraDoc.DocumentObjectModel.Font(fontList(fontNameIdx).Name)

    dann erhalte ich einen Fehler beim speichern des PDF's:

    Quellcode

    1. System.NullReferenceException
    2. HResult=0x80004003
    3. Nachricht = Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    4. Quelle = PdfSharp-gdi
    5. Stapelüberwachung:
    6. bei PdfSharp.Fonts.OpenType.OpenTypeFontface.CreateFontSubSet(Dictionary`2 glyphs, Boolean cidFont)
    7. bei PdfSharp.Pdf.Advanced.PdfTrueTypeFont.PrepareForSave()
    8. bei PdfSharp.Pdf.Advanced.PdfFontTable.PrepareForSave()
    9. bei PdfSharp.Pdf.PdfDocument.PrepareForSave()
    10. bei PdfSharp.Pdf.PdfDocument.DoSave(PdfWriter writer)
    11. bei PdfSharp.Pdf.PdfDocument.Save(Stream stream, Boolean closeStream)
    12. bei PdfSharp.Pdf.PdfDocument.Save(String path)
    13. bei RTF_Parser.RTF_Parser.Save() in C:\Users\dejav\source\repos\RTF-Parser\RTF-Parser\classes\RTF-Parser.vb: Zeile224


    Was mache ich falsch?

    Aus dem Quellcode von PDFSharp werde ich leider nicht schlau:

    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Creates a new font image that is a subset of this font image containing only the specified glyphs.
    3. /// </summary>
    4. public OpenTypeFontface CreateFontSubSet(Dictionary<int, object> glyphs, bool cidFont)
    5. {
    6. // Create new font image
    7. OpenTypeFontface fontData = new OpenTypeFontface(this);
    8. // Create new loca and glyf table
    9. IndexToLocationTable locaNew = new IndexToLocationTable();
    10. locaNew.ShortIndex = loca.ShortIndex;
    11. GlyphDataTable glyfNew = new GlyphDataTable();
    12. // Add all required tables
    13. //fontData.AddTable(os2);
    14. if (!cidFont)
    15. fontData.AddTable(cmap);
    16. if (cvt != null)
    17. fontData.AddTable(cvt);
    18. if (fpgm != null)
    19. fontData.AddTable(fpgm);
    20. fontData.AddTable(glyfNew);
    21. fontData.AddTable(head);
    22. fontData.AddTable(hhea);
    23. fontData.AddTable(hmtx);
    24. fontData.AddTable(locaNew);
    25. if (maxp != null)
    26. fontData.AddTable(maxp);
    27. //fontData.AddTable(name);
    28. if (prep != null)
    29. fontData.AddTable(prep);
    30. // Get closure of used glyphs.
    31. glyf.CompleteGlyphClosure(glyphs);
    32. // Create a sorted array of all used glyphs.
    33. int glyphCount = glyphs.Count;
    34. int[] glyphArray = new int[glyphCount];
    35. glyphs.Keys.CopyTo(glyphArray, 0);
    36. Array.Sort(glyphArray);
    37. // Calculate new size of glyph table.
    38. int size = 0;
    39. for (int idx = 0; idx < glyphCount; idx++)
    40. size += glyf.GetGlyphSize(glyphArray[idx]);
    41. glyfNew.DirectoryEntry.Length = size;
    42. // Create new loca table
    43. int numGlyphs = maxp.numGlyphs;
    44. locaNew.LocaTable = new int[numGlyphs + 1];
    45. // Create new glyf table
    46. glyfNew.GlyphTable = new byte[glyfNew.DirectoryEntry.PaddedLength];
    47. // Fill new glyf and loca table
    48. int glyphOffset = 0;
    49. int glyphIndex = 0;
    50. for (int idx = 0; idx < numGlyphs; idx++)
    51. {
    52. locaNew.LocaTable[idx] = glyphOffset;
    53. if (glyphIndex < glyphCount && glyphArray[glyphIndex] == idx)
    54. {
    55. glyphIndex++;
    56. byte[] bytes = glyf.GetGlyphData(idx);
    57. int length = bytes.Length;
    58. if (length > 0)
    59. {
    60. Buffer.BlockCopy(bytes, 0, glyfNew.GlyphTable, glyphOffset, length);
    61. glyphOffset += length;
    62. }
    63. }
    64. }
    65. locaNew.LocaTable[numGlyphs] = glyphOffset;
    66. // Compile font tables into byte array
    67. fontData.Compile();
    68. return fontData;
    69. }


    Gruß hassowuff
    Dateien
    • RTF-Parser.zip

      (1,36 MB, 57 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

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

    @hassowuff Überleg mal, nicht den RichText zu parsen, sondern zeichenweise den SelectedText abzufragen auf allerlei Selection~~~-Properties.
    docs.microsoft.com/de-de/dotne…t?view=windowsdesktop-6.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany

    Brauch ich dann nicht letztlich eine "virtuelle" RichTextBox in meiner Klasse? Und wie komm ich dann an die Informationen zu Absätzen, Tabellen und Bildern?
    Theorethisch ist meine Klasse im Moment noch ziemlich Chaotisch, denn die Strukturierung von Migradoc und RTF liegen nah bei einander.

    Siehe hier: pdfsharp.net/wiki/HelloMigraDoc-sample.ashx

    Gruß Hassowuff
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

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

    Richtextformat Parsen, Schritt 3

    Hallo Ihr beiden,

    Nach einem "Cleanup" meines Codes und einigen Anpassungen an die Strukturierung von Migradoc sieht das ganze jetzt schon ganz ordentlich aus. :thumbup: (IM ANHANG!)

    Könnt ihr mir an zwei Stellen etwas auf die Sprünge helfen?

    Stelle 1

    :huh: Hier gibt es doch bestimmt eine bessere Lösung, oder?

    VB.NET-Quellcode

    1. Private Sub PrepareRawRtf()
    2. RawRtf = RawRtf.Replace("\'e4", "ä")
    3. RawRtf = RawRtf.Replace("\'f6", "ö")
    4. RawRtf = RawRtf.Replace("\'fc", "ü")
    5. RawRtf = RawRtf.Replace("\'c4", "Ä")
    6. RawRtf = RawRtf.Replace("\'d6", "Ö")
    7. RawRtf = RawRtf.Replace("\'dc", "Ü")
    8. RawRtf = RawRtf.Replace("\'df", "ß")
    9. End Sub


    Stelle 2

    ?( Immernoch das Schriftarten-Problem:

    VB.NET-Quellcode

    1. Private Sub AddCommand(name As String, value As String)
    2. Commands.Add(name & "=" & value) ' Save name and value to an List(of String) -> for Debug!
    3. Select Case name
    4. '...
    5. Case "f" ' font-selector
    6. ' Value = indexnumber at Fontlist
    7. fontNameIdx = Integer.Parse(value)
    8. 'TODO: Schriftart ändern:
    9. 'mdStyleActive.Font.Name = FontList(fontNameIdx).Name
    10. '...
    11. Case Else
    12. Debug.WriteLine("Unknown Command: " & name & "=" & value)
    13. End Select
    14. End Sub


    Danke für eure Mithilfe!

    Gruß hassowuff
    Dateien
    • RTF-Parser.zip

      (1,36 MB, 44 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]
    aus Zeitgründen nur 1. Miniproblem: einfach weitere Replaces dranhängen.
    RawRtf = RawRtf.Replace("\'e4", "ä").Replace("\'f6", "ö").Replace…
    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.

    hassowuff schrieb:

    Und wie komm ich dann an die Informationen zu Absätzen, Tabellen und Bildern?
    Klar.
    Mir fiel auf, dass der PDF-Export ein chaotisches Dokument erzeugt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Richtextformat Parsen, Schritt 3

    Guten Morgen!

    Ich bin schon wieder fleißig und habe das Parsing nocheinmal überarbeitet! (Aktuelles Projekt im Anhang)

    Folgendes hat sich geändert:
    • Anstelle alles Zeichen für Zeichen zu durchlaufen, bediene ich mich Regex.Match um Befehl-Wert-Paare zu finden
    • Trennen der Befehl-Wert-Paare wird nun auch durch Regex.Match erledigt
    • Die Verschachtelungen durch "{" und "}" werden nun erkannt, aber bislang nicht weiter verarbeitet
    • Der ColorTable und der FontTable könnten besser und fehlerfrei erkannt werden, da diese nicht mehr gesucht werden müssten (ABER: habe ich noch nicht ganz fertig!)
    • Befehl-Wert-Paare sind nun weitestgehend erfasst, werden aber bisher nur die wenigsten verarbeitet (Hier hätte ich gern eure Mithilfe :whistling: )
    • Textformatierungen werden direkt und ohne Umweg in Migradoc gesetzt ("mdFormat.Style")
    Was noch nicht klappt:
    • Eingebettete Bilder einlesen und in Migradoc ins Dokument schreiben (Hier hätte ich gern eure Mithilfe :whistling: )
    • Textausrichtungen
    • Sub- und Superscript
    • Schriftarten (Hier hätte ich gern eure Mithilfe :whistling: )
    • Tabellen & Linien/Rahmen
    • Listen werden noch nicht richtig bzw. nur teilweise erkannt
    Ich brauch eure Hilfe:
    • Beim einlesen der eingebetteten PNG-Grafiken
    • Beim setzen der Schriftarten in Migradoc
    • Und wer Lust hat, darf sich auch gern der Thematik "Tabellen" annehmen, da fürchte ich mich noch ein wenig davor
    NUGET-Paket im Projekt: "PDFsharp-MigraDoc-gdi" (v1.50.5147) von "empira Software GmbH" (MIT-License)

    PS an @RodFromGermany: Ja das PDF sieht noch sehr chaotisch aus, weil ja viele RTF-Tags noch nicht umgesetzt werden, bzw. bisher nicht erkannt wurden. (Jetzt ist es ein wenig besser)

    Danke und Gruß,

    hassowuff
    Dateien
    • RTF-Parser.zip

      (1,37 MB, 44 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

    Richtextformat Parsen, Schritt 3

    Kurzes Update!

    Eingebettete Bilder einlesen und in Migradoc ins Dokument schreiben (Hier hätte ich gern eure Mithilfe :whistling: )


    Ist erledigt und Update im Anhang! :thumbsup:

    Liebe Grüße,

    hassowuff
    Dateien
    • RTF-Parser.zip

      (1,38 MB, 39 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

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

    @hassowuff Falls Dein primäres Ziel eine PDF-Erstellung aus einem RichText ist, sieh Dir mal dieses Projekt an:
    WriteItDown00.zip
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RTF to Migradoc/PDF Parser

    Hoch die Hände! Wochenende!

    Hallo Ihr lieben, ich wollte mich mal wieder mit einem kleinen Update melden!
    Ich bin mittlerweile an gutes Stück vorangekommen.

    Danke auch nochmal an @RodFromGermany für das Beispielprojekt! Die Idee ist genial, aber DLL-Imports und Marshalls waren irgendwie noch nie meine Welt und wollen einfach keinen Fuß fassen in meinem Kopf.

    Was geht bisher?
    • Die meisten Textformatierungen, wie Farbe, Fett, Kursiv, Unterstrichen, Größe und Schriftart
    • Textausrichtung / Absatzbündigkeit, Blocksatz
    • In RTF gebettete PNG-Bilder
    • Tabellen (Ja ich hab's geschafft :thumbsup: )
    • Auflistungen (Noch verbuggt || )
    Was geht nicht?
    • Text-Highlights (unterstützt MigraDoc nicht || )
    • Verbundene Zeilen/Spalten einer Tabelle
    • und viele viele weitere Dinge, sofern man sich an RTF-Dokumentationen orientiert
    Seht euch das Projekt gern mal an, vielleicht gibt es ja noch Dinge, die ich Grundsätzlich verbessern kann.
    Dateien
    • RTF-Parser.zip

      (1,46 MB, 47 mal heruntergeladen, zuletzt: )
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

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