LibreOffice5(113)埋め込みマクロフォルダを読み書きする方法:まとめ

2017-12-17

旧ブログ

t f B! P L
埋め込みマクロフォルダを読み書きする方法を整理しておきます。このページの情報を元にCalc(47)埋め込みマクロのためのPyDevプロジェクトを作成しました。

前の関連記事:LibreOffice5(112)埋め込みマクロフォルダを書き込むスクリプト


埋め込みマクロフォルダを取り出す方法一覧


開いているドキュメントから取り出す方法

3通りあります。

1-1
SimpleFileAccessのcopy()で、vnd.sun.star.tdocからfile://へフォルダをコピー。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「LibreOfficeで開いているドキュメントから埋め込みマクロフォルダを取り出すスクリプト」)

1-2
ドキュメントストレージの各インプットストリームを取得して、SimpleFileAccessのwriteFile()でfile://へ書き込む。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「ストレージを取得して埋め込みマクロフォルダを取り出すスクリプト」)

1-3
ドキュメントのストレージの各インプットストリームを取得して、ファイルシステムストレージの各アウトプットストリームに書き込む。
(LibreOffice5(108)ドキュメントストレージからファイルシステムストレージにデータをコピーするの「ストリームでストレージからストレージにコピーする」)

開いていないドキュメントから取り出す方法

8通りもありました。

2-1はコピーできない場合がありました。

2-1
SimpleFileAccessのcopy()で、vnd.sun.star.pkgからfile://へフォルダをコピー。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「LibreOfficeで開いているドキュメントから埋め込みマクロフォルダを取り出すスクリプト」LibreOffice5(109)子要素にフォルダしか持たないドキュメント内フォルダの制約あり)

2-2
ドキュメントストレージの各インプットストリームを取得して、SimpleFileAccessのwriteFile()でそれぞれfile://へ書き込む。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「ストレージを取得して埋め込みマクロフォルダを取り出すスクリプト」)

2-3
ドキュメントストレージの各インプットストリームを取得して、ファイルシステムストレージの各アウトプットストリームに書き込む。
(LibreOffice5(108)ドキュメントストレージからファイルシステムストレージにデータをコピーするの「ストリームでストレージからストレージにコピーする」)

2-4
ドキュメントをzipファイルとして指定のフォルダを解凍する。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「ドキュメントを単なるzipファイルとして扱って埋め込みマクロフォルダを取り出すスクリプト」)

2-5
ドキュメントのパッケージの各インプットストリームを取得して、SimpleFileAccessのwriteFile()でそれぞれfile://へ書き込む。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「パッケージを取得して埋め込みマクロフォルダを取り出すスクリプト」)

2-6
ドキュメントのパッケージの各インプットストリームを取得して、ファイルシステムストレージの各アウトプットストリームに書き込む(未確認)。

2-7
ZipFileAccessで各インプットストリームを取得して、SimpleFileAccessのwriteFile()でfile://へ書き込む。
(LibreOffice5(105)埋め込みマクロフォルダを取り出すスクリプト「ZipFileAccessを取得して埋め込みマクロフォルダを取り出すスクリプト」)

2-8
ZipFileAccessで各インプットストリームを取得して、ファイルシステムストレージの各アウトプットストリームに書き込む(未確認)。

このほかストリームをファイルに書き出す方法としてはPythonのバイトシークエンスを使う方法もあります。
(LibreOffice5(111)インプットストリームのバイトシークエンスをファイルに書き込む)

埋め込みマクロフォルダを書き込む方法


ドキュメントにマクロフォルダを書き込むときは、取り出すときと違ってmanifest.xmlを編集しないといけないことを考慮しないといけません。

manifext.xmlも勝手に編集してくれる方法だけを考えます。

まだすべて未確認です。

開いているドキュメントに書き込む方法

読み込むときと同様に3通りありますが、これらはLibreOffice5(101)埋め込みマクロの更新とマクロセレクターとAPSOと同様の制約が付きまといます。

3-1
SimpleFileAccessのcopy()で、file://からvnd.sun.star.tdocへフォルダをコピー。(LibreOffice5(112)埋め込みマクロフォルダを書き込むスクリプト)

この他、書き込むソースのストリームを取得してSimpleFileAccessのwriteFile()でvnd.sun.star.tdocへ書き込む方法が考えられます。

開いていないドキュメントに書き込む方法

4-1
書き込むソースのストリームを取得してドキュメントのパッケージに書き込む。
(LibreOffice5(112)埋め込みマクロフォルダを書き込むスクリプト)

この方法は3-1の方法と違うmanifest.xmlになっていましたが、書き込んだマクロはうまく動きました。
(2017.12.20追記。Scripts/pythonフォルダがmanifest.xmlに登録されないこの方法には大きな問題があることがわかりました。ドキュメントを編集して保存するときにmanifext.xmlに登録されていないScripts/pythonフォルダは丸ごと削除されてしまいます。)

他の方法はうまくいきませんでした。

SimpleFileAccessのcopy()で、file://からvnd.sun.star.pkgへフォルダをコピーはSipleAccessのcreateFolder()ですでに__main__.InteractiveAugmentedIOException: Cannot store persistent data!と言われてできませんでした。
(2017.12.20追記。Scripts/pythonフォルダだけがvnd.sun.star.pkgプロトコールで書き込めないことが原因とわかりました。Scripts/pythonフォルダがすでに存在するドキュメントにはvnd.sun.star.pkgプロトコールで書き込めます。しかしkill()メソッドでの削除はできませんでした。)

ソースのストリームを取得して、SimpleFileAccessのwriteFile()でそれぞれvnd.sun.star.pkgへ書き込む。
これも4-1と同様にドキュメント内にフォルダが作成できないので断念しました。

ドキュメントストレージに書き込む方法もうまくできませんでした。

次の関連記事:LibreOffice5(114)ドキュメントのイベント名一覧

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ