おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

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というのがいるので、こいつだ!と思ったのですが、どうも罠っぽい。

qiita.com

あるべき姿がわからんのですが、調べるのもめんどくさいので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から出力することができました。

f:id:naruoga:20151216210529p:plain

例のための例で恐縮ですが、unotools良さそうですね。

なお、本家PyUNOも、次期リリースの5.1では「もっとPythonらしいインタフェース」になるというお話が今年のLibreOffice Conferenceでありました。興味がある方は是非発表資料(PDF)をご覧あれ。

明日は誰か書いてくれるかな?それでは!

*1:最近、可能な限りaptコマンドで生きようと思っております。