JODConverter

JODConverter Online Guideを参考にJODConverterを使ってみました。最終的にはWebアプリケーションの内部でPDFへの変換する機能を使うことを目標にしています。

OpenOfficeのインストール

http://ja.openoffice.org/download/ からOpenOfficeをダウンロードしてインストールします。今回はバージョン3.0.1のWindows用(JRE無し)を使用しました。インストール先は"C:\Program Files\OpenOffice.org 3"とします。

OpenOfficeの起動

その前に、OpenOfficeをサービスとして起動しておく必要があります(参考)。ここでいうサービスというのは常駐しているという意味でWindowsのサービスではないです。Webアプリケーションから利用する場合には、Windowsのサービスとして起動しておく必要がありますが、その方法はまた別途。
コマンドプロンプトから以下のコマンドを実行します。

"C:\Program Files\OpenOffice.org 3\program\soffice.exe"  -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

これでローカルからのみポート8100で接続できるようになります。

終了する方法はよく分からなかったのですが、タスクマネージャからsoffice.binというプロセスを止めました。soffice.exeを実行していますが、本体はsoffice.binのようです。

コマンドラインから使う

まずはコマンドラインからJODConverterを使ってみます(参考)。
こちらからJODConverterをダウンロードして展開します。コマンドラインから展開したフォルダに移動して、以下のコマンドを実行します。

java -jar lib\jodconverter-cli-2.2.1.jar input.xls output.pdf

input.xlsで入力のExcelファイルを指定し、output.pdfが出力先のファイルを指定しています。出力先の拡張子によって対応しているフォーマットであれば変換されます(サポートされるフォーマット)。

java -jar lib\jodconverter-cli-2.2.1.jar input.xls output.ppt
...
情報: disconnected
Exception in thread "main" java.lang.IllegalArgumentException: unsupported conversion: from Microsoft Excel to Microsoft PowerPoint
...

サポートされない変換(xls -> ppt)だと例外が発生します。

OpenOfficeをWindowsのサービスとして開始する

OpenOffice(soffice.exe)をWindowsのサービスとして登録するには、Windows Server 2003リソースキットに含まれるSRVANYを使用します*1

こちらを参考にサービスを登録してみます。

まず、Windows Server 2003 Resource Kit Toolsをダウンロードしてインストールします。

コマンドプロンプトからinstsrvコマンドを実行し、サービスを登録します。

C:\>"C:\Program Files\Windows Resource Kits\Tools\instsrv.exe" OpenOffice "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

The service was successfuly added!

Make sure that you go into the Control Panel and use
the Services applet to change the Account Name and
Password that this newly installed service will use
for its Security Context.

1番目の引数のOpenOfficeというのがサービス名です。好きにつけます。2番目の引数はサービスのプログラムですが、ここではsoffice.exeを指定するのではなくsrvany.exeを指定します。

次に実際にsrvany.exeがサービスとして実行するプログラム(soffice.exe)を指定します。regeditを起動すると登録したサービス名(ここではOpenOffice)に対応するキーが存在すると思います。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OpenOffice

キーOpenOfficeの下に"Parameters"という名前のキーを作成します。さらにそのキーに以下の文字列型の値を追加します。

  • Application : C:\Program Files\OpenOffice.org 3\program\soffice.exe
  • AppParameters : -headless -accept=socket,port=8100;urp;

こんな感じになります。


これで管理ツールのサービスにOpenOfficeが登録されます。
JODConverterのドキュメントではサービスのログオンアカウントをLocal Serviceに変更するとありますが、私の環境ではサービスは開始されているようですがJODConverterをコマンドプロンプトから実行すると例外が発生してしまったので、ローカルシステムアカウントを使っています。

次に、サービスのログオンアカウントでOpenOfficeを起動した際にライセンス確認等のダイアログが表示されるのを抑制するために、C:\Program Files\OpenOffice.org 3\share\registry\data\org\openofficeフォルダにSetup.xcuというファイルを以下の内容で作成します(これは、soffice.exeの引数で"-nofirstwizard"を指定すればよいかと思い試したのですがうまくいきませんでした)。

<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Setup" oor:package="org.openoffice">
 <node oor:name="Office">
  <prop oor:name="ooSetupInstCompleted" oor:type="xs:boolean">
   <value>true</value>
  </prop>
  <prop oor:name="LicenseAcceptDate" oor:type="xs:string">
   <value>2006-07-25T17:34:04</value>
  </prop>
  <prop oor:name="FirstStartWizardCompleted" oor:type="xs:boolean">
   <value>true</value>
  </prop>
 </node>
</oor:component-data>

サービスを開始して、コマンドプロンプトから、"netstat -anp tcp"を実行して、OpenOfficeが8100ポートをリッスンしていることを確認します。

C:\>netstat -anp tcp
...
  TCP    127.0.0.1:8100         0.0.0.0:0              LISTENING
...

以上で、OpenOfficeがサービスとして起動するようになりました。

*1:[http://www.nanshiki.co.jp/software/index.html:title=sexe]でも動きました。こちらの方が簡単です。