LibreOffice5(46)マクロからウェブブラウザに文字列を出力する方法

2017-06-09

旧ブログ

t f B! P L
 LibreOffice(55)WSGIでブラウザに結果を出力するではうまくいかなかったマクロからウェブブラウザに結果を出力することをもう一度チャレンジします。

前の関連記事:LibreOffice5(45)拡張機能内で発生した例外の出力先


PyDevプロジェクトのソースをマイマクロフォルダに置く


Eclipseで開発するのでlinuxBean14.04(159)unohelper.ImplementationHelper()をデバッガにかけると同様にしてPyDevプロジェクトを作成しました。

ElicpseでFile→New→PyDev Project。

プロジェクト名はtoWebHmtlにしました。

インタープリターはLibreOfficeのバンドルPython(/opt/libreoffice5.2/program/python)にしました。

Create 'src' folder add it to the PYTHONPATHを選択してFinishしました。

このままではLibreOfficeからみてPYTHONPATHにないのでGitリポジトリにしてWorking Treeをマイマクロフォルダにします。

PyDev Package ExplorerでtoWebHmtlプロジェクトを右クリック→Team→Share Project。

Createボタンをクリックしてマイマクロフォルダ(~/.config/libreoffice/4/user/Scripts/python)内にtoWebHtmlフォルダを作成してその中に入ってOK→Finish。


Working treeがマイマクロフォルダ内になっていることがわかります。

Finish。

さらにGitHubにリモートリポジトリを作るのなら、Git(27)EclipseでローカルリポジトリをGitHubのリモートリポジトリにするまでの手順で行います。

GitHubのサイトでプロジェクトと同名のリポジトリを作成します。

Initialize this repository with a README をチェックしてGitHubリポジトリを作成するとリポジトリにREADMEファイルが作成されています。

Clone or downloadボタンをクリックして、GitHubリポジトリのURLをクリップボードにコピーしておきます。

Eclipseに戻ってGitパースペクティブのGit Repositoriesビューでローカルリポジトリを右クリック。

Pull...。

あとはGit(27)EclipseでローカルリポジトリをGitHubのリモートリポジトリにするまでの通りです。

これで開発環境の準備完了です。

LibreOfficeのディスパッチコマンド.uno:WebHtmlを使う方法


Writerのメニューをみるとファイル→Webブラウザーでプレビュー、を選択するとWriterのドキュメントの内容がデフォルトブラウザにHTMLで表示されます。
sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:WebHtml", "", 0, Array())


end sub
オプション→LibreOffice→詳細、で、マクロの記録を有効にする、にチェックをつけておいて、ツール→マクロ→マクロの記録、でこの動作を記録していみるとディスパッチコマンドの.uno:WebHtmlを使っていることがわかりました。

でもこのコマンドに関しては何も情報は入手できず、LibreOffice APIでもこのコマンドに該当するものが何かわかりませんでした。

とりあえずWriterのドキュメントをウェブブラウザには出力してくれるので、Writerドキュメントに書き込み→.uno:WebHtmlでウェブブラウザに出力、というマクロを作ってみます。
from com.sun.star.beans import PropertyValue 
def toWebHtml():
    desktop = XSCRIPTCONTEXT.getDesktop()  # デスクトップを取得。
    prop = PropertyValue(Name="Hidden",Value=True)  # バックグラウンドで開く設定。
    doc = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, (prop,))  # バックグラウンドでWriterのドキュメントを開く。
    doc.getText().setString("ウェブブラウザに出力する文字列")  # Writerドキュメントに文字列を出力。
    frame = doc.getCurrentController().getFrame() #Writerドキュメントのフレームの取得。
    ctx = XSCRIPTCONTEXT.getComponentContext() #コンポーネントコンテクストの取得。
    smgr = ctx.getServiceManager()  # サービスマネジャーの取得。
    dispatcher = smgr.createInstanceWithContext("com.sun.star.frame.DispatchHelper",ctx) #com.sun.star.frame.DispatchHelperのUNOインスタンスを取得。
    dispatcher.executeDispatch(frame, ".uno:WebHtml", "", 0, tuple())  # .uno;WebHtmlでデフォルトウェブブラウザに出力する。
    doc.close(True)  # バックグラウンドで開いたドキュメントを閉じる。
g_exportedScripts = toWebHtml,  # マクロセレクターに表示させる関数を制限。
これでデフォルトブラウザが起動して6行目でWriterのドキュメントに渡している文字列が出力されます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
 <title></title>
 <meta name="generator" content="LibreOffice 5.2.6.2 (Linux)"/>
 <meta name="created" content="00:00:00"/>
 <meta name="changed" content="2017-06-08T20:28:26.482911299"/>
 <style type="text/css">
  @page { margin: 2cm }
  p { margin-bottom: 0.25cm; line-height: 120% }
 </style>
</head>
<body lang="ja-JP" dir="ltr">
<p style="margin-bottom: 0cm; line-height: 100%">ウェブブラウザに出力する文字列</p>
</body>
</html>
htmlはこのようになっています。

linuxBeanではURLはfile:///tmp/lu7373obuq36.tmp/lu7373obuq3p.tmp/webpreview.htm、Windows10ではfile:///C:/Users/pq/AppData/Local/Temp/lu6180znov8a.tmp/lu6180znov8c.tmp/webpreview.htmになっていました。

いずれもテンポラリファイルを作成してそれをブラウザで開いています。

print()の置換など単純に文字列を出力するだけならこの方法で十分に使えそうです。

ブラウザに出力する文字列を修飾したいときはWriterのドキュメントを編集しないといけないので、マクロからの操作は面倒です。

HTMLをデフォルトブラウザに出力する拡張機能を利用する


マクロからWSGIサーバを起動する方法はどう頑張っても解決できませんでした。

でも拡張機能の中からは問題なくWSGIサーバを起動できたので、単純に引数のHTMLをデフォルトブラウザに出力するメソッドをもつサービスの拡張機能を作成しました。

p--q/toWebHtml

toWebHtml.oxtをインストールするとサービスcom.blogspot.pq.ToWebHtmlがインスタンス化できるようになります。

execution_example.pyが使用例です。
    page = smgr.createInstanceWithContext("pq.ToWebHtml", ctx)
    page.setTitle("From toWebHtml Extension")
    page.openInBrowser("<span style='background-color: red;'>toWebHTML拡張機能から出力</span>")
4行目では実装サービス名pq.ToWebHtmlでインスタンス化しています。

setTitle()でページタイトルを設定しています。

openInBrowser()の引数に入れたものがWebページのbodyに入れられてデフォルトブラウザに出力されます。

WSGIサーバーはページを出力したら終了するので同じページには1回しかアクセスできません。

マクロから拡張機能toWebHtmlを呼び出すにはマクロセレクターからexecution_example.pyのmacroを呼び出します。

次の関連記事:LibreOffice5(47)拡張機能のソースをオートメーションでも実行する

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ