C # .net преобразование HTML в RTF - PullRequest
6 голосов
/ 07 мая 2011

Есть еще один пост на Конвертер HTML в RTF для .NET , но есть ли конвертеры с открытым исходным кодом или учебные пособия? Я не хочу использовать Sautinsoft . Я думаю, что есть решение на ExpertsExchange, но я должен заплатить за это. Большинство результатов поиска в Google указывают на конвертер RTF в HTML, но не конвертер HTML в RTF.

Ответы [ 4 ]

14 голосов
/ 01 мая 2013

Создать веб-браузер.Загрузите его с содержанием HTML.Выберите все и скопируйте с него.Вставьте в richtextbox.Тогда у вас есть RTF

string html = "...."; // html content
RichTextBox rtbTemp = new RichTextBox();
WebBrowser wb = new WebBrowser();
wb.Navigate("about:blank");

wb.Document.Write(html);
wb.Document.ExecCommand("SelectAll", false, null);
wb.Document.ExecCommand("Copy", false, null);

rtbTemp.SelectAll();
rtbTemp.Paste();

Теперь rtbTemp.RTF имеет RTF, преобразованный из HTML.

3 голосов
/ 09 апреля 2018

TL; DR: Я рекомендую использовать формат OpenXml и пакет HtmlToOpenXml nuget, если это возможно.


Microsoft Word COM

На самом деле я не особо разыскивал эту тему, так как мой вариант использования - использовать функциональность на сервере, что делает COM-компоненты не лучшим выбором.


XHTML2RTF

Как уже упоминалось @IAmTimCorey, вы можете использовать эту библиотеку codeproject.

Недостатки:

  • Ограниченная поддержка HTML и CSS
  • Не совсем .NET
  • ...

Браузер Windows Forms

Как упомянул @JerryВы можете использовать элемент управления Windows Forms WebBrowser.

Недостатки:

  • Ссылка на System.Windows.Forms
  • Использование копирования и вставки (проблематично для многопоточности)
  • Работает только в потоке STA

Не поддерживаются следующие функции:

  • Шрифты
  • Цвета
  • Нумерованные списки
  • Зачеркивание (del элемент)
  • ...

DevExpress

Пример кода "Paul V" из центра поддержки devexpress .(03.02.2015)

public String ConvertRTFToHTML(String RTF)
{   
    MemoryStream ms = new MemoryStream();
    StreamWriter writer = new StreamWriter(ms);
    writer.Write(RTF);
    writer.Flush();
    ms.Position = 0;
    String output = "";
    HtmlEditorExtension.Import(HtmlEditorImportFormat.Rtf, ms, (s, enumerable) => output = s);

    return output;
}

public String ConvertHTMLToRTF(String Html)
{
    MemoryStream ms = new MemoryStream();
    var editor = new ASPxHtmlEditor { Html = html };

    editor.Export(HtmlEditorExportFormat.Rtf, ms);

    ms.Position = 0;
    StreamReader reader = new StreamReader(ms);

    return reader.ReadToEnd();
}

Или вы можете использовать тип RichEditDocumentServer, как показано в в этом примере .

Неизвестно, что на самом деле поддерживается.

Недостатки:

  • Цена
  • Довольно много ссылок на одну маленькую вещь
  • Еще?

К числу не поддерживаемых функций относятся:

  • Зачеркивание (del элемент)

Sautinsoft

public string ConvertHTMLToRTF(string html)
{
    SautinSoft.HtmlToRtf h = new SautinSoft.HtmlToRtf();
    return h.ConvertString(htmlString);
}

public string ConvertRTFToHTML(string rtf)
{
    SautinSoft.RtfToHtml r = new SautinSoft.RtfToHtml();
    byte[] bytes = Encoding.ASCII.GetBytes(rtf);
    r.OpenDocx(bytes );
    return r.ToHtml();
}

Дополнительные примеры и варианты конфигурации можно найти здесь и здесь .

Поддерживается следующее :

  • HTML 3,2
  • HTML 4,01
  • HTML 5
  • CSS
  • XHTML

Недостатки:

  • Я не уверен, хоПри активной разработке
  • Цена

База знаний об использовании:

  • Преобразование нумерованных списков из trix angular editor уничтожает Indend

DIY

Если вы хотите поддерживать только ограниченную функциональность, вы можете написать свой собственный конвертер.Я бы не рекомендовал это, если поддерживаемый набор функций слишком велик.(Sautinsoft утверждает, что написал более 20 000 строк кода).

У меня есть небольшой пример проекта здесь , но только в образовательных целях в его текущем состоянии.


OpenXml

Если формат OpenXml также подходит для вашего случая использования, вы можете использовать пакет HtmlToOpenXml nuget .Он бесплатный и поддерживает все функции, с которыми я тестировал другие решения.

Проект основан на Open Xml SDK от Microsoft и кажется активным.

public static byte[] ConvertHtmlToOpenXml(string html)
{
    using (var generatedDocument = new MemoryStream())
    {
        using (var package = WordprocessingDocument.Create(generatedDocument, WordprocessingDocumentType.Document))
        {
            var mainPart = package.MainDocumentPart;
            if (mainPart == null)
            {
                mainPart = package.AddMainDocumentPart();
                new Document(new Body()).Save(mainPart);
            }

            var converter = new HtmlConverter(mainPart);
            converter.ParseHtml(html);

            mainPart.Document.Save();
        }

        return generatedDocument.ToArray();
    }
}

3 голосов
/ 07 мая 2011

Статья ExpertsExchange в лучшем случае плохая. По сути, ОП сдался, потому что они не могли дать хороший ответ. Они перечисляют ссылку на статью CodeProject (http://www.codeproject.com/KB/HTML/XHTML2RTF.aspx), в которой показано, как преобразовать HTML в RTF, но на самом деле это не решение .NET. Вместо этого это должно быть что-то, что должно быть сильно адаптировано.

По моему опыту, не существует хорошего конвертера с открытым исходным кодом. Кажется, что все кусочки есть, но кто-то ждет, чтобы сложить все вместе. Однако немедленный ответ на ваш вопрос заключается в том, что конвертера там уже нет.

0 голосов
/ 25 марта 2019

Похоже, есть новое решение с открытым исходным кодом, основанное на WPF RichTextBox.Единственное предостережение в том, что в ядре поддерживаются только STAThreaded-приложения, и для использования в то есть ASP.net вам нужно вызвать его в STAThread (но в записи есть пример для этого).

Для использования в надстройках VSTO это подтверждается для работы (т.е. Outlook RTFBody)

Nuget: https://www.nuget.org/packages/MarkupConverter/

Проект: https://github.com/figuemon/MarkupConverter

Запись: https://code.msdn.microsoft.com/Converting-between-RTF-and-aaa02a6e

...