前の関連記事: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を呼び出します。
0 件のコメント:
コメントを投稿