-
שפת תכנות: c# winform
שאלה מקורית:
איך ניתן לשלוח טקסט מעוצב למייל
(טקסט מעוצב = מודגש / גודל גופן / צבע גופן / קו תחתי)מה יש לי?
יש לי richTextBox שאני מאפשר למשתמש לכתוב ולעצב את תוכן הטקסט
ושולח את זה כגוף ההודעה באמצעות MailMessagemail.Body = richTextBox1.Text; mail.IsBodyHtml = true;
וע"מ שהתוכן יגיע מעוצב למייל
צריך 'להמיר' את הrichTextBox לHTMLכגון:
mail.Body = richTextBox1.Text.Replace("\n", "<br>\r\n").Replace(" ", " "); mail.IsBodyHtml = true;
בהתחלה התפזרתי וניסיתי להגיע להמרה רוחבית כוללת של כל האפשריות (כולל תמונה / טבלאות וכד')
זה גדול עלי בשלב זה
ולא כ"כ נצרך עבורי כי אני מאפשר צירוף קובץניסתי להתמקד בלהמיר טקסט בלבד ולמספר אפשריות מצומצם
- גודל גופן (לאפשר שלושה גדלים בלבד)
- להדגיש (Bold)
- קו תחתון (Underline)
- צבע גופן (אדום/שחור/כחול)
- צבע רקע (צהוב / אדום)
כך ש'בגדול' 'תאורטי' 'אולי' 'אפשר'
לבצע המרה פשוטה של התווים באמצעות Replaceאז מה השאלה?
- האם הנ"ל בכיוון הנכון (או שזה יותר דומה לבשל ביצה קשה בקומקום ולהכין חביתה על מגהץ)
- איך אני מקבל את המידע מrichTextBox מה העיצוב של כל תו
-
@mekev חיפשתי בגוגל C# RTF TO HTML.
הגעתי לתשובה בסטאק ששלחה לתשובה הזאת:
https://stackoverflow.com/questions/439301/convert-rtf-to-html
ממעבר על התשובות בחרתי בשניים:
א. https://docs.microsoft.com/en-us/archive/blogs/jmstall/writing-an-rtf-to-html-converter-posting-code-in-blogs
ניסיתי את זה, זה לא בשל לגמרי זה רק שלד טוב.ב. מאמר בcodeproject ששמו Writing Your Own RTF Converter
לא היה לי כח לבדוק.בחיפוש של C# RTF2HTML מצאתי ספריה בגיטאב https://github.com/mkoertgen/Rtf2Html
גם זה לא בדקתי.בקיצור מכל אלו אני הייתי ממשיך עם הראשון, להלן הקוד הרלוונטי:
static string Escape(string st) { st = st.Replace("&", "&"); st = st.Replace("<", "<"); st = st.Replace(">", ">"); return st; } static void Format(TextWriter tw, string rtf) { tw.Write("<html><pre>"); tw.Write("<span color=black>"); int idx = 0; while (idx < rtf.Length) { // Get any text up to a '\'. Regex r1 = new Regex(@"(.*?)\\", RegexOptions.Singleline | RegexOptions.IgnoreCase); Match m = r1.Match(rtf, idx); if (m.Length == 0) break; // text will be empty if we have adjacent control words string stText = m.Groups[1].ToString(); tw.Write(Escape(stText)); idx += m.Length; // check for RTF escape characters. According to the spec, these are the only escaped chars. char chNext = rtf[idx]; if (chNext == '{' || chNext == '}' || chNext == '\\') { // Escaped char tw.Write(chNext); idx++; continue; } // Must be a control char. @todo- delimeter includes more than just space, right? Regex r2 = new Regex(@"([\{a-z]+)([0-9]*) ", RegexOptions.Singleline | RegexOptions.IgnoreCase); m = r2.Match(rtf, idx); string stCtrlWord = m.Groups[1].ToString(); string stCtrlParam = m.Groups[2].ToString(); if (stCtrlWord == "cf") { // Set font color. int iColor = Int32.Parse(stCtrlParam); tw.Write("</span>"); // close previous span, and start a new one for the given color. tw.Write("<span style=\"color: " + m_colorTable[iColor] + "\">"); } else if (stCtrlWord == "fs") { // Sets font size. ignore } else { //throw new ArgumentException("Unrecognized control word '" + stCtrlWord + stCtrlParam + "'after:" + stText); } idx += m.Length; } tw.Write(Escape(rtf.Substring(idx))); // rest of string tw.Write("</pre></html>"); } static string[] m_colorTable = new string[] { // rrGGbb "#000000", // default, starts at index 0 "#000000", // real color table starts at index 1 "#0000FF", "#00ffFF", "#00FF00", "#FF00FF", "#FF0000", "#FFFF00", "#FFffFF", "#000080", "#008080", "#008000", "#800080", "#800000", "#808000", "#808080", "#c0c0c0" };
כפי שאתה רואה הוא לא מימש את שינוי גודל הטקסט, ולפי מה שבדקתי יש הרבה דברים שהוא לא טיפל אבל הם לא דברים פשוטים שיש בפקד הrtf.
אתה אמור לקרוא למתודה הזו ככה:using (var tw = new StreamWriter("output.html", false, Encoding.UTF8)) Format(tw, richTextBox1.Rtf);
אתה בעצם לא צריך קובץ אלא HTML כסטרינג, אז ככה:
using (var mw = new MemoryStream()) { using (var tw = new StreamWriter(mw, Encoding.UTF8)) Format(tw, richTextBox1.Rtf); var html = Encoding.UTF8.GetString(mw.ToArray()); }
-