Konversi rtf ke xml dalam C #

Dalam kelanjutan dari serangkaian posting tentang mengkonversi file teks ke xml menggunakan C #, saya mengusulkan untuk pindah ke mengkonversi file rtf .


Tampaknya format ini sangat kuno, dan sangat umum, dan jika tidak ada pustaka untuk itu mengkonversi semua data ke format xml dengan memanggil satu metode, maka pasti ada semacam solusi dari Microsoft, setidaknya mirip dengan OpenXML . Namun, jika ya, maka artikel ini tidak akan ditulis.


Jadi apa itu file ReachTextFile (rtf) ? Pada umumnya, isi file sudah terstruktur dan bahkan mengingatkan pada campuran json, xml dan xpath. Ini dapat dengan mudah diverifikasi dengan menyimpan beberapa dokumen Word dalam format rtf , dan kemudian mencoba membacanya dalam editor teks seperti Notepad ++ :



Saya menyoroti dalam merah sepotong file yang berisi informasi tentang pengkodean: secara umum, tag dienkripsi dengan pengkodean ansi, dan teks itu sendiri dikodekan dengan ansicpg1251. Teks itu sendiri terlihat seperti ini:



, , , , … , , , , php.


, , , , , , , . - .


, , , rtf RichTextBox, :


  • -, Windows.Forms, .
  • -, . , RichTextBox , , .

, nuget RtfPipe. .


RtfPipe . rtf html. , HtmlAgilityPack.


, - ? : , , , , . , rtf- , , , , — , , , , , .


, .


public string Convert(Stream stream)
        {
            stream.Position = 0;
            string rtf = string.Empty;
            using (StreamReader sr = new StreamReader(stream))
            {
                rtf = sr.ReadToEnd();
            }
            //      RtfPipe  Core 
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            //    RtfPipe  html
            var html = Rtf.ToHtml(rtf);
            //  html     ,   xml
            return ClearHtml(html);
        }

  1. string. RtfPipe. ,
  2. , .Net Core Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);. RtfPipe. .
    .Net Framework, .
  3. var html = Rtf.ToHtml(rtf); — html . , , , ( ), .


string ClearHtml(string html), xml:


string ClearHtml(string html)
{
    //  html   HtmlAgilityPack
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    //    (),     style
    var elementsWithStyleAttribute = doc.DocumentNode.SelectNodes("//@style");
    //   ,    
    var excessNodes = doc.DocumentNode.SelectNodes("//b|//u|//strong|//br");
    //     html
    foreach (var element in excessNodes)
    {
        element.ParentNode.InnerHtml = element.InnerText;
        element.Remove();
    }
    foreach (var element in elementsWithStyleAttribute)
    {
        element.Attributes["style"].Remove();
    }
    //    html
    using (StringWriter writer = new StringWriter())
    {
        doc.Save(writer);
        html = writer.ToString();
    }
    //   html  xml
    StringBuilder xml = new StringBuilder();
    xml.Append("<?xml version=\"1.0\"?><documents><document>");
    xml.Append(html);
    xml.Append("</documents></document>");
    return xml.ToString();
}

  1. , HtmlAgilityPack nuget
  2. doc HtmlDocument html
  3. , , . , style, , , , .
  4. C , StringBuilder xml, .

, , , .



docx xlsx


All Articles