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
Недостатки:
- Я не уверен, хоПри активной разработке
- Цена
База знаний об использовании:
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();
}
}