HTML到RTF Converter for .NET

时间:2010-01-11 15:42:25

标签: asp.net html rtf file-conversion

我已经在网站上看到很多关于RTF到HTML的帖子以及其他一些关于一些HTML到RTF转换器的帖子,但我真的试图全面细分被认为是最广泛使用的广告产品,开源产品或人们建议回家种植。如果您认为这是一个重复的问题,请道歉,但我正在尝试创建一个产品矩阵,以查看我们的应用程序最可行的内容。我也认为这对其他人有帮助。

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

通过阅读一些帖子,SautinSoft似乎很受欢迎,因为它是一个商业组件。您是否建议将HTML转换为RTF的其他商业组件?价格确实很重要,但即使价格昂贵,也请列出来。

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

对于家庭成长,XSLT是XHTML的一种方式吗?如果是这样,您建议使用什么组件生成XHTML?否则,你推荐其他家庭成长的复仇者。

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

5 个答案:

答案 0 :(得分:1)

它的价值和没有特别的顺序。

前一段时间我想导出到RTF,然后从RTF导入有问题的RTF,由MS Word操纵。

第一个问题是RTF不是开放标准。它是一个内部MS标准,因此他们会在他们喜欢的时候改变它,并且通常不担心兼容性。目前RTF的版本是1.3到1.9,它们都是不同的。在内部,他们使用缇进行测量只是为了衡量。

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

由于使用正则表达式进行操作编码RTF的方式非常艰苦,需要仔细处理和集中测试并开始工作。我使用内置正则表达式的Mac编辑器,因此我可以稳定地测试每个部分并将其构建到代码中。

由于版本的数量,版本之间也存在很多不兼容性,但是有很多共性,最终它很难/很容易到达我想要的地方(经过大约一周的阅读和数周的编码)并制作一个非常简单的版本。

我从来没有找到过商业解决方案,但由于预算的原因我不得不免费使用,以便减少很多,但要非常谨慎地选择一个,以确保它能满足您的需求并获得支持。

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

我不确定我是否会建议DIY或购买。可能在平衡DIY,但你自己的情况将决定。

编辑:从内容到RTF的一件事比反之亦然。

BTW并没有批评MS Fior的RTF版本,嘿,这是他们的专有,所以他们可以做他们喜欢的事情。

答案 1 :(得分:0)

我刚刚遇到了这个WYSIWYG富文本编辑器(RTE),它也有一个HTML到RTF转换器,Cute Editor for .NET。有没有人对这个组件有任何经验?我对基于Web的RTE的主要经验是CKEditor(fckEditor)和TinyMCE,但据我所知,CKEditor和TinyMCE没有内置的HTML到RTF转换器。

答案 2 :(得分:0)

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

这是一篇很好的msdn博客文章,可以帮助您入门。迈克甚至提到用手来处理第三方更容易。

link

实际上,我已经回答了这个问题here。猜猜这是重复的。

答案 3 :(得分:0)

由于我需要在Web应用程序上实现一些带有富文本格式的mailmerge功能,我认为分享我的经验会很好。

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

  • 使用Google Docs API来利用Google文档功能
  • 使用XSLT,如this essay
  • 所示

Google Docs API效果很好。问题是,当您上传带有分页符的HTML文档时,如下所示:

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

并要求Google转换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;
                }
            }
        }
    }



}

答案 4 :(得分:0)

TL; DR:我建议尽可能使用OpenXml格式和HtmlToOpenXml nuget程序包。


Microsoft Word COM

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


XHTML2RTF

作为@IAmTimCorey mentioned,您可以使用此代码项目库。

缺点是:

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

Windows Forms Web浏览器

作为@Jerry mentioned,您可以使用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();
}

或者您可以使用this example中所示的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();
}

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

Supported is the following

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

缺点是:

  • 我不确定开发的积极程度
  • 价格

使用知识库:


DIY

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

我有一个小的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();
    }
}