rozwiązania
Demon konwersji
OpenOffice
narzędzie do konwersji
Bartłomiej Górny
Główny zamysł programu oood (skrót od OpenOffice.org Daemon) to udostępnienie programom klienckim
olbrzymich możliwości OpenOffice'a w zakresie konwersji i edycji plików w różnych formatach poprzez prosty
w użyciu i stabilny interfejs. Oood potrafi dokonywać konwersji dokumentów pomiędzy wszystkimi formatami
obsługiwanymi przez OpenOffice'a najczęściej potrzebna jest konwersja między formatami MSOffice a ODF,
ale oood może także generować pdf-y, zamienić dokument tekstowy na docbook, arkusz kalkulacyjny
na csv, a prezentację na zestaw stron www albo animację we Flashu. Jest w stanie także odczytać zapisane
w dokumencie metadane, a także te metadane w dokumencie zmienić.
rogram powstał pierwotnie na potrzeby systemu jedno po drugim. W przypadku wystąpienia problemów
zarządzania dokumentami ERP5-DMS, ale je- z otwarciem nadesłanego pliku lub ogólnych problemów
go możliwe zastosowania są znacznie szersze. z funkcjonowaniem serwera informuje on klientów o wy-
POood jest rozpowszechniany na licencji GPL, stąpieniu takiej sytuacji i podejmuje działania naprawcze,
a jego kod zródłowy jest dostępny w publicznym repozy- nie przerywając przy tym obsługi nadchodzących żądań.
torium systemu ERP5. Do komunikacji z klientami oood wykorzystuje spe-
cjalny protokół, nieco podobny do protokołu HTTP każ-
Architektura da odpowiedz wysłana klientowi składa się z kodu, komu-
Oood jest w zasadzie serwerem XMLRPC napisanym w ję- nikatu i danych żądanych przez klienta.
zyku Python na bazie standardowego modułu Simple- Taka architektura zapewnia stabilność systemu te-
XMLRPCServer. Aplikacje klienckie napisane w Pythonie sty wykazały, że oood uruchomiony na zwykłym lapto-
mogą skorzystać z dostarczanej przez oood biblioteki pie jest w stanie obsłużyć 100 żądań konwersji pliku wy-
oood_common i standardowego modułu xmlrpclib. Rzecz ja- słanych jednocześnie wszystkie żądania zostały prawi-
sna korzystać z usług serwera mogą także aplikacje napi- dłowo obsłużone. W ramach innego testu oood pracując
sane w dowolnym innym języku. Serwer oood uruchamia bez przerwy przez trzy i pół dnia, skonwertował 100 000
jedną instancję OpenOffice'a, z którą następnie komunikuje plików.
się poprzez gniazdo (socket). Instancja ta korzysta ze swoje-
go katalogu domowego, ma więc swoją własną konfigura- Instalacja i uruchomienie
cję. Instancja jest kontrolowana przez serwer, który w razie Program można pobrać z publicznego repozytorium svn
potrzeby może ją zrestartować. (pakiety RPM są w przygotowaniu). Do poprawnego
Serwer działa wielowątkowo, jest więc w stanie przy- działania wymaga Pythona 2.4 i OpenOffice'a 2.0 bądz
jąć jednocześnie wiele żądań, skolejkować je i obsłużyć 2.1 lub Pythona 2.5 i OpenOffice'a 2.2. Opcje konfigura-
36 sierpień 2007
linux@software.com.pl
rozwiązania
Demon konwersji
Listing 1. Python Listing 2. Java
sp=xmlrpclib.ServerProxy('http: import java.util.*; import org.apache.xmlrpc.client.*;
//localhost:8008') import org.apache.ws.commons.util.*; import java.net.URL;
data = open('doc/test.doc').read() byte[] inData = // zawartość pliku wejściowego
encdata = base64.encodestring(data) String encData = Base64.encode(inData);
response = sp.generate({'data': XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
encdata, 'extension': 'pdf'}) config.setServerURL(new URL(server_url));
if response[0] == 200: XmlRpcClient client = new XmlRpcClient();
decdata = base64.decodestring(respo client.setConfig(config);
nse[1]['data']) HashMap params = new HashMap(); params.put("extension","pdf");
open('test.pdf', params.put("data",encData); Vector paramVector = new Vector(1);
'w').write(decdata) paramVector.add(params);
else: Object[] result = (Object[])client.execute("generate", paramVector);
print 'nie udalo sie: ', int resultCode = ((Integer)result[0]).intValue();
response[2] if (resultCode == 200){
encData = (String)((Map)result[1]).get("data");
byte[] outData = Base64.decode(encData);
cyjne znajdują się w pliku oood.conf. Kon-
// outData zawiera przekonwertowany plik
figuracja programu jest dość prosta, wystar-
}else{
czy ustawić ścieżkę do programu i do miej-
System.out.println("nie udalo sie "+(String)result[2]);
sca, gdzie znajdują się pliki wykonywalne
}
OpenOffice'a, port, na którym ma nasłuchi-
wać oood i nazwę lokalnej drukarki. Oczy-
Listing 3. PHP
wiście użytkownik, który będzie uruchamiał
oood, musi mieć prawo do zapisu do po-
include 'xmlrpc.inc'; // https://sourceforge.net/projects/phpxmlrpc/
danych ścieżek. Przy starcie oood Open-
function getDataItem($response, $item){
Office zostanie uruchomiony w tle, natomiast
return $response['data']->structMem($item)->scalarval();
za pierwszym razem należy uruchomić in-
}
stancję OpenOffice na wierzchu poleceniem:
function analyzeResponse($res){
./start.py top.
$val = $res->value();
Następnie przejść przez procedurę reje-
$list = $val->scalarval();
stracji, a potem w uruchomionym już Open-
$status_code = $list[0]->scalarval();
Office'ie ustawić ścieżkę do miejsca, gdzie za-
$data = $list[1];
instalowany jest Java Runtime Environment. To
$msg = $list[2]->scalarval();
ostatnie znakomicie przyspiesza uruchamia-
return array('code'=>$status_code, 'data'=>$data, 'message'=>$msg);
nie OpenOffice'a, można więc śmiało zmniej-
}
szyć zmienną instance_load_time do 10 sekund,
function makeRequest($method, $params){
oood będzie działał znacznie prędzej.
$newparams = array();
Samego demona uruchamia się polece-
foreach($params as $k=>$v){
niem: ./runserw.py start.
if($k == 'data'){ $v = base64_encode($v);
Kiedyjuż zacznie działać,można podglądać,
}
co dzieje się w środku poleceniami: ./start.
$newparams[$k] = new xmlrpcval($v, 'string');
py status i ./start.py threads.
}
$newparams = new xmlrpcval($newparams, 'struct');
Sposób użycia
return new xmlrpcmsg($method, array($newparams));
Oood nie ma interfejsu użytkownika jest
}
przeznaczony wyłącznie do użytku przez ap-
$filedata = // dane wejsciowe
likacje klienckie. Mogą one korzystać z pu-
$params = array('data'=>$filedata, 'extension'=>'pdf');
blicznych metod serwera. Jako argument
$msg = makeRequest('generate', $params);
funkcji klient powinien przekazać słownik
$client = new xmlrpc_client ('http://192.168.20.192:8008');
zawierający odpowiednie parametry oraz
$res = $client->send($msg);
dane zakodowane przez base64. Rezultatem
$response = analyzeResponse($res);
wywołania zdalnej metody jest lista zawie-
if($response['code'] == 200){
rająca trzy elementy:
$data = getDataItem($response, 'data'); // zawartosc pliku po skonwertowaniu
}else{
" kod (status)
echo 'Failed with code '.$response['code'].', message
" słownik z danymi zwróconymi przez
"'.$response['message'];
serwer
}
" komunikat odpowiadający statusowi.
www.lpmagazine.org 37
rozwiązania
Demon konwersji
Kody protokołu oood
Listing 4. C++
200: 'OK',
#include "XmlRpc.h" // xmlrpc++ library ver.0.7 -
401: 'requested method is not provided',
http://xmlrpcpp.sourceforge.net/
402: 'the document could not be processed',
#include "Base64.h" // Base64 class from C++ Sockets Library -
403: 'timeout while processing document',
http://www.alhem.net/Sockets/index.html
404: 'malformed request',
#include
501: 'the server is restarting',
using namespace XmlRpc;
502: 'pool is empty, the server will be restarted',
using namespace std;
503: 'the server is out of sync and will
int main(int argc, char* argv[]) {
be restarted',
FILE* infile = fopen("test2.odt","r");
504: 'unknown error'
std::string data;
Base64 tmp_base;
getAllowed- lista formatów, na które
tmp_base.encode(infile, data, false);
TargetItemList może być skonwertowany
XmlRpcClient client("localhost", 8008);
dany dokument; parame-
XmlRpcValue result;
trem może być typ dokumentu
XmlRpcValue Args;
(text, spreadsheet),
Args["data"] = data.c_str();
rozszerzenie
Args["extension"] = "pdf";
(doc, txt) lub mimetype
client.execute("generate", Args, result);
(np application/msword)
std::cout << "Oood result code: " << result[0] << std::endl;
generate konwersja dokumentu
std::string dec_data;
na wybrany format
tmp_base.decode(result[1]["data"], dec_data);
getmetadata pobranie metadanych
FILE* outfile = fopen("test.pdf","wb");
dokumentu
const char* outbuf = dec_data.c_str();
fwrite(outbuf, sizeof(dec_data[0]), dec_data.size()-1, outfile);
setmetadata edycja metadanych dokumentu
fclose(outfile);
printDocument wydruk dokumentu na lokalnej
return 0;
drukarce serwera
}
otwiera i samoczynnie drukuje wszyst-
Poniżej zamieszczone są przykładowe kody " generowanie raportów w systemie ERP5 kie załączone do maila dokumenty,
klienta oood w różnych językach programo- system ERP5 ma wbudowaną możli- wykorzystując do tego celu możliwości
wania; są to tylko najważniejsze fragmenty wość generowania raportów w forma- oood. Powstał na potrzeby firmy otrzy-
kodu kompletne przykłady można znalezć tach ODF na podstawie szablonów xml- mującej drogą mailową znaczne ilości
w repozytorium svn. owych; dzięki współpracy z oood rapor- zamówień, które muszą być wydruko-
ty mogą być na żądanie użytkownika wane.
Python generowane także w formacie MS Offi-
Przykładowy skrypt klienta w Pythonie mo- ce, html czy pdf. W przygotowaniu
że wyglądać następująco: import xmlrpclib, " system zarządzania dokumentami multi-oood
base64. Ułatwieniem jest moduł oood_com- w systemie ERP5-DMS każdy dokument Niedługo powinien ujrzeć światło dzienne
mon zawierający klasy Request i Response, w jakimkolwiek formacie biurowym multi-oood serwer pośredniczący, któ-
które m. in. sprawdzają poprawność argu- jest natychmiast po jego umieszczeniu ry umożliwi jednoczesne korzystanie z wielu
mentów i kodują/dekodują dane. Oto ten sam w systemie konwertowany przez oood uruchomionych jednocześnie instancji oood.
skrypt wykorzystujący moduł oood_common. na trzy formaty: Znacznie usprawni to jego działanie w przy-
plain text co umożliwia jego indek- padku korzystania z oood przez wielu użyt-
Zastosowania sowanie przez systemową wyszuki- kowników jednocześnie.
Oood doczekał się już paru praktycznych za- warkę,
stosowań również w środowiskach produk- html dzięki czemu możliwy jest pod-
cyjnych: gląd treści dokumentu w przeglądarce
bez konieczności jego pobierania,
W Sieci
ODF w tym formacie dokument
" Strona domowa oood:
jest składowany w systemie.
O autorze
http://wiki.erp5.org/
Użytkownik, który chce pobrać doku-
Bartłomiej Górny jest prezesem i udzia-
HowToUseOood
ment z systemu może wybrać format, ja-
łowcem ERP5 Polska sp. z o.o. - firmy zaj-
" Repozytorium svn:
ki mu najbardziej odpowiada ODF, MS
mującej się rozwojem i wdrażaniem aplika-
http://svn.erp5.org/repos/
czy jakikolwiek inny (obecnie oood ob-
cji na bazie systemu ERP5 (platformy biz-
public/erp5/trunk/utils/oood
sługuje 111 formatów).
nesowej dostępnej na licencji GPL).
" Lista dyskusyjna:
" mail2print jest to dedykowany serwer
Kontakt z autorem: bartek@erp5.pl
erp5-dev@erp5.org
pocztowy, który każdy odebrany e-mail
38 sierpień 2007
Wyszukiwarka
Podobne podstrony:
2007 10 Kivio [Open Office]
2007 08 Podstawy zabezpieczenia serwerów [Bezpieczenstwo]
egzamin 2007 08 rozw
K2 2007 08 zad 2
2 Omowienie pakietu MS Office i Open Office Ogolne wlasciwosci?ytora tekstu
Egzamin 2007 08
08 Stanowisko do spawania metodą TIGidr84
08 Droga do Isengardu
2007 08 Common Colors Creating Icc Color Profiles with Argyll Cms
2007 08 UML – modelowanie statycznych aspektów oprogramowania [Inzynieria Oprogramowania]
poprawkowy 2007 08
więcej podobnych podstron