דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. c# איך לשלוח טקסט מעוצב למייל || איך להמיר richTextBox to html

c# איך לשלוח טקסט מעוצב למייל || איך להמיר richTextBox to html

מתוזמן נעוץ נעול הועבר תכנות
4 פוסטים 3 כותבים 255 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • M מנותק
    M מנותק
    mekev
    כתב ב נערך לאחרונה על ידי
    #1

    שפת תכנות: c# winform

    שאלה מקורית:
    איך ניתן לשלוח טקסט מעוצב למייל
    (טקסט מעוצב = מודגש / גודל גופן / צבע גופן / קו תחתי)

    מה יש לי?
    יש לי richTextBox שאני מאפשר למשתמש לכתוב ולעצב את תוכן הטקסט
    ושולח את זה כגוף ההודעה באמצעות MailMessage

    mail.Body = richTextBox1.Text;
    mail.IsBodyHtml = true;
    

    וע"מ שהתוכן יגיע מעוצב למייל
    צריך 'להמיר' את הrichTextBox לHTML

    כגון:

     mail.Body = richTextBox1.Text.Replace("\n", "<br>\r\n").Replace(" ", "&nbsp;");          
    mail.IsBodyHtml = true;
    

    בהתחלה התפזרתי וניסיתי להגיע להמרה רוחבית כוללת של כל האפשריות (כולל תמונה / טבלאות וכד')
    זה גדול עלי בשלב זה
    ולא כ"כ נצרך עבורי כי אני מאפשר צירוף קובץ

    ניסתי להתמקד בלהמיר טקסט בלבד ולמספר אפשריות מצומצם

    1. גודל גופן (לאפשר שלושה גדלים בלבד)
    2. להדגיש (Bold)
    3. קו תחתון (Underline)
    4. צבע גופן (אדום/שחור/כחול)
    5. צבע רקע (צהוב / אדום)

    כך ש'בגדול' 'תאורטי' 'אולי' 'אפשר'
    לבצע המרה פשוטה של התווים באמצעות Replace

    אז מה השאלה?

    1. האם הנ"ל בכיוון הנכון (או שזה יותר דומה לבשל ביצה קשה בקומקום ולהכין חביתה על מגהץ)
    2. איך אני מקבל את המידע מrichTextBox מה העיצוב של כל תו
    dovidD D M 3 תגובות תגובה אחרונה
    0
    • dovidD מחובר
      dovidD מחובר
      dovid ניהול
      השיב לmekev ב נערך לאחרונה על ידי dovid
      #2

      @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("&", "&amp;");
          st = st.Replace("<", "&lt;");
          st = st.Replace(">", "&gt;");
          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());
      }
      

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      5
      • D מנותק
        D מנותק
        dotnet
        השיב לmekev ב נערך לאחרונה על ידי dotnet
        #3

        @mekev
        הכי קל להשתמש במה שאחרים כבר הכינו

        תסתכל פה:
        https://sautinsoft.com/products/rtf-to-html/how-to-convert-rtf-to-html-csharp.php

        או בספרייה ש @dovid הביא: Rtf2Html

        תגובה 1 תגובה אחרונה
        2
        • M מנותק
          M מנותק
          mekev
          השיב לmekev ב נערך לאחרונה על ידי
          #4

          @mekev
          עדכון:
          מישהו לחש על אוזני לעשות חיפוש פשוט בNuGet
          והספריה הראשונה פשוט עבדה.....

          7c1faf60-1880-43ad-8c42-3bc9b38b3bb7-image.png

          תגובה 1 תגובה אחרונה
          6
          • dovidD dovid העביר נושא זה מ-תכנות ב-

          בא תתחבר לדף היומי!
          • התחברות

          • אין לך חשבון עדיין? הרשמה

          • התחברו או הירשמו כדי לחפש.
          • פוסט ראשון
            פוסט אחרון
          0
          • דף הבית
          • קטגוריות
          • פוסטים אחרונים
          • משתמשים
          • חיפוש
          • חוקי הפורום