代码之家  ›  专栏  ›  技术社区  ›  nickytonline

用于.NET的HTML到RTF转换器

  •  5
  • nickytonline  · 技术社区  · 16 年前

    我已经在网站上看到了很多关于从RTF到HTML的文章,还有其他一些关于从HTML到RTF转换器的文章,但是我真的在尝试全面分析那些被认为是最广泛使用的商业产品、开源产品,或者人们是否建议自己回家。如果您认为这是一个重复的问题,我很抱歉,但我正试图创建一个产品矩阵,以了解什么是我们的应用程序最可行的。我也认为这对其他人有帮助。

    转换器将在ASP.NET 2.0应用程序中使用(我们将很快升级到3.5,但仍然坚持使用WebForms),使用SQLServer2005(2008年即将推出)作为数据库。

    看了几篇文章, SautinSoft 作为商业组件似乎很流行。有没有其他的商业组件,你会建议将HTML转换成RTF?价格确实很重要,但即使价格有点贵,也请列出来。

    对于开源,我读到了 OpenOffice.org 可以作为服务运行,以便它可以转换文件。然而,这似乎只是基于Java的。我想,我需要某种互操作来使用它?什么.NET开源组件(如果有的话)可以用于将HTML转换为RTF?

    对于本土用户来说,XSLT是XHTML的发展之路吗?如果是这样,您建议生成XHTML的组件是什么?否则,你会推荐其他的本土植物。

    另外,请注意,我目前不太关心RTF到HTML。如果一个商业组件提供了这个,并且价格仍然相同,好的,否则请不要提及它。

    5 回复  |  直到 7 年前
        1
  •  0
  •   Community Mohan Dere    8 年前

    我建议你自己做,因为这项任务并不那么复杂。首先,将一种XML格式转换为另一种XML格式的最简单方法是使用XSLT。用C转换XML文档非常简单。

    这是一篇很好的msdn博客文章,可以让你开始学习。迈克甚至提到,与第三方打交道更容易用手做到这一点。

    link

    实际上,我已经回答了这个问题 here . 我猜这就是复制品。

        2
  •  1
  •   PurplePilot    16 年前

    为了它的价值而不是特定的顺序。

    不久前,我想导出到RTF,然后从RTF导入有问题的RTF,由MS Word操纵。

    第一个问题是RTF不是开放标准。这是一个内部的MS标准,因此他们可以根据自己的喜好随时修改它,并且通常不担心兼容性。目前,RTF的版本是1.3到1.9,它们都是不同的。在内部,他们使用twips进行测量只是为了更好的测量。

    我买了一本关于这个主题的O'Reilly袖珍书,它帮助我阅读了很多很好的MS文档,但是有很多,每个版本都有很多。

    因为使用regex对rtf进行编码是非常困难的工作,需要小心处理和集中测试才能开始工作。我使用了一个内置regex的mac编辑器,这样我就可以稳定地测试每个部分并将其构建到代码中。

    由于版本的数量,版本之间也有很多不兼容之处,但是有很多共性,最后很难/很容易找到我想要的地方(经过大约一周的阅读和一周的编码),并生成一个真正简单的版本。

    我从来没有找到过商业解决方案,但是由于预算的原因,我不得不有一个免费的解决方案,这样可以节省很多,但是在选择一个方案时要非常小心,以确保它能满足您的需要并得到支持。

    我不认为您来自HTML/XML/XHTML,我在转换CSV格式,它是RTF。

    我不确定我会建议自己动手还是买东西。也许总的来说,DIY,但你自己的情况将决定这一点。

    编辑:从内容到RTF有一件事比从内容到RTF更容易。

    顺便说一句,不要批评微软Fior的RTF版本,嘿,这是他们的和专有的,所以他们可以做他们喜欢的。

        3
  •  0
  •   nickytonline    16 年前

    我刚刚遇到了这个网页的wysiwyg富文本编辑器(rte),它也有一个html-to-rtf转换器, Cute Editor for .NET . 有人对这个组件有经验吗?我对基于Web的RTE的主要经验是ckeditor(fckeditor)和tinymce,但据我所知,ckeditor和tinymce没有内置HTML到RTF转换器。

        4
  •  0
  •   Max Lambertini    14 年前

    因为我需要在Web应用程序上实现一些具有富文本格式的邮件合并功能,所以我认为最好分享我的经验。

    基本上,我探讨了两种选择:

    • 使用google docs api利用google docs功能
    • 使用XSLT,如所示 this essay

    google docs api运行良好。问题是,当上载带有分页符的HTML文档时,如下所示:

    <p style="page-break-before:always;display:none;"/>
    

    并要求谷歌在RTF中转换文档,你会失去所有的休息时间,这不符合我的要求。但是,如果分页符对您来说不是一个问题,您可以检查这个解决方案。

    XSLT解决方案工作…某种程度上。

    如果您直接引用msxml3-com对象,绕过system.xml类,它就会工作。否则我就不能让它工作。此外,它似乎尊重除了基本格式和标签以外的所有内容,而忽略了文本的颜色、大小等。但是,它支持分页。:-)

    这是我写的一个快速库,使用tidy.net强制HTML到XHTML转换。希望有帮助。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace ADDS.Mailmerge
    {
    
        public class XHTML2RTF
        {
    
            MSXML2.FreeThreadedDOMDocument _xslDoc;
            MSXML2.FreeThreadedDOMDocument _xmlDoc;
            MSXML2.IXSLProcessor _xslProcessor;
            MSXML2.XSLTemplate _xslTemplate;
            static XHTML2RTF instance = null;
            static readonly object padlock = new object();
    
            XHTML2RTF()
            {
                _xslDoc = new MSXML2.FreeThreadedDOMDocument();
                //XSLData.xhtml2rtf is a resource file 
                // containing XSL for transformation
                // I got XSL from here: 
                // http://www.codeproject.com/KB/HTML/XHTML2RTF.aspx
                _xslDoc.loadXML(XSLData.xhtml2rtf);
                _xmlDoc = new MSXML2.FreeThreadedDOMDocument();
                _xslTemplate = new MSXML2.XSLTemplate();
                _xslTemplate.stylesheet = _xslDoc;
                _xslProcessor = _xslTemplate.createProcessor();
            }
    
            public string ConvertToRTF(string xhtmlData)
            {
                try
                {
                    string sXhtml = "";
                    TidyNet.Tidy tidy = new TidyNet.Tidy();
                    tidy.Options.XmlOut = true;
                    tidy.Options.Xhtml = true;
                    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xhtmlData)))
                    {
                        StringBuilder sb = new StringBuilder();
                        using (MemoryStream sw = new MemoryStream())
                        {
                            TidyNet.TidyMessageCollection messages = new TidyNet.TidyMessageCollection();
                            tidy.Parse(ms, sw, messages);
                            sXhtml = Encoding.UTF8.GetString(sw.ToArray());
                        }
                    }
    
                    _xmlDoc.loadXML(sXhtml);
                    _xslProcessor.input = _xmlDoc;
                    _xslProcessor.transform();
                    return _xslProcessor.output.ToString();
                }
                catch (Exception exc)
                {
                    throw new Exception("Error in xhtml conversion. ", exc);
                }
            }
    
            public static XHTML2RTF Instance
            {
                get
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new XHTML2RTF();
                        }
                        return instance;
                    }
                }
            }
        }
    
    
    
    }
    
        5
  •  0
  •   NtFreX    7 年前

    DR: 我建议使用 OpenXml 格式与 HtmlToOpenXml 如有可能,提供Nuget软件包。


    微软Word COM

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


    XHTML2RTF

    AS @IAmTimCorey mentioned 您可以使用此代码项目库。

    缺点是:

    • 有限支持的HTML和CSS
    • 不是真的。

    Windows窗体Web浏览器

    AS @Jerry mentioned 您可以使用Windows窗体 WebBrowser 控制。

    缺点是:

    • 引用system.windows.forms
    • 使用复制粘贴(多线程有问题)
    • 只在STA线程中工作

    不支持的功能包括:

    • 字体
    • 颜色
    • 编号列表
    • Strikethrough del 元素)
    • ……

    第三方控件

    “Paul V”的代码示例 devexpress support center .(2015年2月3日)

    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 德尔 元素)

    索金索夫

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

    可以找到更多示例和配置选项 here here .

    Supported is the following 以下内容:

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

    缺点是:

    • 我不知道发展有多积极
    • 价格

    使用知识库:


    自己动手做

    如果您只想支持有限的功能,您可以编写自己的转换器。如果支持的功能集太大,我不建议这样做。

    我有一个小的 sample project here 但在目前的状态下,只是为了教育目的。


    OpenXML

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

    The project 是基于 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();
        }
    }