Ubuntu WilyのシステムPython3でLibreOfficeをコントロール
LibreOffice Advent Calendar 2015 17日目というか、Facebookの書き込みを見て、あれ、Ubuntuの場合はシステムPythonでPyUno(PythonからLibreOfficeの外部インタフェースUNOを使えるようにしたバインディング)使えたんじゃなかったっけと思って試してみました、というだけの話。
私Pythonとか5行ぐらいしか書いたことないので(ややうそ)、勘違いとかあったら教えてください。
せっかくなので、ちょっとググっていたら見つかった、PyUNOをより簡単に使えるようにしたラッパーライブラリであるunotoolsを試してみます。
まずは必要そうなパッケージをaptでガツガツとインストール*1。すでに入ってるものもあるかもだけど気にしない。
$ sudo apt install libreoffice-script-provider-python python3 python3-uno
これでpython3からPyUNOが呼べることをまず確認します。
$ python3 Python 3.4.3+ (default, Oct 14 2015, 16:03:50) [GCC 5.2.1 20151010] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import uno >>>
問題なさげですね。
次にunotoolsですが、こいつはpipなライブラリなのでまずはpipを入れねばならんのです。apt searchするとpython3-pipというのがいるので、こいつだ!と思ったのですが、どうも罠っぽい。
あるべき姿がわからんのですが、調べるのもめんどくさいのでsetuptoolsを経由して入れてしまいます。virtualenvとか使う方がいいんだろうなーとか思いつつ。
$ sudo apt install python3-setuptools $ sudo eazy_install3 pip $ sudo pip install unotools
これで入ったっぽい。
ではunotools公式サイトの例題をやってみます。
最初にLibreOfficeをポート指定して起動。
soffice --accept='socket,host=localhost,port=8100;urp;StarOffice.Service'
それからpython3を起動し、パッケージをインポートしてコネクションを張り、Writerのインスタンスを起こす。
$ python3 Python 3.4.3+ (default, Oct 14 2015, 16:03:50) [GCC 5.2.1 20151010] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from unotools import Socket, connect >>> from unotools.component.writer import Writer >>> context = connect(Socket('localhost', 8100)) >>> writer = Writer(context)
で、起こしたWriterインスタンスに対して、「文字列を文章末に追加」する。
>>> writer.set_string_to_end('Hello\n') >>> writer.set_string_to_end('World\n')
はい、こんな感じでWriterにPythonから出力することができました。
例のための例で恐縮ですが、unotools良さそうですね。
なお、本家PyUNOも、次期リリースの5.1では「もっとPythonらしいインタフェース」になるというお話が今年のLibreOffice Conferenceでありました。興味がある方は是非発表資料(PDF)をご覧あれ。
明日は誰か書いてくれるかな?それでは!
*1:最近、可能な限りaptコマンドで生きようと思っております。