вторник, 23 июля 2013 г.

Запускаем Eclipse для различных workspace с разными профилями

Одно время я держал несколько установок Eclipse для различных профилей, в одном разрабатывал консольные и GUI приложения, в другом - веб-сервисы и веб-приложения.
J2EE и J2SE инсталляции.
Затем, подумал, а зачем там неправильно? Не логичнее ли держать одну полную "установку", которая бы работала с различными профилями?

Запустить Eclipse на определенном workspace довольно просто:
eclipse.exe -data C:\workspace.junoSR2

Кроме того, можно для каждого workspace запускать определенный продукт:
eclipse.exe -data c:\workspace.junoSR2.j2se -product -product org.eclipse.epp.package.rcp.product
eclipse.exe -data C:\workspace.junoSR2 -product org.eclipse.epp.package.jee.product

Кстати, в этом случае на панели задач буду разные иконки приложений.
Вот тут статья, как сделать свой "продукт".

понедельник, 1 июля 2013 г.

Convert Microsoft Word/Excel (*.doc, docx, xls, xlsx) document to PDF with OpenOffice

Способ взаимодействия с Microsoft Office, описанный мною в http://mortihead.blogspot.ru/2013/06/java-microsoft-office.html был использован для преобразования документов в PDF на лету.
Однако, практическое применение выявило ряд проблем.
Использование мостика Java: Jacob -> MS Office оказалось нестабильным.
Поэтому, я нашел альтернативный способ преобразования: используя OpenOffice.

1) Запускаем OpenOffice:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard


2) Используем JOD Converter:

File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");
 
// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
 
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
 
// close the connection
connection.disconnect();
 
Конвертер определяет вид конвертации по расширению файла.
По первым впечатлениям - все немного быстрее, чем через Microsoft Office.

P.S. Понятно, что при этом способе потребуется запускать OpenOffice as service. Нашел несколько статей как это сделать, приведу здесь работающий способ:

1) Install OpenOffice with a complete installation to the default paths.
2) sc create "openofficeserver" binPath= "\"C:\Program Files (x86)\OpenOffice.org 3\program\soffice.exe\" -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard" DisplayName= "OpenOffice 3.4.1 Server" start= auto
[SC] CreateService SUCCESS

3) Copy srvany.exe from the Windows Server 2003 Resource Kit to a path on the Windows Server 2008 R2 server.

    Open RegEdit
    Navigate to HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\openofficeserver
    Copy the value of the ImagePath to the clipboard.
    Alter the value of ImagePath to "c:\somepathto\srvany.exe"
    Add a new Key named "Parameters", this is essentially a folder.
    Add a new String Value named "Application" and set the value to the clipboard contents copied from the ImagePath.

You should now be able to start the service.

Check that the service is running: 
netstat -nao|findstr -c":8100"

Манипуляции с srvany.exe требуются по причине, что исполняемый файл soffice.exe - не является полноценным сервисом Windows, и не может обрабатывать команды сервиса Stop, Start и т.д., поэтому требуется прослойка, которая будет этим заниматься.
Так же, возможно использование других, альтернативных RunAsService программ.

Update от 26.12.2013:
Данный способ работает только с версиями OpenOffice 3.X.
С новой, 4.0.1 версией - не заработало.
Проект JOD 2 закрыт, новый проект тут:
http://code.google.com/p/jodconverter/
Но SocketOpenOfficeConnection is not supported by
JODConverter 3
Источник: тут