C# .net将HTML转换为RTF

14
有另一篇文章在HTML to RTF Converter for .NET,但是否有任何开源转换器或教程可用?我不想使用Sautinsoft。我认为在ExpertsExchange上有一个解决方案,但需要付费。谷歌搜索结果中大多数指向RTF到html转换器,而不是HTML到RTF转换器。
4个回答

22
创建一个WebBrowser。使用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中存储了从HTML转换的RTF格式。


@frenchone 对于这些,您可以使用Word interop,模拟将内容粘贴到Word文档中,然后将其复制并粘贴到richtextbox中,最后获取rtf格式。 - Jerry
1
感谢您的评论,但我们尝试消除对“MS Office”的依赖。虽然您的解决方案看起来很简单,但它需要一个winform引用(而我们的项目是一个控制台项目)。太遗憾了,没有专门的system.dll来进行转换。并且那个richtextbox并不像wordpad那样可以正确地进行转换。 - frenchone
@frenchone 如果您使用richtextbox v5而不是VS中默认的版本4,则超链接和表格将呈现更好的效果。但它无法解决图片的问题。 - Jerry
这是非常有帮助的答案。 - Nikhil Ghuse
这很聪明。非常笨重,但仍然很聪明!不确定它是否可扩展... - Ben Power
这根本不起作用。 - user875234

13

简而言之: 我建议尽可能使用 OpenXml 格式和 HtmlToOpenXml nuget 包。


Microsoft Word COM

我没有对这个话题进行过深入的研究,因为我的用例是在服务器上使用功能,这使得 COM 组件不是一个很好的选择。


XHTML2RTF

如 @IAmTimCorey 所提到的,您可以使用此 codeproject 库。

缺点包括:

  • 支持的 HTML 和 CSS 有限
  • 不是真正的 .NET
  • ...

Windows Forms Web Browser

如 @Jerry 所提到的,您可以使用 Windows Forms WebBrowser 控件。

缺点包括:

  • 引用 System.Windows.Forms
  • 使用复制和粘贴(多线程问题)
  • 只能在 STA 线程中工作

不支持的特性包括:

  • 字体
  • 颜色
  • 编号列表
  • 删除线 (del 元素)
  • ...

DevExpress

devexpress 支持中心 的 "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类型,如此示例所示。

未知支持哪些实际功能。

缺点包括:

  • 价格
  • 为一个小事情引用了相当多的参考文献
  • 更多吗?

不支持的功能包括:

  • 删除线(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

缺点如下:

  • 开发活跃度不明确
  • 价格高

使用知识库:


自制

如果您只想支持有限的功能,可以编写自己的转换器。如果支持的功能集太大,我不建议这样做。(Sautinsoft声称已编写超过20,000行代码)。

我有一个小示例项目,但当前仅供教育目的。


OpenXml

如果OpenXml格式也适用于您的用例,则可以使用HtmlToOpenXml nuget包。它是免费的,并且支持我测试其他解决方案的所有功能。

该项目基于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();
    }
}


很好的回答。在OpenXml部分,您可以创建docx文件。是否有可能获得一个使用OpenXml的rtf示例? - cymek
这就是问题所在,OpenXml不支持RTF^^,所以如果可以的话,我建议不要使用RTF。 - NtFreX

5
这篇ExpertsExchange的文章是最差的。基本上,OP放弃了,因为他们不能给出一个好的答案。他们列出了一个链接到CodeProject文章(http://www.codeproject.com/KB/HTML/XHTML2RTF.aspx),该文章展示了如何将HTML转换为RTF,但它不是真正的.NET解决方案。相反,它需要高度适应。
从我的经验来看,目前没有一个好的开源转换器。所有的部件似乎都在那里,但等待着有人把它们组合起来。然而,你问题的直接答案是,目前没有已经存在的转换器。

4
我刚刚通过这次学习经历,选择使用了PERL,它有一个很好的现成、开源的解决方案。(HTML::FormatRTF) - Jason D
@Jason D - 很好知道。 - IAmTimCorey

2

我使用了MarkupConverter,它工作得很好,但当用户的屏幕缩放比例大于100%时,它会对我的应用程序产生奇怪的影响。到目前为止,这对我来说非常有效,做得好! - ecklerpa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接