5

我已经在网站上看到了很多关于 RTF 到 HTML 的帖子以及其他一些谈论一些 HTML 到 RTF 转换器的帖子,但我真的想全面了解什么被认为是最广泛使用的商业产品,打开源产品或如果人们建议回家种植。如果您认为这是一个重复的问题,我深表歉意,但我正在尝试创建一个产品矩阵,看看什么对我们的应用程序最可行。我也认为这对其他人会有所帮助。

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

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

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

对于本地人来说,XSLT 是 XHTML 的方式吗?如果是这样,您推荐使用什么组件来生成 XHTML?否则,你推荐什么其他自家种植的大道。

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

4

4 回答 4

1

对于它的价值,没有特别的顺序。

不久前,我想导出到 RTF,然后从 RTF 导入正在被 MS Word 操作的有问题的 RTF。

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

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

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

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

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

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

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

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

顺便说一句,在 RTF 版本中没有批评 MS,嘿,这是他们的专有产品,所以他们可以做他们喜欢的事。

于 2010-01-13T18:28:17.750 回答
0

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

于 2010-01-11T17:34:09.517 回答
0

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

这是一篇很好的 msdn 博客文章,可以帮助您入门。Mike 甚至提到,与第三方打交道相比,手工操作更容易。

关联

实际上,我已经在这里回答了这个问题。猜猜这会造成重复。

于 2010-01-13T15:35:36.173 回答
0

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

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

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

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



}
于 2011-11-09T13:52:07.027 回答