Вопрос

Я уже видел на сайте множество сообщений о RTF в HTML и некоторые другие сообщения о некоторых конвертерах HTML в RTF, но я действительно пытаюсь получить полную информацию о том, что считается наиболее широко используемым коммерческим продуктом. исходный продукт или люди рекомендуют выращивать его дома.Извините, если вы считаете это дублирующим вопросом, но я пытаюсь создать матрицу продуктов, чтобы увидеть, что наиболее целесообразно для нашего приложения.Я также думаю, что это будет полезно для других.

Конвертер будет использоваться в приложении ASP.NET 2.0 (в ближайшее время мы обновляемся до версии 3.5, но по-прежнему придерживаемся WebForms) с использованием SQLServer 2005 (скоро 2008 г.) в качестве базы данных.

Прочитав несколько постов, СаутинСофт кажется популярным как коммерческий компонент.Есть ли другие коммерческие компоненты, которые вы бы порекомендовали для преобразования HTML в RTF?Цена имеет значение, но даже если она немного дороговата, пожалуйста, укажите ее.

Что касается открытого исходного кода, я читал это OpenOffice.org можно запустить как службу, чтобы она могла конвертировать файлы.Однако, похоже, это только на основе Java.Я полагаю, мне понадобится какое-то взаимодействие, чтобы использовать это?Какие компоненты .NET с открытым исходным кодом, если таковые имеются, существуют для преобразования HTML в RTF?

Для отечественных специалистов, является ли XSLT подходящим вариантом для XHTML?Если да, то какой компонент вы рекомендуете для создания XHTML?В противном случае, какие еще домашние проспекты вы порекомендуете?

Также обратите внимание, что в настоящее время меня не очень волнует переход из RTF в HTML.Если коммерческий компонент предлагает это, а цена остается прежней, хорошо, в противном случае, пожалуйста, не упоминайте об этом.

Это было полезно?

Решение

Я бы рекомендовал сделать это самостоятельно, поскольку задача не такая уж и сложная.Во-первых, самый простой способ конвертировать один формат Xml в другой формат Xml — использовать Xslt.Преобразование документов XML в C# очень просто.

Вот хорошая запись в блоге msdn, которая поможет вам начать.Майк даже упоминает, что было легче сделать это вручную, чем обращаться к третьей стороне.

связь

Собственно, я уже ответил на этот вопрос здесь.Думаю, это делает это дубликатом.

Другие советы

По какой цене и в произвольном порядке.

Некоторое время назад я хотел экспортировать в RTF, а затем импортировать из RTF рассматриваемый RTF, которым управляет MS Word.

Первая проблема заключается в том, что RTF не является открытым стандартом.Это внутренний стандарт MS, и поэтому они изменяют его по своему усмотрению и обычно не беспокоятся о совместимости.В настоящее время существуют версии RTF от 1.3 до 1.9, и все они разные.Внутри они используют твипы для измерения просто для пущей меры.

Я купил карманную книгу O'Reilly по этой теме, которая мне помогла, и прочитал много документации MS, что хорошо, но ее очень много, и много для каждой версии.

Из-за того, что RTF кодируется с использованием регулярных выражений для манипулирования, это невероятно тяжелая работа, требующая осторожного обращения и концентрации, чтобы протестировать и приступить к работе.Я использую редактор Mac со встроенным регулярным выражением, чтобы я мог постоянно тестировать каждый раздел и встраивать его в код.

Из-за количества версий существует также большая несовместимость между версиями, но есть много общего, и в конце концов было достаточно сложно/легко получить то, что я хотел (примерно после недель чтения и недель кодирования) и создания очень простая версия.

Я так и не нашел коммерческого решения, но мне пришлось иметь бесплатную версию из-за бюджета, чтобы сократить многое, но будьте очень осторожны при выборе одного, чтобы убедиться, что оно делает то, что вы хотите, и имеет поддержку.

Я не думаю, что вы пришли от HTML/XML/XHTML, я конвертировал форматы CSV, это RTF.

Я не уверен, советую ли я делать своими руками или покупать.Вероятно, в целом это можно сделать своими руками, но это будут диктовать ваши собственные обстоятельства.

Редактировать:Во-первых, перейти от контента к RTF проще, чем наоборот.

Кстати, я не критикую MS за версии RTF, эй, это их собственная собственность, поэтому они могут делать то, что хотят.

Я только что наткнулся на веб-редактор форматированного текста WYSIWYG (RTE), который также имеет конвертер HTML в RTF. Симпатичный редактор для .NET.Есть ли у кого-нибудь опыт работы с этим компонентом?Моим основным опытом работы с веб-RTE были CKEditor (fckEditor) и TinyMCE, но, насколько я могу судить, CKEditor и TinyMCE не имеют встроенных конвертеров HTML в RTF.

Поскольку мне необходимо реализовать некоторые возможности слияния почты с форматированием текста в веб-приложении, я подумал, что было бы неплохо поделиться своим опытом.

По сути, я рассмотрел два варианта:

  • использование Google Docs API для использования возможностей Google Docs
  • используя XSLT, как показано на Это эссе

API Документов Google работает хорошо.Проблема в том, что когда вы загружаете HTML-документ с разрывами страниц, например:

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

и попросите Google конвертировать документ в RTF, вы потеряете все разрывы, что не соответствует моим требованиям.Однако, если разрывы страниц не являются для вас проблемой, вы можете воспользоваться этим решением.

Решение XSLT работает...вроде, как бы, что-то вроде.

Это работает, если вы напрямую ссылаетесь на COM-объект MSXML3, минуя классы 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;
                }
            }
        }
    }



}

ТЛ;ДР: Я рекомендую использовать OpenXml формат и HtmlToOpenXml пакет nuget, если это возможно.


Microsoft Word COM

Я особо не углублялся в эту тему, так как мой вариант использования — использовать функциональность на сервере, что делает COM-компоненты не лучшим выбором.


XHTML2RTF

Как @IAmTimCorey упомянул вы можете использовать эту библиотеку кодового проекта.

Недостатками являются:

  • Ограниченная поддержка HTML и CSS
  • Не совсем .NET
  • ...

Веб-браузер Windows Forms

Как @Джерри упомянул вы можете использовать Windows Forms WebBrowser контроль.

Недостатками являются:

  • Ссылка на System.Windows.Forms
  • Использует копирование и вставку (проблемно для многопоточности)
  • Работает только в потоке STA

Неподдерживаемые функции включают в себя:

  • Шрифты
  • Цвета
  • Нумерованные списки
  • Зачеркивание (del элемент)
  • ...

ДевЭкспресс

Пример кода «Павел V» из центр поддержки девэкспресс. (03.02.2015)

public String ConvertRTFToHTML(String RTF)
{   
    MemoryStream ms = new MemoryStream();
    StreamWriter writer = new StreamWriter(ms);
    writer.Write(RTF);
    writer.Flush();
    ms.Position = 0;
    String output = "";
    HtmlEditorExtension.Import(HtmlEditorImportFormat.Rtf, ms, (s, enumerable) => output = s);

    return output;
}

public String ConvertHTMLToRTF(String Html)
{
    MemoryStream ms = new MemoryStream();
    var editor = new ASPxHtmlEditor { Html = html };

    editor.Export(HtmlEditorExportFormat.Rtf, ms);

    ms.Position = 0;
    StreamReader reader = new StreamReader(ms);

    return reader.ReadToEnd();
}

Или вы можете использовать RichEditDocumentServer введите, как показано на этот пример.

Неизвестно, что на самом деле поддерживается.

Недостатками являются:

  • Цена
  • Довольно много ссылок на одну мелочь
  • Более?

Неподдерживаемые функции включают в себя:

  • Забастовка (del элемент)

Саутинсофт

public string ConvertHTMLToRTF(string html)
{
    SautinSoft.HtmlToRtf h = new SautinSoft.HtmlToRtf();
    return h.ConvertString(htmlString);
}

public string ConvertRTFToHTML(string rtf)
{
    SautinSoft.RtfToHtml r = new SautinSoft.RtfToHtml();
    byte[] bytes = Encoding.ASCII.GetBytes(rtf);
    r.OpenDocx(bytes );
    return r.ToHtml();
}

Дополнительные примеры и варианты конфигурации можно найти здесь и здесь.

Поддерживается следующее:

  • HTML 3.2
  • HTML 4.01
  • HTML 5
  • CSS
  • XHTML

Недостатками являются:

  • Я не уверен, насколько активно идет разработка.
  • Цена

База знаний по использованию:


Сделай сам

Если вы хотите поддерживать только ограниченную функциональность, вы можете написать свой собственный конвертер.Я бы не рекомендовал это делать, если поддерживаемый набор функций слишком велик.

у меня есть маленький пример проекта здесь но в его нынешнем состоянии предназначен только для образовательных целей.


OpenXml

Если Формат OpenXml также подходит для вашего варианта использования, вы можете использовать Пакет nuget HtmlToOpenXml.Он бесплатный и поддерживает все функции, с которыми я тестировал другие решения.

Проект основан на Открыть XML SDK от Microsoft и кажется активным.

public static byte[] ConvertHtmlToOpenXml(string html)
{
    using (var generatedDocument = new MemoryStream())
    {
        using (var package = WordprocessingDocument.Create(generatedDocument, WordprocessingDocumentType.Document))
        {
            var mainPart = package.MainDocumentPart;
            if (mainPart == null)
            {
                mainPart = package.AddMainDocumentPart();
                new Document(new Body()).Save(mainPart);
            }

            var converter = new HtmlConverter(mainPart);
            converter.ParseHtml(html);

            mainPart.Document.Save();
        }

        return generatedDocument.ToArray();
    }
}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top