2010-01-11 22 views
5

Ya he visto muchas publicaciones en el sitio para RTF a HTML y algunas otras publicaciones sobre algunos convertidores de HTML a RTF, pero estoy tratando de obtener un desglose completo de qué es considerado el producto comercial más utilizado, el producto de código abierto o si la gente recomienda ir a su país de origen. Disculpe si considera que se trata de una pregunta duplicada, pero estoy intentando crear una matriz de producto para ver cuál es la más viable para nuestra aplicación. También creo que esto sería útil para otros.Conversor de HTML a RTF para .NET

El convertidor se usaría en una aplicación ASP.NET 2.0 (estamos actualizando a 3.5 en breve, pero seguiremos apegados a WebForms) usando SQLServer 2005 (pronto 2008) como DB.

De leer algunas publicaciones, SautinSoft parece ser popular como componente comercial. ¿Hay otros componentes comerciales que recomiendas para convertir HTML a RTF? El precio sí importa, pero incluso si es un poco caro, por favor anótelo.

Para código abierto, leo que OpenOffice.org se puede ejecutar como un servicio para que pueda convertir archivos. Sin embargo, esto parece ser solo basado en Java. Me imagino, ¿necesitaría algún tipo de interoperabilidad para usar esto? ¿Qué componentes de fuente abierta .NET existen, si los hay, para convertir HTML a RTF?

¿Para home grown, es un XSLT el camino a seguir con XHTML? De ser así, ¿qué componente recomienda para generar XHTML? De lo contrario, ¿qué otros avenuses cultivados en casa te recomiendan?

Además, tenga en cuenta que actualmente no me preocupo demasiado de RTF a HTML. Si un componente comercial ofrece esto y el precio sigue siendo el mismo, bien, de lo contrario, no lo mencione.

+0

¿Podría obtener más información sobre la tarea técnica en cuestión? Básicamente, ¿por qué estás haciendo esto? ¿Qué programa va a ver el producto final RTF? – Albert

+0

@Albert. Los datos se extraen de un DB para generar un informe RTF. Todo el formato RTF se realiza actualmente en el informe (¡codificado ... gracias!) En función de una especificación, pero en algunos casos, el cliente desea formatear algunas secciones, por lo que le daremos un editor de texto enriquecido en la aplicación web y cuando la guardan, la convertiré en un fragmento de RTF formateado que se extraerá del DB e insertará en el informe. – nickytonline

+0

Um ... Estoy totalmente confundido. Estoy tratando de entender el flujo de datos y la conversión aquí. Hasta ahora tengo lo siguiente: DB -> RTF -> RTF * -> DB Pero eso no tiene sentido, ya que parece implicar que tienes un analizador RTF que puede grep y volcar a la base de datos. ¿A menos que quiera decir que la base de datos contiene datos RTF? – Albert

Respuesta

0

Recomendaría hacerlo usted mismo ya que la tarea no es realmente ese complejo. En primer lugar, la forma más fácil de convertir un formato Xml en otro formato Xml es con un Xslt. Convertir documentos Xml en C# es muy fácil.

Aquí hay una buena publicación en el blog de msdn para que comiences. Mike incluso menciona que era más fácil hacer esto a mano que lidiar con un tercero.

link

En realidad, ya he respondido a esta pregunta here. Adivina que hace esto un duplicado.

+0

@Ty - No tengo problemas para personalizarlo, solo me pregunto qué recomendarías para convertir a XHTML si el HTML no es perfecto. – nickytonline

+0

@nickyt Messed up HTML haría de este trabajo un verdadero dolor. He hecho algunas aplicaciones donde se controlaba el HTML/RTF, pero si vas a ver etiquetas en negrita, etiquetas fuertes y, a veces, etiquetas que no están cerradas, es posible que necesites ver un enfoque de dos etapas donde normalizas primero los datos y luego conviértete No creo que deba preocuparse por XHTML. –

+0

@Ty - Me voy a casa. – nickytonline

0

Acabo de encontrar este editor de texto enriquecido WYSIWYG (RTE) para la web que también tiene un convertidor de HTML a RTF, Cute Editor for .NET. ¿Alguien tiene alguna experiencia con este componente? Mi experiencia principal para RTE basados ​​en web ha sido CKEditor (fckEditor) y TinyMCE, pero hasta donde puedo decir, CKEditor y TinyMCE no tienen convertidores de HTML a RTF integrados.

1

Por lo que vale y sin ningún orden en particular.

Hace un tiempo quise exportar a RTF y luego importar desde RTF el RTF en cuestión manipulado por MS Word.

El primer problema es que RTF no es un estándar abierto. Es un estándar interno de MS y por lo tanto lo modifican cuando lo desean y generalmente no se preocupan por la compatibilidad. Actualmente las versiones de RTF son de 1.3 a 1.9 y todas son diferentes. Internamente usan twips para medir solo por si acaso.

Compré el libro de bolsillo O'Reilly sobre el tema que ayudó y leyó mucha de la documentación de MS que es buena, pero hay muchas y muchas para cada versión.

Debido a la forma en que RTF se codifica usando la expresión regular para manipular es un trabajo increíblemente difícil y necesita una manipulación y concentración cuidadosas para probar y ponerse a trabajar. Utilicé un editor de Mac que tenía incorporada la expresión regular para poder probar cada sección y construirla en el código.

Debido a la cantidad de versiones también hay mucha incompatibilidad entre las versiones, pero hay muchas cosas en común y al final fue bastante difícil/fácil llegar a donde quería (después de aproximadamente una semana de lectura y una semana) codificación) y produciendo una versión realmente simple.

Nunca encontré una solución comercial, pero tuve que tener una gratis por su presupuesto, por lo que se redujo mucho, pero tenga mucho cuidado al elegir una para asegurarse de que hace lo que quiere y tiene soporte.

No creo que vengan de HTML/XML/XHTML, estaba convirtiendo formatos CSV, es el RTF.

No estoy seguro de si aconsejaría bricolaje o comprar. Probablemente en bricolaje, pero tus propias circunstancias dictarán eso.

Editar: Una cosa que va del contenido al RTF es más fácil que viceversa.

BTW no critica a MS por las versiones RTF, hey es suyo y patentado para que puedan hacer lo que quieran.

0

Como estoy obligado a implementar algunas capacidades de correo con formato de texto enriquecido en una aplicación web, pensé que sería bueno compartir mis experiencias.

Básicamente, he explorado dos alternativas:

  • usando Google Docs API para aprovechar las capacidades de Google Docs
  • mediante XSLT, como se muestra en this essay

API de Google Docs funciona bien. El problema es que, cuando se carga un documento HTML con los saltos de página, así:

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

y pedir a Google para convertir el documento en formato RTF, se pierden todos los descansos, lo que no se ajustan a mis necesidades. Sin embargo, si los saltos de página no son un problema para usted, puede verificar esta solución.

La solución XSLT funciona ... más o menos.

Funciona si hace referencia al objeto COM MSXML3 directamente, sin pasar por las clases System.Xml. De lo contrario, no podría hacerlo funcionar. Además, parece respetar todos los formatos y etiquetas básicos, sin tener en cuenta el color del texto, el tamaño y similares. Sin embargo, respeta los saltos de página. :-)

Aquí hay una biblioteca rápida que escribí, usando tidy.net para forzar la conversión de HTML a XHTML. Espero eso ayude.

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



}