2010-01-11 85 views
5

我已經在網站上看到很多關於RTF轉換爲HTML和其他一些文章討論一些HTML到RTF轉換器的帖子,但是我真的想要完全分解什麼被認爲是最廣泛使用的商業產品,開源產品,或者如果人們推薦回家種植。如果你認爲這是一個重複的問題,我很抱歉,但我試圖創建一個產品矩陣,看看我們的應用程序最可行。我也認爲這會對其他人有所幫助。用於.NET的RTF轉換器的HTML

該轉換器將用於SQL Server 2005(即將推出2008)作爲數據庫的ASP.NET 2.0應用程序(我們即將升級到3.5,但仍然堅持使用WebForms)。

從閱讀幾篇文章看,SautinSoft似乎很受歡迎作爲商業組件。是否有其他商業組件可以推薦用於將HTML轉換爲RTF?價格確實很重要,但即使價格貴一點,請列出。

對於開源,我讀OpenOffice.org可以作爲服務運行,以便它可以轉換文件。但是,這似乎只是基於Java的。我想,我需要某種互操作來使用它?哪些.NET開源組件(如果有的話)用於將HTML轉換爲RTF?

對於自家種植的,XSLT是否與XHTML一起使用?如果是這樣,你推薦使用什麼組件來生成XHTML?否則,你會推薦哪些其他家庭種的燕窩。

此外,請注意,我目前不太在乎RTF到HTML。如果一個商業組件提供這個,價格仍然相同,那麼請不要提及它。

+0

我可以獲得更多關於手頭技術任務的背景嗎?基本上,你爲什麼要這樣做?什麼程序將查看RTF最終產品? – Albert

+0

@Albert。從數據庫中提取數據以生成RTF報告。所有的RTF格式目前都是基於規範在報告中完成的(硬編碼......我們!),但在少數情況下,客戶想要格式化一些部分,所以我們會給他們一個富文本編輯器Web應用程序,當他們保存它時,我會將它轉換爲一大塊格式化的RTF,它將從數據庫中提取並插入到報告中。 – nickytonline

+0

嗯......我完全糊塗了。我試圖瞭解這裏的數據流和轉換。到目前爲止,我有以下內容: DB - > RTF - > RTF * - > DB 但這沒有意義,因爲它似乎意味着您有一個可以grep並轉儲到數據庫的RTF解析器。除非你的意思是DB持有RTF數據? – Albert

回答

0

我會推薦自己做,因爲任務不是真的很複雜。首先,將一個Xml格式轉換爲另一個Xml格式的最簡單方法是使用Xslt。在C#中轉換Xml文檔非常簡單。

這是一個很好的MSDN博客文章,讓你開始。邁克甚至提到手工處理第三方更容易。

link

其實我已經回答了這個問題here。猜猜這使得它是重複的。

+0

@Ty - 我沒有定製問題,只是想知道如果HTML不完美,你會推薦如何轉換爲XHTML。 – nickytonline

+0

@nickyt搞砸HTML會讓這項工作成爲一個真正的痛苦。我已經完成了HTML/RTF受控的一些應用程序,但是如果您將看到大膽的標籤,強大的標籤以及有時未關閉的標籤,則可能需要查看兩階段方法,即首先對數據進行規範化處理,然後然後轉換。我不認爲你需要擔心XHTML。 –

+0

@Ty - 我要去自己家了。 – nickytonline

0

我剛剛遇到這個WYSIWYG富文本編輯器(RTE)的網頁,也有一個HTML到RTF轉換器Cute Editor for .NET。有沒有人有任何這方面的經驗?我基於網頁的RTE的主要經驗是CKEditor(fckEditor)和TinyMCE,但據我所知CKEditor和TinyMCE沒有HTML到RTF轉換器內置。

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的一件事情比反過來更容易。

順便說一句,不要批評MS Fior的RTF版本,嘿它是他們的和專有的,所以他們可以做他們喜歡的事情。

0

因爲我需要在Web應用程序上實現一些使用RTF格式的郵件合併功能,所以我認爲能夠分享我的經驗真是太好了。

基本上,我探討兩個選擇:

  • 使用谷歌文檔API使用XSLT利用谷歌文檔的功能
  • ,在this essay

谷歌文檔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; 
       } 
      } 
     } 
    } 



}