Конвертер HTML в RTF для .NET - PullRequest
5 голосов
/ 11 января 2010

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

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

Из прочтения нескольких постов SautinSoft представляется популярным в качестве коммерческого компонента. Существуют ли другие коммерческие компоненты, которые вы бы порекомендовали для преобразования HTML в RTF? Цена имеет значение, но даже если она немного дорогая, перечислите ее.

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

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

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

Ответы [ 5 ]

1 голос
/ 13 января 2010

За что его стоит и в каком то порядке.

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

Первая проблема - RTF не является открытым стандартом. Это внутренний стандарт MS, поэтому они изменяют его по своему усмотрению и не беспокоятся о совместимости. В настоящее время версии RTF от 1,3 до 1,9, и все они разные. Внутренне они используют твипы для измерения просто для хорошей меры.

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

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

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

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

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

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

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

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

0 голосов
/ 11 октября 2018

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


Microsoft Word COM

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


XHTML2RTF

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

Недостатки:

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

Браузер Windows Forms

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

Недостатки:

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

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

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

DevExpress

Пример кода "Paul V" из центра поддержки devexpress . (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 элемент)

SautinSoft

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

Недостатки:

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

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

  • Преобразование нумерованных списков из редактора trix angular уничтожает Indend

DIY

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

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


OpenXml

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

Проект основан на Open 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();
    }
}

0 голосов
/ 09 ноября 2011

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

В основном, я исследовал две альтернативы:

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

Google Docs API работает хорошо. Проблема в том, что при загрузке 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;
                }
            }
        }
    }



}
0 голосов
/ 13 января 2010

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

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

ссылка

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

0 голосов
/ 11 января 2010

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

...