【问题标题】:C# .net converting HTML to RTF [closed]C# .net 将 HTML 转换为 RTF [关闭]
【发布时间】:2011-08-20 19:50:00
【问题描述】:

HTML to RTF Converter for .NET 有另一个帖子,但是有任何开源转换器或教程吗?我不想使用Sautinsoft。我认为 ExpertsExchange 有解决方案,但我必须为此付费。 google 上的大部分搜索结果都指向 RTF 到 html 转换器,而不是 html 到 RTF 转换器。

【问题讨论】:

    标签: c# html rtf


    【解决方案1】:

    创建一个网络浏览器。使用 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。

    【讨论】:

    • @frenchone 对于这些,您可以使用 Word 互操作,模拟粘贴到 Word 文档中,然后复制并粘贴到 Richtextbox 中,然后获取 rtf。
    • 感谢您的评论,但我们会尝试删除“MS Office”依赖项。您的解决方案看起来很简单,即使它需要一个 winform 参考(而我们的项目是一个控制台)。太糟糕了,没有专门的 system.dll 来进行转换。而且该richtextbox 的行为不像能够正确转换的写字板。
    • @frenchone 如果你使用richtextbox v5,而不是VS中默认的4,超链接和表格会更好看。但它不能解决图像问题。
    • 这个回答很有帮助
    • 这很聪明。非常笨拙,但仍然很聪明!不确定它会扩展......
    【解决方案2】:

    TL;DR:如果可能,我建议使用OpenXml 格式和HtmlToOpenXml nuget 包。


    Microsoft Word COM

    我并没有真正搜索过这个主题,因为我的用例是在服务器上使用该功能,这使得 COM 组件不是一个很好的选择。


    XHTML2RTF

    正如@IAmTimCorey 所说,您可以使用这个代码项目库。

    缺点是:

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

    Windows 窗体 Web 浏览器

    正如@Jerry 所说,您可以使用 Windows 窗体 WebBrowser 控件。

    缺点是:

    • 对 System.Windows.Forms 的引用
    • 使用复制和粘贴(多线程有问题)
    • 仅适用于 STA 线程

    不支持的功能包括:

    • 字体
    • 颜色
    • 编号列表
    • 删除线(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 所示。

    未知实际支持什么。

    缺点是:

    • 价格
    • 一件小事有很多参考资料
    • 更多?

    不支持的功能包括:

    • Striketrough(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();
    }
    

    更多示例和配置选项可以在herehere找到。

    Supported is the following:

    • HTML 3.2
    • HTML 4.01
    • HTML 5
    • CSS
    • XHTML

    缺点是:

    • 我不确定开发的活跃程度
    • 价格

    使用知识库:


    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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      ExpertsExchange 文章充其量只是一篇糟糕的文章。基本上,OP 放弃了,因为他们无法给出一个好的答案。他们列出了 CodeProject 文章 (http://www.codeproject.com/KB/HTML/XHTML2RTF.aspx) 的链接,该文章向您展示了如何将 HTML 转换为 RTF,但它并不是真正的 .NET 解决方案。相反,它需要高度适应。

      根据我的经验,没有一个好的开源转换器。这些碎片似乎都在那里,但它正在等待有人把它们放在一起。但是,您的问题的直接答案是目前还没有转换器。

      【讨论】:

      • 我刚刚经历了这次学习经历,并选择使用 PERL,它确实有一个很好的现成的 OSS 解决方案。 (HTML::FormatRTF)
      • @Jason D - 很高兴知道。
      【解决方案4】:

      似乎有一个基于 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

      【讨论】:

      • 我使用的 MarkupConverter 效果很好,但是当用户的屏幕设置为大于 100% 的比例时,它对我的​​应用程序产生了奇怪的影响。到目前为止,这对我有用,干得好!
      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2011-01-03
      • 2012-02-17
      • 2011-09-28
      • 1970-01-01
      • 2016-04-18
      • 2010-10-08
      相关资源
      最近更新 更多