Альтернатива Createobject()

  • Автор темы alik86
  • Дата начала
A

alik86

Доброго времени всем!
И так...
Ситуация:
Имеется приложение, состоящее из некоторого количества баз Lotus. Начиная с незапамятных времен в приложении работает функционал интеграции с MS Office (тут все: и Word, и Excel, и PowerPoint) -- тут и создание файлов с нуля, и создание их по шаблону... У основания всех этих дел лежит LotusScript CreateObject() function.
Некоторое время назад поступила вводная о том, что всё больше и больше пользователей переходят на OpenOffice, но многие и не переходят.
Хорошо. Был разработан функционал, который дает пользователю право выбора офиса. У основания всего этого (это уже мной) так же был положен CreateObject(). И так всё красиво работало.
И вот поступает очередная вводная о том, что теперь надобы позаботиться и о пользователях Linux.

Вопрос:
Что же делать? Как же быть? Как наиболее безболезненно отказаться от CreateObject() дабы было хорошо и пользователям Linux?

Мои мысли:
Оно вроде как у Apache OpenOffice 4.x.x есть богатая API (в частности глаз косится на java, но не побрезговал бы и OpenOffice.org Basic). Вроде как ее и хотелось бы использовать. Но как? С чего начать? Ума не приложу?
Вот, например, простенький код создания Calc документа:
Код:
Sub Click(Source As Button)
Dim wsp As New NotesUIWorkspace
Dim oSM, oDesk, oDoc As Variant	
Dim args()

Set oSM = CreateObject("com.sun.star.ServiceManager")
Set oDesk = oSM.CreateInstance("com.sun.star.frame.Desktop")
Set oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)		
End Sub
Как в лотусе сделать то же самое но без CreateObject()?

Идеи, советы, подсказки, ссылки?
Спасибо! :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
умеет и odf
 
A

alik86

Спасибо откликнувшимся!
Посмотрел. Попробовал.
В ссылке от lmike (да и в былых Ваших изысканиях на эту тему) смущает остутствие apache.org в пруфлинках.
Ссылка garrickа смущает меньше, но всё же что-то есть.
Может в конечном итоге мне ничего и не останется кроме как прийти к одной из них, но пока я предпринимаю попытки разобраться с самым что ни на есть родным для Apache OpenOffice (на мой взгляд)
Но вот что-то не очень получается прикрутить это дело к nsf.
Что я делаю:
1. Читаю
2. Создаю у себя в базе библиотеку Java (назову ее TestJava) и импортирую в нее juh.jar, jurt.jar, ridl.jar, unoil.jar из ..\OpenOffice 4\program\classes.
3. Создаю в этой библиотеке класс
Код:
public class Trial {	
public static void createDocument(){
try{
// Get the remote office component context
com.sun.star.uno.XComponentContext xContext = null;
xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
// Get the remote office service manager
com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager();
// Get the root frame (i.e. desktop) of openoffice framework.
Object oDesktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
// Desktop has 3 interfaces. The XComponentLoader interface provides ability to load components.
com.sun.star.frame.XComponentLoader xCLoader = ( com.sun.star.frame.XComponentLoader ) com.sun.star.uno.UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop);	
// Create a document
com.sun.star.lang.XComponent document = xCLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new com.sun.star.beans.PropertyValue[0]);
} catch( Exception e) {	}
}
}
(и, хочу заметить, никакой ругани не встречаю).
Т.о. я ожидаю, что метод createDocument() должен сделать то же, что и пример в моём первом сообщении.
4. Пытаюсь вызвать метод createDocument()
Код:
UseLSX "*javacon"
Use "TestJava"
Sub Trial()
Dim jSession As JavaSession 
Dim jClass As JavaClass 
Dim jObject As JavaObject 

Set jSession = New JavaSession() 
Set jClass = jSession.GetClass("Trial") 
Set jObject = jClass.CreateObject() 
Call jObject.createDocument()
End Sub
Sub Click(Source As Button)
Call Trial()
End Sub
Но не происходит ровным счетом ничего и в ответ тишина.

Так что же я делаю не так?

P.S. Нечто подобное пытался провернуть и с "Apache ODF Toolkit (incubating)" -- полёт такой же. С "XDocReport" еще не пробовал, но что-то мне подсказывает, что и там будет то же самое.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
а что должно произойти? :)
ведь дальше нет сохранения файла
см. взаимодействие с FileOutputSrteam, я выкладывал
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
344
В чём разница?
OpenOffice API - манипулирует документами OpenOffice при наличии оного на компьютере где производится эта манипуляция, что-то наподобие майкрософтовского OLE.
ODF Toolkit - API для формирования и изменения документов OpenOffice без его наличия. Файлы формируются и редактируются напрямую. Если я ничего не путаю, то в отличии от OpenOffice API нельзя задействовать скриптовые языки OpenOffice (типа VBA в Word).
Simple ODF (ссылку я приводил ранее) - высокоуровневая обёртка над ODF Toolkit.
XDOCReport - позволяет заполнять данными шаблоны DOCX и ODF. В своей работе использует DOCX4J, ODF Toolkit, Apache POI, Velocity или Freemaker и iText (для формирования PDF), и кучу всего ещё по мелочи. Не факт что вся эта хренотень запустится в лотусовой JVM - надо экспериментировать.

А по коду. Да. вы только создаёте файл, ничего не пишите в него и не сохраняете. Или вы ожидаете, что что должно открыться окно редактора, как в Word OLE. Нет - этого не будет.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
XDOCReport - позволяет заполнять данными шаблоны DOCX и ODF. В своей работе использует DOCX4J, ODF Toolkit, Apache POI, Velocity или Freemaker и iText (для формирования PDF), и кучу всего ещё по мелочи. Не факт что вся эта хренотень запустится в лотусовой JVM - надо экспериментировать.
запустится ;) - я уже делал - на ура
нотусня д.б. с жвм 1.5+

Добавлено: причем сам докХэ положил прям в ресурсы джава проекта, либы в jvm/lib/ext, код взял из примера, запуск в космос: DocxNativeLineBreakAndTabWithVelocity.main(new String[]{""});

Добавлено: и, понятно, все либы класть необязательно, ежели нет нужды юзать (например docx4j, freenaker, itext, poi)

Добавлено: чем не нра simple ODF... на этапе счупания - все грузил в память, ну и для случая шаблонов - ну очень много ручного труда
велосити рулед :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
про OpenOffice API присутствие ОО несколько напрягает (для клиента не критично), но на хабре описан рабочий по каментам - рекомендуют не закрывать процесс и прибивать по таймауту, в случае зависонов
с шедульными агентами - не пройдет (можно сервак завесить), но есть , хотя и офиц. на поддерж.
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
344
XDOCReport - пробовал сделать генерацию однотипных документов по форме, надо было сгенерить примерно 10 000 шт. Запускалось как отдельное приложение, часть данных брало из Lotus Notes, часть из Oracle. Сначала всё было здорово, но где-то на 2-ой или 3-ей тысячи оно ёкнулось. ...и так несколько раз подряд. Разбираться отчего и почему не было времени - сделал на FOP.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
garrick ну какбэ в проекте сказано про сыроватость генерации ПДФ из ОДФ через ФОП
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
у меня вообще сложилось впечатление сырости конвертора...
замена в хмл - это не так критично, как цепочка конвертации
я смотрел просто POI 3.9 - там есть особенности конвертации doc (docx не проверял) , на форуме постил по этому поводу
правда там я использовал готовый вариант DOC->POI->FOP (и без velocity, просто тест)
 
A

alik86

Хм, заигрывания с XDocReport, похоже, придется прекратить, не начиная, ибо "XDocReport is Java API to merge XML document created with MS Office (docx, pptx) or OpenOffice (odt)", а у меня то еще и таблицы, и презентации имеются. Да и форматы MS Office без x нужны (.doc, .xls, .ppt). Или оно и это умеет? <_<
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
alik86 секундочку, топик начинался за ОО, а заканчиваем doc
если взялись переводить на ОО - то и незачем doc пользовать
пресохраните doc -> docx
упор либы на ХМЛ
старые форматы - это POI, но горя хлебнете... (ибо сам doc - это очстранное сочетание)
 
A

alik86

Ну как же? Недоразъяснил выходит. Попробую еще раз. <_<
Есть приложение, в нем имеется функционал интеграции с MS Office: Word, Excel, PowerPoint). Функционал различный: и создание файлов с нуля, и создание их по шаблону, сохранение и атаченье файлов к документам lotus, показ сформированных документов пользователю без сохранения и т.п.
Приложение изначально было рассчитано на пользователей MS Windows и Office. Но со временем у приложения появились пользователи Windows, использующие в качестве офисного пакета OpenOffice. Для этих пользователей был написан аналогичный функционал, во главе которого лежит CreateObject("com.sun.star.ServiceManager"). Теперь же стала задача озаботиться еще и пользователями Linux и OpenOffice. Но это вовсе не значит, что надо позабыть о предыдущих группах пользователей. О полном переводе на OO и отказе от MS речи не идет.
Ну а формат .doc? Это как бы тот формат, который относительно безболезненно могут редактировать пользователи всех офисов: MS Office 2003 up, OpenOffice.
Т.е. меня (во всяком случае на первом этапе) больше интересует некая "затычка" для Linux.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
с таким зоопарком, без компромиссов - никак
проперпоинт: если не шаблонизации - наплевать и забыть. Делать PDF, как бонус - нет необходимости в присут. ПП на компе, из "недостатков" (кот. я считаю плюсами) - отсутствие анимации
Но учитывая как у нас создают презы - сомневаюсь что кто-то пойдет по этому пути <_<

ворд: старый формат - POI, и опять - если не нужно править руками (сгенеренный док) - PDF. Новый формат - выше
 
A

alik86

Garrick (а так же lmike и все, все, все), а заводили ли Вы Simple ODF из-под лотуса?
Я начал пробовать и сразу столкнулся с проблемой создания нового текстового документа методом newTextDocument().
Оно ругается:
org.odftoolkit.odfdom.pkg.OdfPackageDocument$Resource createInputStream
SEVERE: Could not find resource: /OdfTextDocument.odt

Я уже вроде и файлик с таким именем создал, и в ресурсы базы его клал, и в ресурсы бибилиотеки, и просто в папку с ntf'кой -- всё мимо.
Код:
Код:
Sub CreateDocument()
Dim jSession As JavaSession 
Dim jClass As JavaClass 
Dim jObject As JavaObject 

Set jSession = New JavaSession() 
Set jClass = jSession.GetClass("org.odftoolkit.simple.TextDocument") 	
Set jObject = jClass.newTextDocument()	'ругается на это
'Set jObject = jClass.loadDocument("c:\\tmp\\template.odt")	'если предыдущую строку заменить этой, то всё работает
Call jObject.addParagraph("Hello World!")
Call jObject.save("c:\\tmp\\CreatedDocument.odt")		
End Sub
Что за дела такие?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
ну судя по сообщению - он хочет в корне создать файл - а оно так позволено?

Добавлено: да и потом - что это за фокус - объект не создан по конструктору
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
344
Вот так работает:

Код:
import lotus.domino.AgentBase;
import lotus.domino.Session;

import org.eclipse.swt.SWT;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.odftoolkit.simple.TextDocument;
import org.odftoolkit.simple.table.Cell;
import org.odftoolkit.simple.table.Table;
import org.odftoolkit.simple.text.list.List;

public class JavaAgent extends AgentBase {

public void NotesMain() {

try {
Session session = getSession();
Display display = Display.getCurrent();
if (display == null) {
display = Display.getDefault();
}
if (display == null) {
display = new Display();
}
TextDocument outputOdt;
outputOdt = TextDocument.newTextDocument();
// add paragraph
outputOdt.addParagraph("Hello World, Hello Simple ODF!");
// add list
outputOdt.addParagraph("The following is a list.");
List list = outputOdt.addList();
String[] items = { "item1", "item2", "item3" };
list.addItems(items);
// add table
Table table = outputOdt.addTable(2, 2);
Cell cell = table.getCellByPosition(0, 0);
cell.setStringValue("Hello World!");

final Shell shell = new Shell(display);
//shell.open();
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
dialog.setText("Save...");
dialog.setFilterNames(new String[] { "Open Office Document" });
dialog.setFilterExtensions(new String[] { "*.odt" });

dialog.setFilterPath(System.getProperty("user.home"));
dialog.setFileName("HelloWorld.odt");
String filename = dialog.open();
outputOdt.save(filename);
shell.close();			
Program.launch(filename);			
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
session.recycle();
} catch (Exception e) {
e.printStackTrace();
}
}
}
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
445
давайте все по-порядку...
ифали имеем статический метод - то вор должен сидеть в тюрьме jar должен лежать в jvm путях (jvm/lib/ext)...
ну просто потому, что инициализация должна произойти до запуска остального кода класса (как это предполагается в штатной работе вне нотусёв)
в бридже это может оказаться иначе (КМК)

Добавлено: garrick а что СВТ нормально отрабатывает в >7.x
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!