Возникла задача конвертации формата RTF в HTML и наооборот. У IBlobDataField есть свойство ValAsRTF, которое возвращает собственно формат RTF, с которым и хотелось бы дальше работать(то етсь, из него брать и туда же класть значение).
В интернетах нашел несколько activeX'ов, которые решают подобные задачи, но они платные. Так же знаю, что такое преобразование возможно выполнить, используя IExplorer, но примеров не нашел.
Может кто-нибудь сталкивался с подобной проблемой. Подскажите какие-нибудь варианты.
Заранее спасибо за ответ.
Нравится
Здравствуйте, Юрий!
Для конвертации можем Вам посоветовать использовать 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 в Администраторе, то лог говорит, что интерфейс не поддерживается, но объект ворда создается и висит в памяти...
Доброго дня!
Несколько комментариев. Приложения пакета 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.