2010-01-11 19 views
5

J'ai déjà vu beaucoup de messages sur le site pour le RTF en HTML et d'autres messages parlant de convertisseurs HTML vers RTF, mais j'essaie vraiment d'obtenir une ventilation complète de ce est considéré comme le produit commercial le plus largement utilisé, produit open source ou si les gens recommandent de rentrer chez eux. Toutes mes excuses si vous considérez ceci comme une question en double, mais j'essaye de créer une matrice de produit pour voir ce qui est le plus viable pour notre application. Je pense aussi que cela serait utile pour les autres.Convertisseur HTML en RTF pour .NET

Le convertisseur serait utilisé dans une application ASP.NET 2.0 (nous allons passer à la version 3.5 sous peu mais toujours avec WebForms) en utilisant SQLServer 2005 (bientôt 2008) comme DB. A la lecture de quelques articles, SautinSoft semble être populaire en tant que composant commercial. Y a-t-il d'autres composants commerciaux que vous recommanderiez pour convertir du HTML en RTF? Le prix est important, mais même si c'est un peu cher, veuillez le lister. Pour l'open source, j'ai lu que OpenOffice.org peut être exécuté en tant que service afin qu'il puisse convertir des fichiers. Cependant, cela semble être uniquement basé sur Java. J'imagine, j'aurais besoin d'une sorte d'interop pour l'utiliser? Quels composants open source .NET, le cas échéant, sont disponibles pour convertir HTML en RTF?

Pour la maison, un XSLT est-il le bon choix pour XHTML? Si oui, quel composant recommandez-vous pour générer du XHTML? Sinon, quelles sont les autres avenus maison que vous recommandez?

En outre, s'il vous plaît noter que je ne me soucie pas tellement de RTF au HTML. Si un composant commercial offre cela et le prix est toujours le même, bien, sinon s'il vous plaît ne le mentionnez pas.

+0

Pourrais-je avoir plus d'informations sur la tâche technique à accomplir? Fondamentalement, pourquoi faites-vous cela? Quel programme va voir le produit final RTF? – Albert

+0

@Albert. Les données sont extraites d'une base de données pour générer un rapport RTF. Tout le formatage RTF est actuellement fait dans le rapport (codé en dur ... ourch!) Basé sur une spécification, mais dans quelques cas, le client veut formater certaines sections, donc nous leur donnerons un éditeur de texte riche en l'application Web et quand ils l'enregistrent, je vais le convertir en un morceau de RTF formaté qui sera retiré de la base de données et inséré dans le rapport. – nickytonline

+0

Um ... Je suis totalement confus. J'essaie de comprendre le flux de données et la conversion ici. Jusqu'à présent, j'ai ce qui suit: DB -> RTF -> RTF * -> DB Mais cela n'a pas de sens car il semblerait impliquer que vous avez un analyseur RTF qui peut grep et vider vers la base de données. Sauf si vous voulez dire que la base de données contient des données RTF? – Albert

Répondre

0

Je vous recommande de le faire vous-même car la tâche n'est pas vraiment complexe. Tout d'abord, la façon la plus simple de convertir un format Xml dans un autre format Xml est avec un Xslt. La conversion de documents Xml en C# est super facile.

Voici un bon article de blog msdn pour vous aider à démarrer. Mike mentionne même qu'il était plus facile de le faire à la main que de faire affaire avec un tiers.

link

En fait, je l'ai déjà répondu à cette question here. Devinez qui en fait un doublon.

+0

@Ty - Je n'ai pas de problème pour aller sur mesure, je me demandais juste ce que vous recommanderiez pour la conversion en XHTML si le HTML n'est pas parfait. – nickytonline

+0

@nickyt Un code HTML mal fait rendrait ce travail très pénible. J'ai fait certaines applications où le HTML/RTF était contrôlé, mais si vous voulez voir des tags en gras, des tags forts et parfois des tags qui ne sont pas fermés, vous devrez peut-être envisager une approche en deux étapes pour normaliser les données. puis convertir. Je ne pense pas que vous ayez à vous soucier de XHTML. –

+0

@Ty - Je vais chez moi. – nickytonline

0

Je suis juste tombé sur cet éditeur de texte riche (RTE) WYSIWYG pour le web qui a aussi un convertisseur HTML vers RTF, Cute Editor for .NET. Quelqu'un at-il une expérience avec ce composant? Mon expérience principale pour les RTE basés sur le web ont été CKEditor (fckEditor) et TinyMCE mais pour autant que je sache, CKEditor et TinyMCE n'ont pas de convertisseurs HTML vers RTF intégrés.

1

Pour ce que sa valeur et dans aucun ordre particulier. Il y a quelques temps, j'ai voulu exporter vers RTF, puis importer à partir de RTF le RTF en question manipulé par MS Word.

Le premier problème est que le format RTF n'est pas un standard ouvert. Il s'agit d'un standard MS interne et donc ils le modifient au fur et à mesure qu'ils le souhaitent et ne s'inquiètent généralement pas de la compatibilité. Actuellement les versions de RTF sont de 1.3 à 1.9 et elles sont toutes différentes. En interne, ils utilisent des twips pour mesurer juste pour faire bonne mesure.

J'ai acheté le livre de poche O'Reilly sur le sujet qui a aidé et lu une grande partie de la documentation MS qui est bonne, mais il y en a beaucoup pour chaque version.En raison de la façon dont le format RTF est codé en utilisant regex pour manipuler est incroyablement dur travail et nécessite une manipulation et une concentration soigneuses pour tester et se mettre au travail. J'utilise un éditeur de Mac qui a construit en regex afin que je puisse régulièrement tester chaque section et le construire dans le code. En raison du nombre de versions, il y a aussi beaucoup d'incompatibilité entre les versions, mais il y a beaucoup de points communs et à la fin, il était raisonnablement difficile d'obtenir où je voulais (après environ une semaine de lecture et une semaine codage) et produisant une version vraiment simple.

Je n'ai jamais trouvé de solution commerciale, mais je devais en avoir un gratuitement à cause de mon budget, ce qui me permet d'en choisir un pour m'assurer de faire ce que vous voulez et qui a du support.

Je ne pense pas où vous venez de HTML/XML/XHTML, je convertissais les formats CSV, il le RTF.

Je ne sais pas si je conseillerais de faire du bricolage ou acheter. Probablement sur un pied d'égalité DIY mais vos propres circonstances le dicteront.

Éditer: Une chose allant du contenu au RTF est plus facile que l'inverse.

BTW ne critiquant pas MS pour les versions RTF, ils sont les leurs et propriétaires afin qu'ils puissent faire ce qu'ils veulent.

0

Depuis que je suis nécessaire pour implémenter des fonctionnalités mailmerge avec le formatage de texte enrichi sur une application Web, j'ai pensé que ce serait bien de partager mes expériences.

Fondamentalement, j'ai exploré deux alternatives:

  • avec Google Docs API pour tirer parti des capacités Google Docs
  • en utilisant XSLT, comme indiqué sur this essay

API Google Docs fonctionne bien. Le problème est, lorsque vous téléchargez un document HTML avec des sauts de page, comme ceci:

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

et demander à Google pour convertir le doc au format RTF, vous perdez toutes les pauses, ce qui ne correspond pas à mes besoins. Cependant, si les sauts de page ne sont pas un problème pour vous, vous pouvez vérifier cette solution.

La solution XSLT fonctionne ... en quelque sorte.

Cela fonctionne si vous référencez l'objet COM MSXML3 directement, en contournant les classes System.Xml. Sinon je ne pourrais pas le faire fonctionner. De plus, il semble honorer tout sauf le formatage et les balises de base, sans tenir compte de la couleur du texte, de la taille et autres. Cependant, il honore les sauts de page. :-)

Voici une petite bibliothèque que j'ai écrite, en utilisant tidy.net pour forcer la conversion du HTML en XHTML. J'espère que cela aide.

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



}