TStringList в RTF

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TStringList в RTF

Сообщение devICE » 22.05.2010 11:43:59

Lazarus: 0.9.2.9.25556
FPC: 2.4.1

Приветствую. Меня заинтересовало как можно сохранить TStringList в файл RTF, т.е. по сути мне надо все строки в StringList преобразовать в формат строк RTF и уже в процедуре SaveToFile указать файл с расширением RTF. В StringList лежит код HTML страницы.
Аватара пользователя
devICE
новенький
 
Сообщения: 14
Зарегистрирован: 20.02.2010 20:24:05

Re: TStringList в RTF

Сообщение скалогрыз » 22.05.2010 13:34:18

по-русски: тебе нужно HTML преобразовать в RTF?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: TStringList в RTF

Сообщение devICE » 22.05.2010 14:12:44

да.
Аватара пользователя
devICE
новенький
 
Сообщения: 14
Зарегистрирован: 20.02.2010 20:24:05

Re: TStringList в RTF

Сообщение скалогрыз » 22.05.2010 16:05:14

есть такой модуль: sax_html. Предназначен для чтения html файлов и представление его в виде DOM-документа.

а это уже полдела. Пройдясь по структуре такого дерева можно получить информацию о форматировании... Хотя, сейчас правильно хранить форматирование во (внешнем) .css файле. Если закрыть на это глаза - полдела сделано.

после того информация о форматировании текста получена из HTML есть 2 пути.
1) зарядить её в RichMemo (под Windows или Mac), и вызвать метод SaveRichText
2) ручками записать всё в RTF файл. Возможно есть и готовые классы для записи. Если таких нет, то начать можно от сюда: http://ru.wikipedia.org/wiki/Rich_Text_Format
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: TStringList в RTF

Сообщение Timid » 22.05.2010 20:03:52

Ох чует моя душа, что здесь все сложнее. Не хочется ли Вам, devIce, какой-нибудь SaveHTMLToRTF метод получить?
Тут все будет зависеть от сложности Вашего html документа. Если он в "нативном" html без использования стилей, то способ скалогрыза - это почти решенная задача. Но во второй части нужно будет "просто" обойти полученное DOM-дерево и "собрать" документ как строку или поток, подставляя вместо html-тегов их rtf аналоги. Например:
Код: Выделить всё
вместо <b>...</b>, вставляете \b1... \b0
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: TStringList в RTF

Сообщение devICE » 23.05.2010 18:08:48

HTML достаточно простой. Единственное что не могу понять в работе с RTF, это работу с таблицами и отрисовкой бордюров таблиц. В принципе я легко могу отказаться от HTML, если вкурю как RichView подгружает rtf-текст из файла, потому что когда я делал через RicvView.lines.LoadFromFile() у меня ничего не выводит в RichView и при закрытии приложения выскакивает ошибка "Проект вызвал класс исключения 'Extrnal: SIGSEGV'" и показывает на строку 405 RichView.pas
Код: Выделить всё
        if TLineInfo(lines.objects[i]).StyleNo = -3 then { image}

в архиве файл rtf, который я пытаюсь скормить RichView.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
devICE
новенький
 
Сообщения: 14
Зарегистрирован: 20.02.2010 20:24:05

Re: TStringList в RTF

Сообщение Timid » 24.05.2010 13:12:20

Когда мне нужно было создавать 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
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: TStringList в RTF

Сообщение Vadim » 25.05.2010 05:34:35

Timid писал(а):Вышло примерно так:

у HTML'а то же самое выглядить неизмеримо более по человечески и понятно с первого взгляда... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TStringList в RTF

Сообщение Timid » 26.05.2010 08:31:19

Это да, но "не нативно" для Word, и нельзя внедрять векторные изображения. А для системы анализа данных, выводящую отчеты (с графиками), которые потом нужно редактировать, другого варианта нет :(
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

Рейтинг@Mail.ru