LibreOffice5(40)ツールバーやメニューに表示させるアイコン画像

ProtocolHandler Addon Javaについてくるアイコン画像はAddons.xcuファイルにバイト列の十六進数文字列で埋め込まれています。これをbmpに戻して、さらにpngのアイコンに変換します。

前の関連記事:LibreOffice5(39)ProtocolHandler Addon Javaのxcuファイルを出力するPythonスクリプト


bytetoimage.py:バイト列の十六進数文字列を画像に戻すPythonスクリプト


ByteToImage/bytetoimage.py at 5703e44f16db3d5f40b936e4fcd42379eabf6387 · p--q/ByteToImage

12行目の辞書dicに出力したいファイル名をキー、値にAddons.xcuの十六進数を入れて実行するとimagesフォルダにbmp画像が出力されます。

binasciiモジュールとimghdrモジュールを使っているのでLibreOfficeのバンドルPythonだけでは実行できません。

imagetobyte.py:画像をバイト列の十六進数文字列にするPythonスクリプト


ByteToImage/imagetobyte.py at 5703e44f16db3d5f40b936e4fcd42379eabf6387 · p--q/ByteToImage

bytetoimage.pyとは逆にimagesフォルダにある画像ファイルをバイト列の十六進数文字列として出力します。

これもbinasciiモジュールとimghdrモジュールを使っているのでLibreOfficeのバンドルPythonだけでは実行できません。

topng.py:画像をpng形式に変換する


ByteToImage/topng.py at 5e46c9a3f1b60b31eb4ee977399418c02116a7ce · p--q/ByteToImage

topng.pyはimagesフォルダにある画像ファイルをpng形式にしてOutputフォルダに出力します。

これはPILモジュールが必要なのでAnacondaのPythonインタープリターで実行しています。

bmptopng.py:LibreOfficeのAddons.xcu用のbmpファイルをpng形式に変換する


ByteToImage/bmptopng.py at 5703e44f16db3d5f40b936e4fcd42379eabf6387 · p--q/ByteToImage

ProtocolHandler Addon Javaについてくるアイコン画像は背景となる透明に相当する部位はマゼンダ色になっています。

bmptopng.pyはそのマゼンダ色を透過色にしてpngファイルに変換します。

これはimagemagickのconvertコマンドを使っているのでimagemagickのインストールが必要です(linuxBean14.04(73)matplotlibでアニメーションのグラフ参照)。

Addons.xcuのImageIdentifierのノードは削除


Images for Toolbars and Menus - Apache OpenOffice Wiki

Extensions/Addons - ...?

これらを読むとWriting UNO components examplesのProtocolHandler Addon JavaのAddons.xcuは時代遅れの仕様のようです。

ImageIdentifierを使うのは古い仕様のようですので、p--q/ProtocolHandlerAddonPythonでこのノードを削ってみましたが、動作に問題はありませんでした。

ProtocolHandlerAddonPython/Addons.xcu at faa53674e573bac0d8d8346bceb8c3c1606dcb48 · p--q/ProtocolHandlerAddonPython

Addons.xcuの%origin%にはoxtファイルまでのパスが代入される


Images for Toolbars and MenusExtensions/Addons - ...?で%origin%について書いてあることが違うように思えたのでメニュー項目に%origin%を入れてみました。


vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE/uno_packages/lu24835f2wwmb.tmp__/ProtocolHandlerAddonPython.oxt

これが%origin%に入っていました。

vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE以下のパスはLibreOffice5(8)oxtファイルをzip圧縮するときは最初の階層に注意で見たようにインストールされているoxtファイルが展開されているパスと同一です。

ということで%origin%はoxtファイル内の最上層の階層と同じパスになります。

どうしてImages for Toolbars and MenusExtensions/Addons - ...?で違うことが書いてあるように見えたのかはAddon toolbar icon (View topic) • Apache OpenOffice Community Forumの相談者のoxtをダウンロードしてみてわかりました。

単にNetBeansのOpenOffice拡張機能プラグインではAddons.xcuを深い階層にいれてあっただけのようです。

バイト列の十六進数文字列の代わりにpngファイルを使う


なぜか画像が表示されず四苦八苦しました。

原因はImageBigHCURLノードの値が空白なことでした。

valueノードの値が空白のImageBigHCURLノードを削除するとアイコンが表示されました。

ただハイコントラスト(HC)の画像が表示されてしまいます。

なのでHCの画像はもうAddons.xcuには含めないことにしました。

ProtocolHandlerAddonPython2/Addons.xcu at 26f410e22ce19a33bf65f561383fe3ff1d08e143 · p--q/ProtocolHandlerAddonPython2

このAddons.xcuでうまくいきました。

pngファイルをoxtファイル内のiconsフォルダに入れています。

ProtocolHandlerAddonPython2/step3createXCUs.py at 26f410e22ce19a33bf65f561383fe3ff1d08e143 · p--q/ProtocolHandlerAddonPython2

Addons.xcuを出力するPythonスクリプトです。

参考にしたサイト


Pythonのimghdrライブラリで画像の種類を判別する方法 | 遍歴プログラマ日記
標準ライブラリにあるimghdrの使用例。

Images for Toolbars and Menus - Apache OpenOffice Wiki
ツールバーやメニューに表示させるアイコンの設定方法。HCURLを指定すると表示されませんでした。

Extensions/AddonsMenu - ...?
既存のメニューに項目を挿入する方法も紹介されています。

Pillow(Python Imaging Library)のインストールと簡単なサンプルコード | mwSoft
anaconda3ではPILがすでに含まれていました。

PILでの色の変換は大変そうだったので結局imagematickを使うことにしました。

Imagemagickの使い方日本語マニュアル – 日本語のマニュアルが少ない画像加工ツールImageMagickの使い方を、初心者の方にも解りやすいよう詳しく丁寧に解説しています。
imagematickはSynapticパッケージマネージャでインストールしました。

png - Set transparent background using ImageMagick and commandline prompt - Stack Overflow
imagematickのconvertコマンドで特定の色を透明に変換する方法。

【備忘録】Pythonにおけるアンダースコア"_"の役割について - Qiita
タプルから受け取った使わない変数を_にするとPyDevでエラーと言われなくなりました。

次の関連記事:LibreOffice5(41)ツールバーのプロパティを設定するxcuファイル

PR

0 件のコメント:

コメントを投稿