Impress file to SVG

OpenOffice BASIC を使って Impress のファイルからSVGファイルを生成するスクリプトを記述してみた。Visual Basic for Application と文法やオブジェクトのAPIがかなり似ているのでけっこう何とかなりそうな感じだ。StarOfficeのBASICに関する日本語ドキュメントがあるので、そちらも参考にしながらやればよさそうだ。

ちょっと残念なのが、結局マクロなのでアプリケーション的なインタフェースにするのがちょっと難しいというところだろうか。とりあえず、sxi2svg.sxw というWriterファイルにマクロを登録して作成した。これを開いて書いてある通りにすれば使用できる。 [ダウンロード] … [名前をつけて保存]でダウンロードしてください。

ソースコードはこんな感じである。何かアドバイスがあればコメントしてもらえるとありがたい。

Sub Main
sxi2svg()
End Sub

Sub sxi2svg
‘docNameのデフォルト値
‘docName = "file:///C:/documents/presentation.sxi"
docName = "C:/documents/presentation.sxi"
InputVal = InputBox( _
"変換するプレゼンテーションファイル名を入力してください。:", _
"Input presentation file name", docName _
)
If InputVal = null Then
MsgBox "変換するプレゼンテーションファイル名が指定されませんでした"
Exit Sub
Endif
docName = InputVal
‘ Open Document
oDoc = StarDesktop.LoadComponentFromURL( _
ConvertToURL(docName), "_blank", 0, Array() _
)
slideNum = oDoc.getDrawPages().getCount()
oDoc.dispose()
noSuffixName = Left(docName, Len(docName)-4)
For i = 0 to slideNum – 1
oDoc = StarDesktop.LoadComponentFromURL( _
ConvertToURL(docName), "_blank", 0, Array() _
)
pickupSlide(oDoc, i)
saveName = noSuffixName + formatNum(i+1)
oDoc.storeToURL(ConvertToURL(saveName + ".sxi"), Array())
export(oDoc, saveName)
oDoc.dispose()
Next
End Sub

Function pickupSlide(oDoc, pageIndex)
slideNum = oDoc.getDrawPages().getCount()
i = slideNum – 1
Do while i >= 0
If i <> pageIndex Then
oPage = oDoc.getDrawPages().getByIndex(i)
oDoc.getDrawPages().remove(oPage)
Endif
i =i -1
Loop
End Function

Function export(oDoc, saveName)
Dim url As New com.sun.star.beans.PropertyValue
Dim filter As New com.sun.star.beans.PropertyValue
url.Name = "URL"
url.Value = ConvertToURL(saveName + ".svg")
filter.Name = "FilterName"
filter.Value = "impress_svg_Export"
oArgs = Array (url, filter)
oController = oDoc.getCurrentController()
oFrame = oController.getFrame()
unoService = createUnoService("com.sun.star.frame.DispatchHelper")
unoService.executeDispatch(oFrame, ".uno:ExportTo", "", 0, oArgs())
End Function

Function formatNum(num)
ret = "000"
If i < 10 Then
ret = "00"+CSTR(num)
ElseIf i < 100 Then
ret = "0"+CSTR(num)
Else
ret = CSTR(num)
Endif
formatNum() = ret
End Function

同じカテゴリの記事: Open Source