手動で.bmpにExportする場合、解像度を指定できる。
しかし、先週作ったマクロでは解像度を指定できず、デフォルト値の37ピクセル/cm(と表示されているが、正確には96dpi)で出力されることになる。
これを変更したい。しかし、ネット上で探すと情報がまとまっておらず、錯綜しており、混乱の極みだった。
まず、storeToURL()メソッドに渡すcom.sun.star.beans.PropertyValue型の.Name = "FilterData"でフィルタ固有の設定の入った配列を渡す。この配列もまたcom.sun.star.beans.PropertyValueで、いわば入れ子構造になっている。
ここまでは、先週の段階で解っていたところだ。
"FilterData"について、真剣に調べるとはまりそうな気がしたので、先週の段階では無視した。また、最初の1歩目は、あまり凝らずにさっさと閉じて、まず形にするのが私のやり方だ。
というわけで、今週の通勤時に、スマホで検索して調べた。
やっと見つけた記事が、OpenOffice-Basic GraphicExportFilter documentation?。
まさにこれだと思ったが、コードの断片であり、説明はやはり無い。
下の方のリンクの文書を読んでみたが、"FilterData"の説明は書かれていない。
数日間、通勤時間の朝夕ほとんどをつぎ込んでも、結局"FilterData"について、まとめられた文書はどこにも見当たらなかった(自分の検索の方法が悪いのかもしれないが...)。
しょうが無いので、ソースコードを読んでみることにした。
https://github.com/LibreOfficeで、スマホでもソースコードを参照できる。
現在利用しているLibreOfficeのバージョンは5.1なので、そのGraphicFilterのソースコードを見てみる。
"FilterData"設定で見ているのは、PixelWidthとPixelHeightだけだ。
派生クラスなどでは他の値も使っているかもしれないが、基本的にはこれだけのようだ。
これらの値が、aRenderer.renderToGraphic()に渡されることになる。
サイズの指定がこれだけだとすれば、ドキュメントの縦横幅をピクセル数で指定しているだけと想像できる。
すなわち、dpiやpixel/cmのような物理量と関係する値ではない。そのページを縦横何ピクセルで画像にするかというだけだ。
試しに、先週のコードを以下のように改造して、実行してみた。
sub SavePagesAsBMP dim doc as Object dim controller as Object dim pages as Object dim prevCurrentPage as Object dim args(2) as new com.sun.star.beans.PropertyValue dim filterData (2) As New com.sun.star.beans.PropertyValue dim dirDialog as Object dim ucb as Object dim directory as String GlobalScope.BasicLibraries.LoadLibrary("Tools") doc = ThisComponent 'MsgBox doc.DBG_properties 'MsgBox doc.DBG_Methods 'MsgBox doc.drawPages.DBG_properties 'MsgBox doc.drawPages.DBG_Methods '------------------------------------------------------------ ' Select directory by Directory Selection dialog '------------------------------------------------------------ dirDialog = CreateUnoService( "com.sun.star.ui.dialogs.FolderPicker" ) ucb = createUnoService("com.sun.star.ucb.SimpleFileAccess") directory = DirectoryNameoutofPath(doc.getURL(),"/") if ucb.Exists( directory ) then dirDialog.SetDisplayDirectory( directory ) end if if dirDialog.Execute() <> 1 then exit sub end if directory = dirDialog.getDirectory '-------------------------------- ' Save each page as .BMP '-------------------------------- controller = doc.CurrentController pages = doc.drawPages args(0).Name = "FilterName" args(0).Value = "draw_bmp_Export" args(1).Name = "FilterData" filterData(0).Name = "PixelWidth" filterData(0).Value = 900 filterData(1).Name = "PixelHeight" filterData(1).Value = 800 args(1).Value = filterData prevCurrentPage = controller.getCurrentPage ' preserve current page For i=0 to pages.Count -1 controller.setCurrentPage( pages(i) ) 'url = directory + "/" + controller.getCurrentPage.Name +".bmp" url = directory + "/" + right( "0000000" + i, 8) +".bmp" 'MsgBox url doc.storeToURL( url, args ) Next i controller.setCurrentPage( prevCurrentPage ) ' restore current page end subちゃんと、900x800で画像が保存できた。
一応動いたとはいえ、もう少しソースコードを追いかけてみたほうがよさそうだ。
また、独自のダイアログを作ることもできそうなので、次はそれを使って値を指定するようにしてみよう。
LibreOffice Draw でアニメーション作製
LibreOffice Draw でアニメーション作製#2
LibreOffice Draw でアニメーション作製#3
LibreOffice Draw でアニメーション作製#4
LibreOffice Draw でアニメーション作製#5
2017/10/20 リンクが間違っていた。張り直した。
0 件のコメント:
コメントを投稿