【发布时间】:2011-08-20 19:50:00
【问题描述】:
HTML to RTF Converter for .NET 有另一个帖子,但是有任何开源转换器或教程吗?我不想使用Sautinsoft。我认为 ExpertsExchange 有解决方案,但我必须为此付费。 google 上的大部分搜索结果都指向 RTF 到 html 转换器,而不是 html 到 RTF 转换器。
【问题讨论】:
HTML to RTF Converter for .NET 有另一个帖子,但是有任何开源转换器或教程吗?我不想使用Sautinsoft。我认为 ExpertsExchange 有解决方案,但我必须为此付费。 google 上的大部分搜索结果都指向 RTF 到 html 转换器,而不是 html 到 RTF 转换器。
【问题讨论】:
创建一个网络浏览器。使用 html 内容加载它。全选并从中复制。粘贴到富文本框中。然后你就有了 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 具有从 HTML 转换而来的 RTF。
【讨论】:
TL;DR:如果可能,我建议使用OpenXml 格式和HtmlToOpenXml nuget 包。
Microsoft Word COM
我并没有真正搜索过这个主题,因为我的用例是在服务器上使用该功能,这使得 COM 组件不是一个很好的选择。
XHTML2RTF
正如@IAmTimCorey 所说,您可以使用这个代码项目库。
缺点是:
Windows 窗体 Web 浏览器
正如@Jerry 所说,您可以使用 Windows 窗体 WebBrowser 控件。
缺点是:
不支持的功能包括:
del 元素)DevExpress
来自devexpress support center 的“Paul V”代码示例。 (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 类型,如this example 所示。
未知实际支持什么。
缺点是:
不支持的功能包括:
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();
}
缺点是:
使用知识库:
DIY
如果您只想支持有限的功能,您可以编写自己的转换器。如果支持的功能集太大,我不建议这样做。 (Sautinsoft 声称已经编写了超过 20,000 行代码)。
我有一个小的sample project here,但目前仅用于教育目的。
OpenXml
如果OpenXml format 也适合您的用例,您可以使用HtmlToOpenXml nuget package。它是免费的,并且支持我测试过其他解决方案的所有功能。
The project 基于 microsoft 的 Open Xml SDK,看起来很活跃。
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();
}
}
【讨论】:
ExpertsExchange 文章充其量只是一篇糟糕的文章。基本上,OP 放弃了,因为他们无法给出一个好的答案。他们列出了 CodeProject 文章 (http://www.codeproject.com/KB/HTML/XHTML2RTF.aspx) 的链接,该文章向您展示了如何将 HTML 转换为 RTF,但它并不是真正的 .NET 解决方案。相反,它需要高度适应。
根据我的经验,没有一个好的开源转换器。这些碎片似乎都在那里,但它正在等待有人把它们放在一起。但是,您的问题的直接答案是目前还没有转换器。
【讨论】:
似乎有一个基于 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
【讨论】: