Страница 10 из 13
Re: Работа с uOpenOffice
Добавлено: 05.06.2012 23:04:35
Brainenjii
Лицензия LGPL предполагает, что ограничения копилефта не распространяются на производные программы, только в случае связывания (считается что динамического, хотя в тексте LGPL тип связывания не уточняется). При использовании исходного LGPL кода напрямую - все GPL ограничения должны вступать в силу (хотя судебных дел ещё не было). Modified означает модифицированная и в случае с FCL и LCL эта модификация как раз позволяет и статическое связывание на уровне исходного кода. Как-то так ^_^
Лично меня всегда несколько настораживала эта приставка modified ^_^ Есть кошерная лицензия Apache, ведущая себя фактически так же, как и эта самая modified LGPL. Так что я всё что публикую - публикую под Apache ^_^ Она вполне совместима и с LGPL (модифицированным и нет) и пропиетарным кодом.
Re: Работа с uOpenOffice
Добавлено: 06.06.2012 00:03:19
leo_bsv
нужно будет связаться с автором - согласовать.
Re: Работа с uOpenOffice
Добавлено: 06.06.2012 10:08:13
v-t-l
Brainenjii писал(а):По планам: cоздание документа/таблиц прямо из кода считаю излишним.
Согласен! У самого давно в голове такие идеи крутятся. Нужно не создавать из кода документ, а парсить шаблон, выискивая теги. Что-то вроде:
{r:[Table1]} - размножить строку таблицы документа, в которой находится этот тег, для всех записей набора данных "Table1" (заменяя вложенные теги);
{f:[Table1.Field1]:%5.2d} - вставить значение поля с именем "Field1" текущей записи набора данных "Table1" (":%5.2d"-опциональная строка формата);
{f:VarDate1:mmm yyyy г.} - вставить значение переменной/параметра отчета с именем "VarDate1";
{p:[Table1]} - размножить параграф;
{s:[Table1]} - размножить раздел.
Brainenjii писал(а):В ближайших мечтах - добавить возможность построения Master/Detail и Cross отчетов...
ODT позволяет вложенные таблицы, т.е. повторять строку таблицы для записей "Master", в которую (в строку) вложена таблица с размножаемыми строками для записей набора "Detail".
Для крос-отчетов что-то вроде:
{c:[Table1]} - размножить ячейки помеченного этим тегом столбца во всех строках таблицы документа для всех записей набора данных "Table1" (заменяя вложенные теги).
Brainenjii писал(а):В мечтах чуть отдалённей - связывание таблиц и каких-нибудь DataSet'ов...
Нужен компонент TDBWorkspace (возможно на базе TDataModule), умеющий читать из файла/потока/строки конфигурацию и создающий рабочее окружение для отчета (необходимые наборы данных и связи между ними).
Brainenjii писал(а):для преобразования в html использую xsltproc
man libreoffice писал(а): --convert-to output_file_extension[:output_filter_name] [--outdir output_dir] file...
Batch converts files. If --outdir is not specified then the current working directory is used as the output directory for the converted files.
Examples:
--convert-to pdf *.doc
Converts all .doc files to PDFs.
--convert-to pdf:writer_pdf_Export --outdir /home/user *.doc
Converts all .doc files to PDFs using the settings in the Writer PDF export dialog and saving them in /home/user.
Правда, удастся ли запустить libreoffice без иксов, не уверен.
Re: Работа с uOpenOffice
Добавлено: 06.06.2012 10:25:19
Brainenjii
По поводу тегов - пока в голове все-таки работа с таблицами и повторяющимися строками из кода. Если введем такого рода шаблоны - кроме программистов никто такой шаблон построить не сможет.
Про вложенные таблицы - беда в том, что как потом находить "скопированные" таблицы. Сейчас обращение идет по имени. Хотя проблема, безусловно, решаемая.
По поводу преобразования - тягать громадину libreoffice ради преобразования?! Ненене ^_^ xsltproc гораздо менее прожорливая игрушка. Попиксельной точности HTML, конечно, не даст, но печать вообще должна осуществляться у клиента - а там и иксы, и OOo, и в pdf преобразования и т.д.
Re: Работа с uOpenOffice
Добавлено: 06.06.2012 11:10:49
v-t-l
Brainenjii писал(а):По поводу тегов - пока в голове все-таки работа с таблицами и повторяющимися строками из кода. Если введем такого рода шаблоны - кроме программистов никто такой шаблон построить не сможет.
В одном окне - офис с открытым для правки шаблоном, в другом окне - отдельное приложение - визуальный помощник, позволяющий настроить рабочее пространство отчета и генерировать теги для вставки в шаблон отчета (через буфер обмена или drag&drop).
Brainenjii писал(а):Про вложенные таблицы - беда в том, что как потом находить "скопированные" таблицы.
Их не нужно находить

, нужно распарсить шаблон отчета на дерево строковых кусков-секций, найдя с учетом вложенности открывающие и закрывающие xml-тэги для для размножаемых элементов (даже, возможно, без использования DOM), а после выводить секции, обрабатывая их и все вложенные секции рекурсивно.
Добавлено спустя 5 минут 48 секунд:при этом подходе DOM не нужен и даже вреден (по крайней мере, на этапе генерации результата)

.
Re: Работа с uOpenOffice
Добавлено: 07.06.2012 03:15:11
leo_bsv
v-t-l писал(а):распарсить шаблон отчета на дерево строковых кусков-секций, найдя с учетом вложенности открывающие и закрывающие xml-тэги для для размножаемых элементов
прям какой-то DOM-2

чем DOM плох для подобных операций? всё уже распарсено и в рот положено...
а вообще идея с тэгами - пища для размышления. Вполне себе ничего было бы управлять поведением шаблона из самого шаблона...
Re: Работа с uOpenOffice
Добавлено: 07.06.2012 20:28:18
v-t-l
Без-DOM-ные операции теоретически позволят работать не только с XML-шаблонами, но и плоским текстом или даже binary.
Re: Работа с uOpenOffice
Добавлено: 12.06.2012 15:10:41
Arkano
Народ.
Так я и бьюсь как муха об стекло.
Ну не могу я запустить банальный "Hello, world"
Lazarus+Win7+OO
Стоп происходит в odfproc.pas
Процедура TOdt.GenerateDocument
Самая первая строка после бегина уже не проходит:
Код: Выделить всё
if (Not Assigned(FManifest)) or (FManifest.ChildNodes.Count=0) then
Ошибка выскакивает такая: Access violation
При этом в сообщениях ошибок компиляции нет.
В самой программе на кнопку стоит такой код:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
begin
Odt:=TOdt.Create;
Odt.LoadTemplate('blank.odt');
Odt.ShowDocument('','blank.odt');
Odt.Destroy;
end;
Бьюсь реально как муха об стекло... Уже что только не перевертел.
ОГРОМНЕЙШАЯ ПРОСЬБА выложить рабочий "Hello, World" с рабочим модулем.
Мне достаточно просто запуск OO и генерация в нем минимального контента (текс+таблица). Конкретно - формирование товарного чека.
Re: Работа с uOpenOffice
Добавлено: 12.06.2012 21:21:53
leo_bsv
Arkano, для начала попробуйте использовать такую конструкцию:
Код: Выделить всё
Odt:=TOdt.Create;
if Odt.LoadTemplate('blank.odt') then Odt.ShowDocument('','blank.odt')
else ShowMessage('шаблон не загрузился, возможно я не правильно указал путь к шаблону, а может быть функция загрузки модуля ODFProc LoadTemplate не работает под w7 и требует доработки...');
Odt.Destroy;
Re: Работа с uOpenOffice
Добавлено: 12.06.2012 22:27:51
Arkano
leo_bsv писал(а):Arkano, для начала попробуйте использовать такую конструкцию:
Код: Выделить всё
Odt:=TOdt.Create;
if Odt.LoadTemplate('blank.odt') then Odt.ShowDocument('','blank.odt')
else ShowMessage('шаблон не загрузился, возможно я не правильно указал путь к шаблону, а может быть функция загрузки модуля ODFProc LoadTemplate не работает под w7 и требует доработки...');
Odt.Destroy;
Ну в моем случае не удивительно даже: 'шаблон не загрузился, возможно я не правильно указал путь к шаблону, а может быть функция загрузки модуля ODFProc LoadTemplate не работает под w7 и требует доработки...'
Может я и путь не верно указал, как его указать верно?
Пробовал и так:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
Odt:=TOdt.Create;
if Odt.LoadTemplate('')
then Odt.ShowDocument('','')
else ShowMessage('шаблон не загрузился, возможно я не правильно указал путь к шаблону, а может быть функция загрузки модуля ODFProc LoadTemplate не работает под w7 и требует доработки...');
Odt.Destroy;
end;
Так же выскакивает та же мессага.
Изменил функцию так:
Код: Выделить всё
function TOdt.LoadTemplate(FileName: string):boolean;
var
UnZipper: TUnZipper;
begin
Unit1.Form1.Memo1.Lines.Add('1');
try
Unit1.Form1.Memo1.Lines.Add('2');
try
//распаковываем шаблон
Unit1.Form1.Memo1.Lines.Add('3');
UnZipper := TUnZipper.Create;
Unit1.Form1.Memo1.Lines.Add('4');
UnZipper.FileName := FileName;
Unit1.Form1.Memo1.Lines.Add('5');
UnZipper.OutputPath := TempDir;
Unit1.Form1.Memo1.Lines.Add('6');
UnZipper.Examine;
Unit1.Form1.Memo1.Lines.Add('7');
UnZipper.UnZipAllFiles;
Unit1.Form1.Memo1.Lines.Add('8');
//подгружаем данные
LoadDocument(TempDir+'styles.xml',ftStyles);
Unit1.Form1.Memo1.Lines.Add('9');
LoadDocument(TempDir+'content.xml',ftContent);
Unit1.Form1.Memo1.Lines.Add('10');
LoadDocument(TempDir+IncludeTrailingPathDelimiter('META-INF')+'manifest.xml',ftManifest);
Unit1.Form1.Memo1.Lines.Add('11');
LoadDocument(TempDir+'meta.xml',ftMeta);
Unit1.Form1.Memo1.Lines.Add('12');
LoadDocument(TempDir+'settings.xml',ftSettings);
Unit1.Form1.Memo1.Lines.Add('13');
Result:=true;
Unit1.Form1.Memo1.Lines.Add('14');
except
Unit1.Form1.Memo1.Lines.Add('15');
Result:=false;
Unit1.Form1.Memo1.Lines.Add('16');
end;
Unit1.Form1.Memo1.Lines.Add('17');
finally
Unit1.Form1.Memo1.Lines.Add('18');
UnZipper.Free;
Unit1.Form1.Memo1.Lines.Add('19');
end;
Unit1.Form1.Memo1.Lines.Add('Приехали');
end;
Каким-то волшебным образом выпдают из выполнения "строки" с 7 по 14.
Получаем следующее:
Re: Работа с uOpenOffice
Добавлено: 12.06.2012 23:13:52
leo_bsv
путь должен быть указан полностью, кроме того, для проверки существования шаблона можно воспользоваться функцией FileExists()...
Каким-то волшебным образом выпдают из выполнения "строки" с 7 по 14.
ничего волшебного - просто try прерывается при попытке протестировать архив... по видимому архиватор на этой строке впервые реально обращается к файлу, но из-за неправильного пути идёт лесом

Re: Работа с uOpenOffice
Добавлено: 13.06.2012 01:31:18
Arkano
leo_bsv, а путь как верно указывать целиком?
Чего только не встречал для лазаруса, но "своего" случая не видел. Путаница с / и \, а так же местами // и т.п.

Указываю "обычным" для себя способом, а именно так:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
Odt:=TOdt.Create;
if Odt.LoadTemplate('C:\uopenoffice(2)\2\blank.odt')
then Odt.ShowDocument('','C:\uopenoffice(2)\2\blank.odt')
else ShowMessage('шаблон не загрузился, возможно я не правильно указал путь к шаблону, а может быть функция загрузки модуля ODFProc LoadTemplate не работает под w7 и требует доработки...');
Odt.Destroy;
end;
Дело в том, что на лазарус перехожу с делфи.
По сути перекидываю готовый проект, который под делфи у меня работает отлично, но те модули для работы с ОО написанные для делфи в лазарусе уже не катят. А лазарус, уже заметил, имеет свои "особенности".
Как-то что-то припоминаю пробовал с какой-то там перекодировкой UTF8 для указания пути, но никак не встречу ничего подобного. С этим UTF8 вроде работало, правда не уверен, что я для пути это применял. Я уже в хлам запутался. Времени нормально уделить проекту не могу. То там 5 минут вырву, то тут 10, вот "память" моя и "рвется"...

Спасибо за помощь.
Re: Работа с uOpenOffice
Добавлено: 13.06.2012 02:01:51
leo_bsv
вообще-то путь указывается с \ для виндоус и / для линдоус...
вообще в вашем последнем посте вроде всё правильно написано... код приведённый вами работает? или с правильным полным путём к файлу шаблона - всё-равно не работает? Если нет - ошибки в студию.
про UTF8 возможно имелась ввиду функция UTF8ToSys? это надо уже спрашивать у тех кто под винду пишет... к сожалению ничем тут помочь не могу. в наличии только линукс, винды нет на машинах...

Re: Работа с uOpenOffice
Добавлено: 13.06.2012 09:28:24
Arkano
leo_bsv, срабатывает ветка "иначе" Вашего кода, и выскакивает мессага, про неверный путь или невозможность работы функции в W7. Сегодня проверю еще этот же код на XP.
Re: Работа с uOpenOffice
Добавлено: 13.06.2012 21:32:24
leo_bsv
Arkano писал(а):leo_bsv, срабатывает ветка "иначе" Вашего кода, и выскакивает мессага, про неверный путь или невозможность работы функции в W7. Сегодня проверю еще этот же код на XP.
если предположить что путь корректный - то значит проблема в функции загрузки шаблона, вообще говоря никто и не обещал что всё будет работать в винде

, но даже если и не работает - решение очень близко, разберётесь - присылайте патч, исправим сорцы.