2010-01-11 48 views
5

Tôi đã thấy nhiều bài đăng trên trang web cho RTF tới HTML và một số bài đăng khác nói về một số trình chuyển đổi HTML sang RTF, nhưng tôi thực sự đang cố gắng phân tích đầy đủ những gì được coi là sản phẩm thương mại được sử dụng rộng rãi nhất, sản phẩm nguồn mở hoặc nếu mọi người khuyên bạn nên về nhà trồng. Xin lỗi nếu bạn coi đây là một câu hỏi trùng lặp, nhưng tôi đang cố tạo một ma trận sản phẩm để xem khả năng nào là khả thi nhất cho ứng dụng của chúng tôi. Tôi cũng nghĩ rằng điều này sẽ hữu ích cho người khác.Chuyển đổi HTML sang RTF cho .NET

Trình chuyển đổi sẽ được sử dụng trong ứng dụng ASP.NET 2.0 (chúng tôi đang nâng cấp lên 3,5 giây nhưng vẫn gắn bó với WebForms) bằng cách sử dụng SQLServer 2005 (sớm 2008) làm DB.

Từ đọc một vài bài đăng, SautinSoft dường như phổ biến như một thành phần thương mại. Có các thành phần thương mại khác mà bạn muốn chuyển đổi HTML sang RTF không? Giá cả có vấn đề, nhưng ngay cả khi đó là một chút về mặt đắt tiền, xin liệt kê nó.

Đối với nguồn mở, tôi đọc rằng OpenOffice.org có thể chạy dưới dạng dịch vụ để nó có thể chuyển đổi tệp. Tuy nhiên, điều này dường như chỉ dựa trên Java. Tôi tưởng tượng, tôi cần một số loại interop để sử dụng điều này? Những thành phần mã nguồn mở .NET nào, nếu có, có thể chuyển đổi HTML sang RTF không?

Đối với trang chủ phát triển, XSLT có phải là cách để đi với XHTML không? Nếu vậy, bạn khuyên bạn nên tạo thành phần nào để tạo XHTML? Nếu không, những gì khác nhà phát triển avenuses làm bạn đề nghị.

Ngoài ra, xin lưu ý rằng tôi hiện không quan tâm quá nhiều về RTF đến HTML. Nếu một thành phần thương mại cung cấp này và giá vẫn như cũ, tốt, nếu không xin vui lòng không đề cập đến nó.

+0

Tôi có thể có thêm thông tin cơ bản về nhiệm vụ kỹ thuật này không? Về cơ bản, tại sao bạn làm điều này? Chương trình nào sẽ xem sản phẩm cuối RTF? – Albert

+0

@Albert. Dữ liệu được lấy từ một DB để tạo ra một báo cáo RTF. Tất cả định dạng RTF hiện được thực hiện trong báo cáo (mã hóa cứng ...) dựa trên thông số kỹ thuật, nhưng trong một vài trường hợp, ứng dụng khách muốn định dạng một số phần, vì vậy chúng tôi sẽ cung cấp cho họ trình chỉnh sửa văn bản phong phú ứng dụng web và khi họ lưu nó, tôi sẽ chuyển đổi nó thành một đoạn RTF được định dạng sẽ được lấy từ DB và chèn vào báo cáo. – nickytonline

+0

Um ... Tôi hoàn toàn bối rối. Tôi đang cố gắng hiểu luồng dữ liệu và chuyển đổi ở đây. Cho đến nay tôi có những điều sau đây: DB -> RTF -> RTF * -> DB Nhưng điều đó không có ý nghĩa vì nó có vẻ ngụ ý bạn có trình phân tích cú pháp RTF có thể grep và đổ vào DB. Trừ khi bạn có nghĩa là DB giữ dữ liệu RTF? – Albert

Trả lời

0

Tôi khuyên bạn nên tự làm như công việc không phải là thực sự phức tạp. Thứ nhất, cách dễ nhất chuyển đổi một định dạng Xml sang định dạng Xml khác là bằng Xslt. Chuyển đổi tài liệu Xml trong C# là siêu dễ dàng.

Đây là một bài đăng blog msdn tốt để giúp bạn bắt đầu. Mike thậm chí còn đề cập rằng dễ dàng hơn để làm điều này bằng tay để đối phó với một bên thứ ba.

link

Thực ra, tôi đã trả lời câu hỏi này here. Đoán rằng làm cho một bản sao.

+0

@Ty - Tôi không gặp vấn đề gì với việc tùy chỉnh, chỉ cần tự hỏi bạn muốn đề xuất gì để chuyển đổi sang XHTML nếu HTML không hoàn hảo. – nickytonline

+0

@nickyt Đã bị xáo trộn HTML sẽ khiến công việc này trở thành một nỗi đau thực sự. Tôi đã thực hiện một số ứng dụng mà HTML/RTF đã được kiểm soát, nhưng nếu bạn sẽ thấy thẻ đậm, thẻ mạnh và đôi khi các thẻ không bị đóng, bạn có thể cần phải xem xét hai cách tiếp cận theo giai đoạn mà bạn chuẩn hóa dữ liệu trước tiên và sau đó chuyển đổi. Tôi không nghĩ bạn cần phải lo lắng về XHTML. –

+0

@Ty - Tôi sẽ trở về nhà. – nickytonline

0

Tôi vừa xem qua trình soạn thảo văn bản phong phú WYSIWYG này (RTE) cho web cũng có trình chuyển đổi HTML sang RTF, Cute Editor for .NET. Có ai có kinh nghiệm với thành phần này không? Kinh nghiệm chính của tôi đối với RTE dựa trên web là CKEditor (fckEditor) và TinyMCE nhưng theo như tôi có thể nói CKEditor và TinyMCE không có bộ chuyển đổi HTML sang RTF được tích hợp sẵn.

1

Đối với giá trị của nó và không theo thứ tự cụ thể.

Một lúc trước, tôi muốn xuất sang RTF và sau đó nhập từ RTF RTF đang được điều khiển bởi MS Word.

Vấn đề đầu tiên là RTF không phải là tiêu chuẩn mở. Nó là một tiêu chuẩn MS nội bộ và có mũi họ thay đổi nó như và khi họ thích và thường không lo lắng về khả năng tương thích. Hiện tại các phiên bản RTF là 1,3 đến 1,9 và tất cả đều khác nhau. Trong nội bộ họ sử dụng twips để đo lường chỉ để đo lường tốt.

Tôi đã mua cuốn sách bỏ túi O'Reilly về chủ đề đã giúp và đọc rất nhiều tài liệu MS tốt, nhưng có rất nhiều và rất nhiều cho mỗi phiên bản.

Do cách RTF được mã hóa bằng cách sử dụng regex để thao tác là công việc cực kỳ khó khăn và cần xử lý cẩn thận và tập trung để kiểm tra và làm việc. Tôi sử dụng một trình soạn thảo Mac đã xây dựng trong regex vì vậy tôi có thể đều đặn kiểm tra từng phần và xây dựng nó vào mã.

Vì số lượng phiên bản cũng có rất nhiều sự không tương thích giữa các phiên bản nhưng có nhiều điểm chung và cuối cùng, rất khó để có được nơi tôi muốn (sau khoảng một tuần đọc và một tuần) mã hóa) và tạo ra một phiên bản thực sự đơn giản.

Tôi chưa bao giờ tìm được giải pháp thương mại nhưng tôi phải có một ngân sách miễn phí vì đã cắt giảm rất nhiều nhưng hãy cẩn thận khi chọn một để đảm bảo nó làm những gì bạn muốn và có hỗ trợ.

Tôi không nghĩ bạn đang ở đâu từ HTML/XML/XHTML, tôi đã chuyển đổi định dạng CSV, đó là RTF.

Tôi không chắc chắn liệu tôi có thể tư vấn cho DIY hoặc mua hay không. Có lẽ trên số dư DIY nhưng hoàn cảnh của bạn sẽ ra lệnh cho điều đó.

Chỉnh sửa: Một thứ chuyển từ nội dung sang RTF dễ dàng hơn ngược lại.

BTW không chỉ trích MS fior phiên bản RTF, đây là quyền sở hữu và độc quyền của họ để họ có thể làm những gì họ thích.

0

Vì tôi được yêu cầu triển khai một số khả năng gửi thư với định dạng văn bản đa dạng thức trên một ứng dụng Web, tôi nghĩ sẽ rất tuyệt khi chia sẻ trải nghiệm của tôi.

Về cơ bản, tôi khám phá hai lựa chọn:

  • sử dụng Google Docs API để tận dụng khả năng của Google Docs
  • sử dụng XSLT, như thể hiện trên this essay

Google Documents API hoạt động tốt. Vấn đề là, khi bạn tải lên một tài liệu HTML với ngắt trang, như thế này:

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

và yêu cầu Google để chuyển đổi doc trong RTF, bạn sẽ mất tất cả phá vỡ, mà không phù hợp với yêu cầu của tôi. Tuy nhiên, nếu ngắt trang không phải là vấn đề với bạn, bạn có thể kiểm tra giải pháp này.

Giải pháp XSLT hoạt động ... loại.

Nó hoạt động nếu bạn tham chiếu trực tiếp MSXML3 COM đối tượng, bỏ qua các lớp System.Xml. Nếu không, tôi không thể làm cho nó hoạt động được. Hơn nữa, nó dường như tôn vinh tất cả các định dạng cơ bản và các thẻ, bỏ qua màu văn bản, kích thước và tương tự. Tuy nhiên, nó vinh danh ngắt trang. :-)

Đây là thư viện nhanh tôi đã viết, sử dụng tidy.net để buộc chuyển đổi HTML thành XHTML. Hy vọng nó giúp.

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



} 
Các vấn đề liên quan