Recent

Author Topic: Opendocument (libreoffice)  (Read 1108 times)

cpalx

  • Hero Member
  • *****
  • Posts: 754
Opendocument (libreoffice)
« on: August 29, 2022, 06:44:33 pm »
Hello

Is it posble to open a libreoffice document ( odt file ), and modified?

i was playing with fpODT, but it does not have open file feature

beria

  • Jr. Member
  • **
  • Posts: 70
Re: Opendocument (libreoffice)
« Reply #1 on: August 30, 2022, 12:16:43 am »
Hello

Is it posble to open a libreoffice document ( odt file ), and modified?

i was playing with fpODT, but it does not have open file feature

1. Cross-platform - there is a standard library fpvectorial. There are examples on the wiki. But the functionality is very limited. Particularly it has no ability to work with images in text...

2. OLE. VERY slow and glitchy.
Code: Pascal  [Select][+][-]
  1. var
  2.   ServiceManager, Desktop : Variant;
  3.   CoreReflection, PropertyValue, VA: Variant;
  4.   Document: Variant;
  5.   Table, TableCell : Variant;
  6.   obj, objText, objCursor : Variant;
  7.   w,n : integer;
  8.   Cols,range : Variant;
  9.   str,fname1,faddresse1,finn,ffullname:widestring;
  10.   i,j:integer;
  11.   sum,s,sql_str:string;
  12.   sumzatr:currency;
  13. begin
  14.   if VarIsEmpty(ServiceManager) then
  15.     try
  16.       ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
  17.     except
  18.       Raise Exception.Create('Couldn''t get ServiceManager');
  19.       Exit;
  20.     end;
  21.   sql_firm.Close;
  22.   sql_firm.sql.Text:='select * from tfirm where fshortname='''+ed_firm.Text+'''';
  23.   sql_firm.open;
  24.   fname1:=ed_firm.Text;
  25.   faddresse1:=trim(sql_firmfaddress.Value);
  26.   finn:='ИНН '+trim(sql_firmfinn.Value);
  27.   ffullname:= trim(sql_firmffullname.Value);
  28.   sql_firm.Close;
  29.   CoreReflection := ServiceManager.createInstance('com.sun.star.reflection.CoreReflection');
  30.   CoreReflection.forName('com.sun.star.beans.PropertyValue').createObject(PropertyValue);
  31.   VA := VarArrayCreate([0, 0], varVariant);
  32.   VA[0] := PropertyValue;
  33.  
  34.   Desktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
  35.   Document := Desktop.LoadComponentFromURL( 'private:factory/swriter','_blank', 0,  VA);
  36.   if (VarIsNull(Document) or VarIsEmpty(Document)) then
  37.      begin
  38.        Raise Exception.Create('Couldn''t create document');
  39.        Exit;
  40.      end;
  41.     //доступ к тексту документа
  42.   objText := Document.getText;
  43. // доступ к курсору документа
  44. objCursor := objText.createTextCursor;
  45. //для курсора задаем шрифт
  46.   objCursor.setPropertyValue('CharHeight',12); //size
  47.   objCursor.setPropertyValue('CharWeight',150);//bold
  48.   //для курсора задаем положение текста на странице
  49.   objCursor.setPropertyValue('ParaAdjust',2);  //left
  50.   //переводим кодировку utf8 в текущую на ПК
  51.   str:=utf8decode(fname1+', '+ffullname);
  52.   //выводим текст
  53.     objText.insertString(objCursor, str, false);
  54.     //вносим разделитель - перенос строки не привязанный к размеру шрифта
  55.    objText.insertControlCharacter(objCursor, 0, false );
  56.   str:=utf8decode(faddresse1);
  57. objText.insertString(objCursor, str, false);
  58. objText.insertControlCharacter(objCursor, 0, false );
  59.  
  60. str:=utf8decode(finn);
  61. objText.insertString(objCursor, str, false);
  62. objText.insertControlCharacter(objCursor, 0, false );//разделитель
  63.  
  64.     //Заголовок документа
  65.   objCursor.setPropertyValue('CharHeight',22); //size
  66.   objCursor.setPropertyValue('CharWeight',150);//bold
  67.   objCursor.setPropertyValue('ParaAdjust',3);  //center
  68.   str:=utf8decode('Калькуляция на изделие : ');
  69.   objText.insertString(objCursor, str, false);
  70.   objText.insertControlCharacter(objCursor, 0, false );//разделитель
  71.   objCursor.setPropertyValue('CharHeight',16); //size
  72.   str:=utf8decode(trim(sql_nomFDESCR.Value));
  73.   objText.insertString(objCursor, str, false);
  74.   objText.insertControlCharacter(objCursor, 0, false );//разделитель
  75.   objText.insertControlCharacter(objCursor, 0, false );//разделитель
  76.   str:=utf8decode('Комплектация (изделия и материалы)');
  77.   objText.insertString(objCursor, str, false);
  78.   objText.insertControlCharacter(objCursor, 0, false ); //PARA_BREAK
  79.  
  80.   //создаем таблицу
  81.  
  82.   Table := Document.createInstance( 'com.sun.star.text.TextTable' );
  83.   sql_str:='select * from tcalc where fdescr='''+'material'+''' and fud<>1 and ftovar='+sql_nomfid.asstring;
  84.   sql_calc1.close;
  85.   sql_calc1.SQL.Text:=sql_str;
  86.   sql_calc1.open;
  87.   sql_calc1.last;
  88.     n:=sql_calc1.RecordCount;
  89.     //задаем количество ячеек
  90.   Table.initialize(n+1, 3);  //row, column
  91.   //горизонтальная ореинтация
  92.   Table.HoriOrient := 0;
  93. //  поле слева
  94.   Table.LeftMargin := 20; // 2* 1/100 mm;
  95.   //  поле справа
  96.   Table.RightMargin := 20;
  97.   //доступ к тексту таблицы
  98.   Document.getText.insertTextContent( objCursor, Table, false );
  99.   //доступ к массиву вертикальных линий внутри таблицы
  100.   obj := Table.TableColumnSeparators;
  101.    //ширина первой колонки (поз. от начала таблы верт. разд. линии)
  102.     obj[0].Position :=8000;//zatr
  103.    // ширина второй колонки
  104.   obj[1].Position := obj[0].Position+900;//kol
  105. //передаем данные массива вертикальных линий в таблицу
  106.   Table.TableColumnSeparators := obj;
  107.   //заголовоки колонок таблицы (доступ возможен по имени или по индексу, по имени с 1, по индексу с 0)
  108.    str:=utf8decode('Наименование затрат');
  109.   TableCell := Table.getCellByName('A1');
  110.   TableCell.setString(str);
  111.    str:=utf8decode('Кол-во');
  112.   TableCell := Table.getCellByname('B1');
  113.    TableCell.setString(str);
  114.     str:=utf8decode('Сумма');
  115.   TableCell := Table.getCellByname('C1');
  116.    TableCell.setString(str);
  117.   //конец шапки
  118.      //выделяем участок таблицы центруем текст в ячейках по горизонтали
  119.   str:='B1:C'+inttostr(n+1);
  120.    range := table.getCellRangeByname(str);
  121.   range.setPropertyValue('ParaAdjust',3);  //center
  122.      sumzatr:=0;
  123.        sql_calc1.First;
  124.        //заполняем материалы
  125.   for i:=1 to sql_calc1.RecordCount do begin
  126.     for j:=0 to 2 do begin
  127.     //доступ к ячейке по индексу (i=0 - шапка)
  128.   TableCell := Table.getCellByPosition(j, i);
  129. if j=0 then begin
  130. str:=utf8decode(trim(sql_calc1Fzatr.Value));  TableCell.setString(str);
  131. end;
  132. if j=1 then begin
  133. str:=utf8decode(trim(sql_calc1Fkolvo.AsString)); TableCell.setString(str);
  134. end;
  135. if j=2 then begin
  136. str:=utf8decode(sql_calc1Fsumzatr.AsString); TableCell.setString(str);
  137. end;
  138.       end;
  139.     sumzatr:=sumzatr+ sql_calc1Fsumzatr.value;
  140.   sql_calc1.Next;
  141. end;
  142.    //конец таблицы  1
  143.    //отделяем заголовок второй таблицы(ниже) от первой таблицы
  144.   objText.insertControlCharacter(objCursor, 0, false );//разделитель
  145.   objCursor.setPropertyValue('CharHeight',16); //size
  146.   objCursor.setPropertyValue('CharWeight',150);//bold
  147.   objCursor.setPropertyValue('ParaAdjust',3);  //center
  148.   //заголовок второй таблицы
  149.   str:=utf8decode('Прочие затраты (зарплата и т.п.)');
  150.   objText.insertString(objCursor, str, false);
  151.   objText.insertControlCharacter(objCursor, 0, false ); //PARA_BREAK
  152.    objCursor.setPropertyValue('CharHeight',12); //size
  153.   objCursor.setPropertyValue('CharWeight',150);//bold
  154.   objCursor.setPropertyValue('ParaAdjust',2);  //center
  155.   Table := Document.createInstance( 'com.sun.star.text.TextTable' );
  156.   sql_str:='select * from tcalc where fdescr='''+'rabota'+''' and fud<>1 and ftovar='+sql_nomfid.asstring;
  157.   sql_calc1.close;
  158.   sql_calc1.SQL.Text:=sql_str;
  159.   sql_calc1.open;
  160.   sql_calc1.last;
  161.     n:=sql_calc1.RecordCount;
  162.   Table.initialize(n+1, 2);  //row, column
  163.   Table.HoriOrient := 0;
  164.   Table.LeftMargin := 20; // 2* 1/100 mm;
  165.   Table.RightMargin := 20;
  166.    Document.getText.insertTextContent( objCursor, Table, false );
  167.    obj := Table.TableColumnSeparators;
  168.    obj[0].Position :=8000;//zatr
  169.    Table.TableColumnSeparators := obj;
  170.    str:=utf8decode('Наименование затрат');
  171.   TableCell := Table.getCellByName('A1');
  172.   TableCell.setString(str);
  173.    str:=utf8decode('Сумма');
  174.   TableCell := Table.getCellByname('B1');
  175.    TableCell.setString(str);
  176.    //конец шапки
  177.   //центрируем текст в ячейках второго столбца
  178.      str:='B1:B'+inttostr(n+1);
  179.    range := table.getCellRangeByname(str);
  180.   range.setPropertyValue('ParaAdjust',3);  //center
  181.        sql_calc1.First;
  182.        //заполняем
  183.   for i:=1 to sql_calc1.RecordCount do begin
  184.     for j:=0 to 1 do begin
  185.   TableCell := Table.getCellByPosition(j, i);
  186. if j=0 then begin  str:=utf8decode(trim(sql_calc1Fzatr.Value));TableCell.setString(str);end;
  187. if j=1 then begin  str:=utf8decode(sql_calc1Fsumzatr.AsString);; TableCell.setString(str);end;
  188.       end;
  189.     sumzatr:=sumzatr+ sql_calc1Fsumzatr.value;
  190.   sql_calc1.Next;
  191. end;
  192.    //конец таблицы
  193.   //отделяем текст (ниже) от таблиц
  194.    objText.insertControlCharacter(objCursor, 0, false ); //PARA_BREAK
  195.   objText.insertControlCharacter(objCursor, 1, false ); //LINE_BREAK
  196.   objText.insertControlCharacter(objCursor, 0, false ); //PARA_BREAK
  197.   //Параметры текста
  198.    objCursor.setPropertyValue('CharHeight',12); //size
  199.    objCursor.setPropertyValue('CharWeight',150);//bold
  200.    objCursor.setPropertyValue('ParaAdjust',2);  //left
  201.     s:= currtostr(sql_nomfcenar.value);
  202.     f_sborka.Sum_Propisyu(s,Sum) ;
  203.   sum:=trim(sum);
  204.   str:= utf8decode('Итого затрат : '+ currtostr(sumzatr)+' руб.'+#13#10);
  205.    objText.insertString(objCursor, str, false);
  206.    str:= utf8decode('С учетом накладных расходов: '+ sql_nomfcenar.AsString+' руб. /'+sum+'/'+#13#10+'Менеджер  ');
  207.     objText.insertString(objCursor, str, false);
  208.   end;


3. Very fast, cross platform. It takes a file, unpacks it, and parses it like xlm... I've seen examples of this.

egsuh

  • Hero Member
  • *****
  • Posts: 1738
Re: Opendocument (libreoffice)
« Reply #2 on: August 30, 2022, 04:29:21 am »
There is an internal language called OpenOffice.org Basic. You may modify the contents calling the Basic commands within pascal.

 

TinyPortal © 2005-2018