【问题标题】:HTML to RTF Converter for .NET [closed].NET 的 HTML 到 RTF 转换器 [关闭]
【发布时间】:2011-01-03 19:28:27
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我能否获得有关手头技术任务的更多背景信息?基本上,你为什么要这样做?什么程序会查看 RTF 最终产品?
  • @Albert。从数据库中提取数据以生成 RTF 报告。目前所有的 RTF 格式都在基于规范的报告中完成(硬编码......我们的!),但在少数情况下,客户想要格式化某些部分,所以我们会给他们一个富文本编辑器Web 应用程序,当他们保存它时,我会将其转换为一大块格式化的 RTF,将从数据库中提取并插入到报告中。
  • 嗯...我完全糊涂了。我试图了解这里的数据流和转换。到目前为止,我有以下内容: DB -> RTF -> RTF* -> DB 但这没有意义,因为它似乎意味着您有一个可以 grep 并转储到 DB 的 RTF 解析器。除非你的意思是数据库保存 RTF 数据?
  • @Albert - 非 RTF 数据当前存储在数据库中。当我们生成报告时,我们通过将数据格式化为 RTF 的 C# 类来格式化数据库中的数据。我将添加到报告中的字段将存储在格式为 RTF 的数据库中。要将它们存储为 RTF,我需要将 RTE 中的 HTML 转换为 RTF。清除? :)
  • 哦,好的。这是一个您会讨厌的解决方案,因为它涉及时间/金钱,但我认为它会更好。为 DOCX 转储 RTF。 DOCX 有很多工具。 Mircosoft OOXML SDK v2.0 (msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx)。 Aspose.Words for .NET (aspose.com)。这些工具将简化您的生活,因为您将完全避免使用 HTML。事实上,有几家公司提供基于 Web 的 DOCX 编辑。希望将更改转储回数据库会很简单(好吧,好吧更简单)。同样,您可能会讨厌这种方法。

标签: asp.net html rtf file-conversion


【解决方案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,嘿,这是他们的专有产品,所以他们可以做他们喜欢的事。

【讨论】:

    【解决方案2】:

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

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

    link

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

    【讨论】:

    • @Ty - 我在自定义方面没有任何问题,只是想知道如果 HTML 不完美,你会推荐什么来转换为 XHTML。
    • @nickyt 搞砸了 HTML 会让这份工作变得非常痛苦。我已经完成了一些控制 HTML/RTF 的应用程序,但是如果您要看到粗体标签、强标签和有时未关闭的标签,您可能需要查看一个两阶段的方法,您首先对数据进行规范化,然后然后转换。我认为您不必担心 XHTML。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      • 使用 Google Docs API 来利用 Google Docs 功能
      • 使用 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;
                      }
                  }
              }
          }
      
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2011-05-02
        • 2010-10-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        相关资源
        最近更新 更多