試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

LibreOfficeをBoo言語で制御する(概要,必要なパッケージ,大まかな流れ,コンパイル)

LibreOffice(やOpenOffice.org)では、内部の機能を色々な言語で制御できるようになっているが、Mono/.NETの言語(C#やBoo言語など)を用いて制御を行うこともできる。
ここでは、Boo言語(関連記事)を用いてLibreOffice(やOpenOffice.org)の簡単な制御を行うための部分についてを扱う。

必要なパッケージ

GNU/LinuxにおいてLibreOffice(やOpenOffice.org)でMono/.NETによる制御を行うには、追加のパッケージをインストールする必要がある場合が多い。Debian/Ubuntuでは「cli-uno-bridge」パッケージを追加でインストールする。
また、Boo言語を用いる関係で、「boo」のパッケージもインストールする必要がある。C#言語を用いるのであればこれは不要だが、ここではC#言語を用いた方法は扱わない。ただ、C#言語もBoo言語も動作環境はほとんど同じ(Booでは追加のライブラリが必要となるという違いのみ)で、言語仕様以外の部分においては共通しているところも多く、LibreOffice(やOpenOffice.org)を制御するという部分についてはほとんど同じ要領となる。

プログラムの大まかな流れ

プログラムでは、uno.util.Bootstrap.bootstrap()からの一連の処理によって外部からLibreOfficeOpenOffice.orgを起動し、これを制御できるように接続を自動的に行う(プログラムの記述の中で接続やその制御を意識することはない)。その後unoidl.com.sun.star.frame.XComponentLoader型のloadComponentFromURL()によって任意のファイルを開くかもしくは新規の(ワープロ)文書や表計算などのドキュメントを作成し、これを開いてから、以前Pythonのマクロに関してを扱ったときのようにドキュメントの内容を編集するという流れになる(その後、必要であればファイルへの保存も可)。
プログラム例を含め、詳しくは「自由テーマ」のメールマガジン内で数回扱う予定。

コンパイル時のオプション指定とUbuntu 11.04での修正

プログラムのコンパイルの際にはMono/.NETによる制御のためのLibreOfficeOpenOffice.orgのMono/.NETアセンブリ群に対してリンクを行う必要がある。この際のオプション指定については、通常は「pkg-config --libs mono-libreoffice」(LibreOfficeの場合)「pkg-config --libs mono-openoffice」(OpenOffice.orgの場合)を実行することにより得られるのだが、Debian/Ubuntuではファイルの独特な配置の関係でうまくライブラリのアセンブリ(.dllファイル)が見つけられずにエラーが発生する場合があり、Ubuntu 11.04の時点では

$ booc -nologo [ソースファイル].boo $(pkg-config --libs mono-libreoffice) -out:[出力ファイル].exe
Fatal error: Cannot find assembly: '/usr/lib/mono/libreoffice/cli_basetypes.dll'.

となる。
pkg-configの出力を確認すると

$ pkg-config --libs mono-libreoffice
-r:/usr/lib/mono/libreoffice/cli_basetypes.dll -r:/usr/lib/mono/libreoffice/cli_cppuhelper.dll -r:/usr/lib/mono/libreoffice/cli_uretypes.dll -r:/usr/lib/mono/libreoffice/cli_oootypes.dll -r:/usr/lib/mono/libreoffice/cli_uno_bridge.dll -r:/usr/lib/mono/libreoffice/cli_ure.dll

で、実際のファイルの配置場所を見ると

(パッケージ「cli-uno-bridge」のファイルの場所を確認)
$ dpkg-query --listfiles cli-uno-bridge | egrep "dll$"
/usr/lib/ure/lib/cli_uno_bridge.dll
(依存パッケージの1つの中のファイルの場所を確認)
$ dpkg-query --listfiles libuno-cli-basetypes1.0-cil | egrep "/cli_.+dll$"
/usr/lib/cli/uno-1.0/cli_basetypes.dll
(同様のファイルが同じディレクトリにあるかを確認)
$ ls /usr/lib/cli/uno-1.0/cli_*.dll
/usr/lib/cli/uno-1.0/cli_basetypes.dll   /usr/lib/cli/uno-1.0/cli_ure.dll
/usr/lib/cli/uno-1.0/cli_cppuhelper.dll  /usr/lib/cli/uno-1.0/cli_uretypes.dll
/usr/lib/cli/uno-1.0/cli_oootypes.dll

となり、cli_uno_bridge.dllだけが/usr/lib/ure/lib/,他のファイルが/usr/lib/cli/uno-1.0/以下に入っていることが確認できたので

$ booc -nologo [ソースファイル].boo $(pkg-config --libs mono-libreoffice | sed -e "s:\(/usr/lib/\)mono/libreoffice\(/cli_uno_bridge.dll\):\1ure/lib\2:" -e "s:mono/libreoffice:cli/uno-1.0:g") -out:[出力ファイル].exe

などのようにしてコンパイルするか、管理者権限で下のように.pcファイルの中のアセンブリの場所を正しいものに修正することとなった。

--- /usr/lib/pkgconfig/mono-libreoffice.pc.orig
+++ /usr/lib/pkgconfig/mono-libreoffice.pc
@@ -1,4 +1,4 @@
 Name: OOo Mono
 Description: OpenOffice.org bindings for Mono
 Version: 1.0
-Libs: -r:/usr/lib/mono/libreoffice/cli_basetypes.dll -r:/usr/lib/mono/libreoffice/cli_cppuhelper.dll -r:/usr/lib/mono/libreoffice/cli_uretypes.dll -r:/usr/lib/mono/libreoffice/cli_oootypes.dll -r:/usr/lib/mono/libreoffice/cli_uno_bridge.dll -r:/usr/lib/mono/libreoffice/cli_ure.dll
+Libs: -r:/usr/lib/cli/uno-1.0/cli_basetypes.dll -r:/usr/lib/cli/uno-1.0/cli_cppuhelper.dll -r:/usr/lib/cli/uno-1.0/cli_uretypes.dll -r:/usr/lib/cli/uno-1.0/cli_oootypes.dll -r:/usr/lib/ure/lib/cli_uno_bridge.dll -r:/usr/lib/cli/uno-1.0/cli_ure.dll

なお、booiコマンドでは、コンパイル時の適切な指定が渡せない関係でうまく動かなかった。

関連記事:

まとめドキュメント:

使用したバージョン: