ストレージ 
ストレージ。
ストレージ構造 
ストレージはファイルシステムのように階層構造です。各階層は com.sun.star.embed.XStorage インターフェースなどをエクスポートしています。com.sun.star.container.XNameAccess インターフェースなどでその階層にあるファイル名など、要素名を取得できます。
要素 
ストレージに所属する要素は二種類に分かれます。ストレージとストリームです。ストレージはディレクトリに相当し、内部にほかのストレージやストリームを含みます。ストリームは普通のファイルに相当し、データを保持しています。
要素の種類の確認には .embed.XStorage インターフェースのメソッドが利用できます。isStorageElement メソッドで名前の要素がストレージかどうかを確認します。 また、isStreamElement メソッドでストリームかどうかを確認します。
コミット 
ストレージの要素を変更した場合には変更を適用するために commit メソッドを呼ぶ必要があります。また、変更を無効にする場合には revert メソッドを呼びます。
.embed.XTransactedObject インターフェースをエクスポートしていても実装により動作しない場合があります。その場合にはコミットするまえに変更が直接反映されます。
ドキュメントストレージ 
ドキュメントストレージは .document.XStorageBasedDocument インターフェースの getDocumentStorage メソッドを利用して取得します。
0
1
2
| | def document_storage_test():
doc = XSCRIPTCONTEXT.getDocument()
doc_storage = doc.getDocumentStorage()
|
また、zip 圧縮した ODF ファイルからも作成できます (開いていないドキュメント)。
0
1
2
3
4
5
6
7
| | def storage_test():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.StorageFactory', ctx)
storage = sf.createInstanceWithArguments(
(u'file:///home/user/Desktop/pkgp.odt',4))
|
ファイルシステムストレージ 
ファイルシステムストレージはストレージとして OS のファイルシステム環境を利用します。ファイルシステムストレージは com.sun.star.embed.FileSystemStorageFactory サービスから作成します。
引数にはディレクトリの URL を指定します。モードの指定が必要であれば二番目に .embed.ElementModes の値を指定します。
0
1
2
3
4
5
6
7
8
| | def filesystem_storage_test():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.FileSystemStorageFactory', ctx)
storage = sf.createInstanceWithArguments(
(u'file:///home/user/Desktop/py',1))
|
モード 
ストレージを開くときのモード。ファイルを開くときの読み/書きモード指定のようなもの。
.embed.ElementModes | long | |
READ | 1 | |
SEEKABLE | 2 | |
SEEKABLEREAD | 3 | |
WRITE | 4 | |
READWRITE | 7 | |
TRUNCATE | 8 | |
NOCREATE | 16 | |
開く 
ストレージに含まれる要素を開きます。開いてサブストレージやデータを取得することが出来ます。
ストレージ 
ストレージに含まれるサブストレージを開きます。openStorageElement メソッドにストレージ名およびモードを指定します。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| | def open_storage_test():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.StorageFactory', ctx)
storage = sf.createInstanceWithArguments(
(u'file:///home/user/Desktop/smile.odg',4))
thumb_dir_name = u'Thumbnails'
thumb_file_name = u'thumbnail.png'
in_stream = None
try:
if storage.hasByName(thumb_dir_name) and \
storage.isStorageElement(thumb_dir_name):
storage_thumbnails = storage.openStorageElement(thumb_dir_name, 1)
stream = storage_thumbnails.openStreamElement(thumb_file_name, 1)
in_stream = stream.getInputStream()
except Exception,e:
print e
if in_stream:
sfa = smgr.createInstanceWithContext(
u'com.sun.star.ucb.SimpleFileAccess', ctx)
sfa.writeFile(u'file:///home/user/Desktop/thumb.png', in_stream)
|
odg ファイルに含まれているサムネイル画像を取得してローカルファイルに保存します。ストレージ要素を取得すると .embed.Storage サービスのインスタンスが戻ります。ストリーム要素は .io.XStream インターフェースとして取得できます。
ストリーム 
ストレージに含まれるストリーム (ファイル) を開きます。上記ストレージの openStreamElement メソッドでストリームを開いて .io.XStream インターフェースを取得しています。
または、読み込み専用で開くのであれば cloneStreamElement メソッドにストリームの要素名を指定します。
stream = storage.cloneStreamElement(u'element_name')
stream_input = stream.getInputStream()
コピー 
ファイルコピー。
ストレージからストレージへ 
あるストレージから別のストレージへファイルをコピーします。
copyElementTo メソッドの引数は、コピーする要素名、コピー先ストレージ、コピー先での要素名の順です。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| | def storage_test():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.StorageFactory', ctx)
storage = sf.createInstanceWithArguments(
(u'file:///home/user/Desktop/smile.odg',4))
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.FileSystemStorageFactory', ctx)
filesystem_storage = sf.createInstanceWithArguments(
(u'file:///home/user/Desktop/py',1))
try:
filesystem_storage.copyElementTo(u'filters.py', storage, u'Scripts/python/filters.py')
storage.commit()
except Exception,e:
print e
|
上記のようにすると表示が変になったりします。各ストレージを段階的に取得してから行うべきです。
名前の変更 
renameElement メソッドでストレージ中の要素名を変更できます。引数は順に元ファイル名、変更後ファイル名です。
0
1
2
3
4
5
6
7
8
9
10
11
| | def rename_storage_test():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.FileSystemStorageFactory', ctx)
filesystem_storage = sf.createInstanceWithArguments(
(u'file:///home/user/Desktop/py',1))
try:
filesystem_storage.renameElement(u'file_', u'file.py')
except Exception,e:
print e
|
システムファイルストレージでは commit する前に名前の変更が行われます。
削除 
ストレージに含まれる要素を削除します。removeElement メソッドの引数に削除したい要素名を指定します。同じ階層にある要素しか削除できません。
0
1
2
3
4
5
6
7
8
9
10
11
12
| | def remove_storage_test():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
sf = smgr.createInstanceWithContext(
u'com.sun.star.embed.FileSystemStorageFactory', ctx)
filesystem_storage = sf.createInstanceWithArguments(
(u'file:///home/asuka/Desktop/py',1))
try:
filesystem_storage.removeElement(u'file.py')
#filesystem_storage.commit()
except Exception,e:
print e
|
例 
一例。
ドキュメントに含まれる画像を取り出す 
ドキュメントに埋め込まれた形式で挿入された画像 (リンクではないもの) をストレージから取り出してローカルファイルに保存します。
埋め込まれた画像は Pictures サブストレージ中にあります。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| | def document_storage_test():
dir_url = u'file:///home/user/Desktop/py/'
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
doc = XSCRIPTCONTEXT.getDocument()
doc_storage = doc.getDocumentStorage()
pictures = u'Pictures'
if doc_storage.hasByName(pictures):
pictures_storage = doc_storage.openStorageElement(pictures, 1)
names = pictures_storage.getElementNames()
sfa = smgr.createInstanceWithContext(
u'com.sun.star.ucb.SimpleFileAccess', ctx)
for name in names:
if pictures_storage.isStreamElement(name):
stream = pictures_storage.openStreamElement(name, 1)
sfa.writeFile(u''.join((dir_url, name)), stream.getInputStream())
|