TStringList в RTF
Модератор: Модераторы
TStringList в RTF
Lazarus: 0.9.2.9.25556
FPC: 2.4.1
Приветствую. Меня заинтересовало как можно сохранить TStringList в файл RTF, т.е. по сути мне надо все строки в StringList преобразовать в формат строк RTF и уже в процедуре SaveToFile указать файл с расширением RTF. В StringList лежит код HTML страницы.
FPC: 2.4.1
Приветствую. Меня заинтересовало как можно сохранить TStringList в файл RTF, т.е. по сути мне надо все строки в StringList преобразовать в формат строк RTF и уже в процедуре SaveToFile указать файл с расширением RTF. В StringList лежит код HTML страницы.
по-русски: тебе нужно HTML преобразовать в RTF?
есть такой модуль: sax_html. Предназначен для чтения html файлов и представление его в виде DOM-документа.
а это уже полдела. Пройдясь по структуре такого дерева можно получить информацию о форматировании... Хотя, сейчас правильно хранить форматирование во (внешнем) .css файле. Если закрыть на это глаза - полдела сделано.
после того информация о форматировании текста получена из HTML есть 2 пути.
1) зарядить её в RichMemo (под Windows или Mac), и вызвать метод SaveRichText
2) ручками записать всё в RTF файл. Возможно есть и готовые классы для записи. Если таких нет, то начать можно от сюда: http://ru.wikipedia.org/wiki/Rich_Text_Format
а это уже полдела. Пройдясь по структуре такого дерева можно получить информацию о форматировании... Хотя, сейчас правильно хранить форматирование во (внешнем) .css файле. Если закрыть на это глаза - полдела сделано.
после того информация о форматировании текста получена из HTML есть 2 пути.
1) зарядить её в RichMemo (под Windows или Mac), и вызвать метод SaveRichText
2) ручками записать всё в RTF файл. Возможно есть и готовые классы для записи. Если таких нет, то начать можно от сюда: http://ru.wikipedia.org/wiki/Rich_Text_Format
Ох чует моя душа, что здесь все сложнее. Не хочется ли Вам, devIce, какой-нибудь SaveHTMLToRTF метод получить?
Тут все будет зависеть от сложности Вашего html документа. Если он в "нативном" html без использования стилей, то способ скалогрыза - это почти решенная задача. Но во второй части нужно будет "просто" обойти полученное DOM-дерево и "собрать" документ как строку или поток, подставляя вместо html-тегов их rtf аналоги. Например:
Тут все будет зависеть от сложности Вашего html документа. Если он в "нативном" html без использования стилей, то способ скалогрыза - это почти решенная задача. Но во второй части нужно будет "просто" обойти полученное DOM-дерево и "собрать" документ как строку или поток, подставляя вместо html-тегов их rtf аналоги. Например:
Код: Выделить всё
вместо <b>...</b>, вставляете \b1... \b0
HTML достаточно простой. Единственное что не могу понять в работе с RTF, это работу с таблицами и отрисовкой бордюров таблиц. В принципе я легко могу отказаться от HTML, если вкурю как RichView подгружает rtf-текст из файла, потому что когда я делал через RicvView.lines.LoadFromFile() у меня ничего не выводит в RichView и при закрытии приложения выскакивает ошибка "Проект вызвал класс исключения 'Extrnal: SIGSEGV'" и показывает на строку 405 RichView.pas
в архиве файл rtf, который я пытаюсь скормить RichView.
Код: Выделить всё
if TLineInfo(lines.objects[i]).StyleNo = -3 then { image}в архиве файл rtf, который я пытаюсь скормить RichView.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Когда мне нужно было создавать rtf я просто создавал разные вариации таблиц и изучал содержимое файла.
Вышло примерно так:
Вышло примерно так:
Код: Выделить всё
function GridToRTF(Grid: TStringGrid): string;
var
i, j: Integer;
Temp: double;
FontColor, FontAttrib, FontSize, FontName: string;
begin
Creator;
FontColor := GetRTFFontColorTableName(Grid.Font.Color);
FontSize := GetRTFFontSize(Grid.Font.Size);
FontAttrib := GetRTFFontAttrib(Grid.Font.Style);
FontName := GetRTFFontTableName(Grid.Font.Name);
RTF.Append('\par \pard\plain\cgrid');
RTF.Append('{\stylesheet{\nowidctlpar\widctlpar\adjustright \fs20\cgrid \snext0 Normal;}');
RTF.Append('{\*\cs10 \additive Default Paragraph Font;}}');
RTF.Append('{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta');
RTF.Append('.}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang');
RTF.Append('{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1' +
'\pnindent720\pnhang{\pntxta');
RTF.Append('.}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta');
RTF.Append(')}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta');
RTF.Append(')}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang');
RTF.Append('{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720'
+
'\pnhang{\pntxtb (}{\pntxta');
RTF.Append(')}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta');
RTF.Append(')}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}');
for i := 0 to Grid.RowCount - 1 do
begin
RTF.Append('\trowd');
RTF.Append('\trgaph108');
RTF.Append('\trrh260');
RTF.Append('\trleft90');
RTF.Append('\trbrdrt\brdrs\brdrw10');
RTF.Append('\trbrdrl\brdrs\brdrw10');
RTF.Append('\trbrdrb\brdrs\brdrw10');
RTF.Append('\trbrdrr\brdrs\brdrw10');
RTF.Append('\trbrdrh\brdrs\brdrw10');
RTF.Append('\trbrdrv\brdrs\brdrw10');
for j := 0 to Grid.ColCount - 1 do
begin
RTF.Append('\clvertalt');
RTF.Append('\clbrdrt\brdrs\brdrw10');
RTF.Append('\clbrdrl\brdrs\brdrw10');
RTF.Append('\clbrdrb\brdrs\brdrw10');
RTF.Append('\clbrdrr\brdrs\brdrw10');
if (j < Grid.FixedCols) or (i < Grid.FixedRows) then
RTF.Append('\clcbpat8');
RTF.Append('\cltxlrtb');
Temp := (j + 1) * Grid.DefaultColWidth;
Temp := (Temp / Screen.pixelsperinch) * 1440.0 + 108.0;
RTF.Append('\cellx' + IntToStr(round(Temp)));
end;
RTF.Append('\pard\ri-123\nowidctlpar\widctlpar\intbl\adjustright');
RTF.Append(' {' + FontName + FontSize + FontAttrib + FontColor + '\cgrid0');
for j := 0 to Grid.ColCount - 1 do
RTF.Append(Grid.Cells[j, i] + '\cell ');
RTF.Append('}');
RTF.Append('\pard \nowidctlpar\widctlpar\intbl\adjustright {\row}');
end;
RTF.Append('\pard\nowidctlpar\widctlpar\adjustright {');
Result := RTF.Text;
Destroyer;
end;
Timid писал(а):Вышло примерно так:
у HTML'а то же самое выглядить неизмеримо более по человечески и понятно с первого взгляда...
Это да, но "не нативно" для Word, и нельзя внедрять векторные изображения. А для системы анализа данных, выводящую отчеты (с графиками), которые потом нужно редактировать, другого варианта нет 
