以下の記載は、OpenOffice.org1.1.5, 2.0.0を前提にしています。
#contents
[参考URL]
-[[UNO - Java Language Binding>http://api.openoffice.org/docs/DevelopersGuide/ProfUNO/ProfUNO.htm#1+4+1+Java+Language+Binding]]
-[[Javaを利用してドキュメントをプログラムから操作する>http://ja.openoffice.org/documents/tips/java_sample.html]]
-[[Open Office XML、ISO標準として採用の可能性>http://www.itmedia.co.jp/enterprise/articles/0409/29/news011.html]]
#br
** Windowsで常駐させる(listenモードで起動する) [#lf2a482f]
JavaなどのプログラムからOpenOffice.orgのAPIをremote invokeするには、OpenOffice.orgをlistenモードで起動しておく必要があります。(1)コマンドラインで起動する方法と (2)設定ファイルの記述を変更し、常時起動しておく方法の2つがあります。後者の設定は以下に。
-設定ファイルの変更方法
$OFFICE_PATH/share/registry/schema/org/openoffice/Setup.xcs ファイルの一部を以下のように変更します。
<prop oor:name="ooSetupConnectionURL” oor:type="xs:string">
<value>socket,port=8100;urp;</value>
</prop>
※ 変更部分はvalueタグだけ。ポート番号は任意。
OpenOffice.orgを再起動したりすると、指定したポートがlisten状態になります。
参照:[[OOo api:http://api.openoffice.org/docs/DevelopersGuide/FirstSteps/FirstSteps.htm#1+3+3+3+Make+the+office+listen]]
Windowsで簡単にOOoを常駐させるには、ログイン時のスタートアップで起動される「quickstart.exe」でよいかも知れませんが、そうすると利用中はログオフできなくなります。(^^;; できるなら、Windowsサービスとして、
{OOo Install Path}/program/soffice -headless "-accept=socket,port=8100;urp;StarOffice.ServiceManager"
あたりのコマンドを登録するのがよいのかな?(動作未確認)
参照:[[OOoで利用可能なcmdline引数:http://oooug.jp/mirror/documents/tips/options.html]]
[[OpenOffice related MLs:http://search.luky.org/oo/oootr.2003/msg00350.html]]
** Linuxで常駐させる。 [#gafbd088]
LinuxでOOoを常駐させる時の注意点は、「X Window Systemが動作していないと、OOoは起動しない」ということです。なので、単純に /etc/init.d に登録してもエラーになっちゃいますね。どういう形で起動・常駐させるのがよいのでしょうかね?
とりあえず、XサーバとしてXfvbを使いました。日本語フォント等も問題ありませんね。
[[OpenOffice起動用rc script>Linux/rc script#x5caa717]]
** JavaからPDF出力用ツールとして使う [#b4242b92]
OpenOffice.orgをlistenモードで起動しておけば、例えば、Javaのプログラムで、Excel文書を読み込んでPDFファイル出力するなんてことが、簡単にできるようになりますね。
[[JAVA PRESS Vol.36の特集2:http://www.gihyo.co.jp/magazines/javapress/support/Vol36]]にあるように、簡単なプログラムからOOoを呼び出すことができますが、現状では、[[JooConverter:http://jooreports.sourceforge.net/]]を利用するのがベターかと思われます。例えば、以下のように…
呼び出し例
File excelFile = new File("sample.xls");
File pdfFile = new File("sample.pdf");
OOoContext context = OOoContext.getContext();
DocumentConverter converter = context.getDocumentConverter();
// PDFに変換してファイル保存する。
converter.convert(excelFile, pdfFile);
&ref(OOoContext.java);
public class OOoContext {
private static final OOoContext context = new OOoContext();
private OpenOfficeConnection connection;
private DocumentConverter converter;
public OOoContext() {
connection = new SocketOpenOfficeConnection(8100);
try {
connection.connect();
} catch (ConnectException exception) {
throw new RuntimeException("start OpenOffice.org on port 8100", exception);
}
converter = new OpenOfficeDocumentConverter(connection);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
connection.disconnect();
}
});
}
(以下、省略)
}
なお、上記のやり方では、何らかの理由でコネクションが切れちゃった場合の再接続の仕組み等はサポートされていないようです。[[いがぴょんさん:http://hp.vector.co.jp/authors/VA027994/joo/jooconverter.html]]によると、''OpenOffice.orgを常駐させっぱなしにすると、どうしても動作が不安定になりがち''ということなので、同ページにて対策法を提示されています。(そのうち[[blancoReport:http://hp.vector.co.jp/authors/VA027994/blanco/blancoreport.html]]が最適解になるのかな?)
また、OOoのPDF出力は、ファイル出力に限定されます。Webシステムにおいて、HTTPレスポンスでPDFを出力したい場合にはストリーム出力がうれしいわけですが、直接ストリームにはできず、サーバPCに一旦保存したPDFファイルを送信することになる、ということです。不要になったPDFファイルを削除する処理も必要になるでしょう。
*** グラフ [#pe06f45a]
** グラフ [#pe06f45a]
Excelでサポートされていても、Calcでサポートされていないグラフは出力できません。折れ線と棒の混合グラフなどは、折れ線だけのグラフになってしまいます。
また、Excel側で設定されている軸タイトルのフォントなども、Calc側では英字用のフォントに反映されてしまい、日本語用フォントには反映されません。その結果、フォントが変わるだけでなく、凡例などのグラフレイアウトが大きく崩れてしまう原因にもなります。
*** 実行速度 [#q45792cb]
** 実行速度 [#q45792cb]
Excelブックにグラフがある場合には、ファイル読み込みやグラフ計算で数秒程度かかります。Webシステムの場合は、数秒変わらない画面をユーザが待ってくれるか、が問題になります。また、PDF出力のトランザクションがひどく多いケースでは更に問題になるかもしれません。