RTF в HTML

Возникла задача конвертации формата RTF в HTML и наооборот. У IBlobDataField есть свойство ValAsRTF, которое возвращает собственно формат RTF, с которым и хотелось бы дальше работать(то етсь, из него брать и туда же класть значение).
В интернетах нашел несколько activeX'ов, которые решают подобные задачи, но они платные. Так же знаю, что такое преобразование возможно выполнить, используя IExplorer, но примеров не нашел.
Может кто-нибудь сталкивался с подобной проблемой. Подскажите какие-нибудь варианты.
Заранее спасибо за ответ.

Нравится

17 комментариев

Здравствуйте, Юрий!

Для конвертации можем Вам посоветовать использовать Microsoft Word. А именно, Вам необходимо открыть RTF документ, выбрать опцию "Сохранить как" и выбрать тип файла "Веб-документ". После конвертации появится сам файл и папка с таким же именем, в которую помещаются все дополнительные элементы *.html файла.
Обратная конвертация будет выполняться аналогично. А именно, необходимо открыть .html файл в MS Word, выбрать опцию "Сохранить как" и сохранить в формате RTF.

C уважением,
Terrasoft Support Team

Здравствуйте, support!

Дело в том, что все не так просто... мне нужно программно преобразовывать HTML в RTF и обратно. то есть на входе есть HTML, мне его надо "засунуь" в БД как RTF(поле аля Description в результате blob). потом отдать этот RTF как html... я понимаю, что вопрос скорее всего немного общего характера, но все же, может у кого-то был опыт в данной проблеме.
Вопрос еще раз: Как преобразовать текст в формате RTF в формат HTML(программно), кто с таким сталкивался?
Заранее спасибо за ответ.

Здравствуйте, Юрий!

Как мы уже упоминали ранее, поставленную Вами задачу при помощи скриптов конфигурации Terrasoft CRM. А именно, Вам необходимо открыть документ Word (ValAsRTF), выбрать опцию "Сохранить как" и сохранить в HTML (ValAsHTML).
Все необходимые функции, свойства, методы для преобразования HTML в RTF (и наоборот)описаны в конфигурации Terrasoft CRM.

Terrasof Support Team

И еще раз здравствуйте.
Поиск в гугле по слову ValAsHTML и GrepSearch по скриптам конфигурации Terrasoft CRM не дает абсолютно никаких результатов.
Насколько я понимаю, вы советуете использовать Word.Application, но у него тоже нет свойства ValAsHTML. Возможно сохранять значение в какой-то промежуточный файл, а потом из него же загружать, но мне нужно сделать это для 23000 записей, не будет ли оно работать невероятно долго?
Все же если подобная проблема уже где-то описана или реализована в конфигурациях Террасофта, можете подсказать где именно на нее можно посмотреть ибо мой поиск не дал результатов.
Заранее благодарю за помощь.

Доброго времени суток!
Сделал реализацию в реестре Контрагенты. Добавил там кнопку и создал для ее нажатия такой обработчик:
Вот рабочий пример:

function ButtonOnClick(Control) {
	var Dataset = GetSingleItemByCode('ds_Description'); // датасет с полем Описание (он по умолчанию настроен на таблицу контрагентов)
	var AccountID = dlData.Dataset.Values('ID');// получаем ссылку на выделенного в реестре контрагента
	ApplyDatasetIDFilter(Dataset, AccountID, true); 
	RefreshDataset(Dataset); // Получаем описание для контрагента
	var FileName = 'c:\\Word1.rtf'; // обратить внимание на то, что косых именно две
	Dataset.DataFields('Description').SaveToFile(FileName); //сохраняем описание в файл (оно в формате RTF)
	var Document = OpenWordDocument(FileName, true); // для этой функции нужно подключить скрипт scr_MSWordLibrary.
        var wdFormatHTML = 8; // формат для сохранения файла в Word 
	Document.SaveAs(FileName + '.html', wdFormatHTML); //сохранение файла
	Document.Close(0); //закрытие докумена. 0 - что бы не спрашивал о сохранении.
}

Более подробную информацию по работе с объектом Word можно получить здесь http://msdn.microsoft.com

Константин, спасибо за пример.
Но этот вариант как раз в рассмотрении... проблема в том что всего таким образовм надо обработать 23000 записей... внутренний голос подсказывает, что затянется на пару дней)

Юрий, проведите, для начала, тест на 100 записях и тогда будет понятно сколько это займет времени.
А может подойти с другой стороны к вопросу? Опишите задачу, возможно ее можно решить другим способом.

Изначально задача следующая. Есть транспортный xml, который хранит продукты по категориям. У продуктов есть описание, которое приходит в виде html. Теперь надо это описание положить в БД. И в последствии пользователь его может править, а потом тем же xml все отдается обратно(на сайт).
Так вот решение предполагалось следующее: забрать в формате html, преобразовать в rtf и отображать в контроле RichDataControl, где пользователю будет его удобно править, а потом обратно из rtf преобразовывать в html и отдавать.
Еще как вариант использовать какой-то удобный для пользователя редактор html и хранить в БД как текст, а не блоб, но такового не нашел, если подскажите какие-то альтернативы буду через мерно благодарен.

Лучше всего, в данном случае, не делать преобразование в какие то промежуточные форматы, а использовать, как вы правильно написали, редактор html. Можно попробовать встроить в качестве редактора FrontPage (если он COM). Примеры по использованию ActiveX есть: http://community.terrasoft.ua/node/2444, http://community.terrasoft.ua/forum/topic/2442

Алексей, последовал вашему совету, вот результат:

	var FPObject = new ActiveXObject("FrontPage.Application");
	var ActiveWebWindow = FPObject.ActiveWebWindow;
	FPObject.CommandBars(2).Visible = false;
	FPObject.CommandBars(3).Visible = true;// оставляем только панель инструментов для редактирования текста
	var ActiveDcument = FPObject.ActiveDocument;
	ActiveDcument.body.innerHtml = "<b>тест</b>";
	for (var i = 1; i < 12; i++ ) {
	    //прячем элементы главного меню(почему-то не получается спрятать весь CommandBar)	
            FPObject.CommandBars(1).Controls(i).Visible = false; 
	}	
	ActiveWebWindow.Visible = true;

в результате видим окно для редактирования html(без лишних toolBar'ов) с текстом, который мы туда установили.
Вопрос заключается в следующем. Как бы так ActiveWebWindow "всунуть" в террасофт.
Пробовал указывать GUID и ProgID разных элементов в частности FrontPage.Explorer контролу ActiveXControl говорит "интерфейс не поддерживается".

Анологичная проблема. Пробовали прописывать туда как свои объекты так и микрософтовские. Если указывать ActiveXGUID, то говорит что ошибка, текст ошибки и колстек не показывает. Если ActiveXProgID - то ошибка "Интерфейс не поддерживается" и колстек вот такой

-Comobj.OleError ()
-Olectrls.TOleControl.CreateInstance ()
-Olectrls.TOleControl ()
TSObjectProperties.TObjectProperties.SetPropertyValue (Line 642, "..\..\ObjectLibraries\Common\TSObjectProperties.pas") ()
TSObjectProperties.TObjectProperty.SetPropertyValue (Line 1038, "..\..\ObjectLibraries\Common\TSObjectProperties.pas") ()
TSObjectProperties.TStrObjectProperty.SetStrValue (Line 1131, "..\..\ObjectLibraries\Common\TSObjectProperties.pas") ()
TSObjectPropertyEditLinks.TStrObjectPropertyEditLink.WriteValue (Line 324, "..\Common\TSObjectPropertyEditLinks.pas") ()
TSBaseEditLink.TBaseEditLink.WriteValueIfChanged (Line 224, "..\Common\TSBaseEditLink.pas") ()
TSObjectPropertyEditLinks.TObjectPropertyEditLink.WriteValueIfChanged (Line 278, "..\Common\TSObjectPropertyEditLinks.pas") ()
TSBaseEditLink.TBaseEditLink.EnterKeyPress (Line 254, "..\Common\TSBaseEditLink.pas") ()
TSBaseEditLink.TBaseEditLink.ControlKeyDown (Line 213, "..\Common\TSBaseEditLink.pas") ()

И после этого сохранить сервис не представляется возможным.
Если из скрипта выполнять присваивание ActiveXProgID то ошибки не возникает, но после

ActiveXControl.ActiveXProgID = 'Word.Application'

В ActiveXControl я ворд не увидел. Смотрел в отладке: ActiveXProgID и ActiveXGUID свойства абсолютно не связанные. Насколько я понимаю при смене одного должно меняться другое.
Версия 3.3

у меня при определении свойств ActiveXControl в скрипте говорит
TSDskWindowLibrary.DskActiveXControl: Интерфейс не поддерживается

кстати, если задать Word.Application в Администраторе, то лог говорит, что интерфейс не поддерживается, но объект ворда создается и висит в памяти...

Да, я глянул - а у меня их в памяти штук 10 висит. Но если из скрипта - присвоение отрабатывает, но ворд не запускается.

Доброго дня!
Несколько комментариев. Приложения пакета Office не могут быть встроены как ActiveXControl. Потому возникает ошибка "Интерфейс не поддерживается". Решение задачи нужно искать на стороне. Искать нужно что-то вроде ActiveX WYSIWYG Html Editor. Есть несколько платных и бесплатных компонентов. Для примера я взял этот: http://xstandard.com/
Документация по его свойствам: http://xstandard.com/en/documentation/xstandard-dev-guide/api/
Его ProgID = XStandard.XHTMLEditor. Скачав, установив, добавив в окно ActiveXContainer и указав ProgID, получаем окно:

Ну а дальше уже работаем с методами и свойствами этого объекта. В частности, свойство Value возвращает строку с HTML-текстом, которую можно как сохранить в базу, так и обрамить тэгами HTML-документа значение свойства.

Вот только, если уже все описания забиты в RTF, то этот компонент Вам не поможет и нужно все-таки делать преобразование. А если "с нуля" начинать - то вполне.

P.S. Это только один из вариантов, возможно, Вам удастся найти что-то получше.

А Word в памяти висит, потому что у него свойство Visible = false. Если установить в true, то появится обычный Word, но он не будет встроен в контейнер.
Хотя по поводу всего пакета я погорячился - Visio позволяет себя отобразить в контейнере. Но, видимо, это единственное приложение из пакета Office, которое позволяет такое делать.

Вообще-то как-то странно. Тот же стандартный дельфийский OleContainer умеет отображать микрософтовские объекты. Только если писать Word.Application, то он ругается аналогично: "Интерфейс не поддерживается". А вот если Word.Document - то все нормально. Или вы не его используете?
A Visible = true установить проблематично: ввел в дизайнере Word.Application. Получил свал. И больше до создаго объекта не доступиться :)

Дело в том, что объект ActiveXContainer является оберткой над TOleControl, а не TOleContainer.

Показать все комментарии