画像シェイプの挿入
ここではJPEG等の画像をシェイプを使って挿入する方法について説明します。
画像を挿入する方法として、ディスパッチを使う方法もありますが、挿入する画像のサイズが原寸サイズから変更できないというデメリットがあることから、ここでは少々複雑ですが、画像シェイプ(GraphicShapeObject)を使う方法を説明します。
シェイプの描画はドローページという図形描画用のページで行われます。Writerではドキュメントから、Calcではシートからドローページを取得できます。このドローページにシェイプオブジェクトを追加することでシェイプが描画されます。
ドローページやシェイプを使うに当たっては、各オブジェクトの取得やプロパティ設定の際に所定のインターフェイスへのキャストが必要となり少々面倒ですが、サンプルを見ていただければかなり参考になると思います。まずはCalcでの画像シェイプの挿入サンプルを見てみましょう。
//コンポーネントコンテキストの取得 unoidl.com.sun.star.uno.XComponentContext localContext = uno.util.Bootstrap.bootstrap(); //サービスマネージャの取得 unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory = (unoidl.com.sun.star.lang.XMultiServiceFactory)localContext.getServiceManager(); //コンポーネントローダの取得 unoidl.com.sun.star.frame.XComponentLoader componentLoader = (unoidl.com.sun.star.frame.XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop"); //ドキュメントの取得 unoidl.com.sun.star.lang.XComponent component = componentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]) unoidl.com.sun.star.sheet.XSpreadsheetDocument spredsheetDocument = (unoidl.com.sun.star.sheet.XSpreadsheetDocument)component; //ドローページの取得 unoidl.com.sun.star.drawing.XDrawPage drawPage = ((unoidl.com.sun.star.drawing.XDrawPageSupplier)spredsheetDocument.getSheets().getByName("表1").Value).getDrawPage(); //シェイプの生成 unoidl.com.sun.star.drawing.XShape shape = (unoidl.com.sun.star.drawing.XShape)((unoidl.com.sun.star.lang.XMultiServiceFactory)spredsheetDocument).createInstance("com.sun.star.drawing.GraphicObjectShape"); shape.setPosition(new unoidl.com.sun.star.awt.Point(1000, 1000)); //0.01mm単位 shape.setSize(new unoidl.com.sun.star.awt.Size(10000, 10000)); //0.01mm単位 ((unoidl.com.sun.star.beans.XPropertySet)shape).setPropertyValue("GraphicURL", new uno.Any("file:///C:/sample.jpg")); //シェイプの追加 drawPage.add(shape);ドキュメントの取得についてはOpenOfficeのプロセス起動を参照してください。
まずはドキュメントからシートオブジェクトを取得して、それをXDocumentPageSupplierにキャストし、ドローページを取得します。次にドキュメントをXMultiServiceaFactoryにキャストしてGraphicObjectShapeシェイプオブジェクトを生成します。シェイプオブジェクトのポジション(左上のポイント)やサイズはシェイプオブジェクトのメソッドで設定できますが、画像ファイルのファイル名についてはシェイプオブジェクトをXPropertySetにキャストしてGraphicURLプロパティを設定することで画像ファイルを設定します。
あとはドローページにシェイプを追加します。これで指定の位置、サイズで画像ファイルを表示することができます。
次に参考までにWriterでの画像シェイプ挿入サンプルを示します。
//コンポーネントコンテキストの取得 unoidl.com.sun.star.uno.XComponentContext localContext = uno.util.Bootstrap.bootstrap(); //サービスマネージャの取得 unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory = (unoidl.com.sun.star.lang.XMultiServiceFactory)localContext.getServiceManager(); //コンポーネントローダの取得 unoidl.com.sun.star.frame.XComponentLoader componentLoader = (unoidl.com.sun.star.frame.XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop"); //ドキュメントの取得 unoidl.com.sun.star.lang.XComponent component = componentLoader.loadComponentFromURL("private:factory/swriter", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]); unoidl.com.sun.star.text.XTextDocument textDocument = (unoidl.com.sun.star.text.XTextDocument)component; //ドローページの取得 drawPage = ((unoidl.com.sun.star.drawing.XDrawPageSupplier)textDocument).getDrawPage(); //シェイプの生成 shape = (unoidl.com.sun.star.drawing.XShape)((unoidl.com.sun.star.lang.XMultiServiceFactory)textDocument).createInstance("com.sun.star.drawing.GraphicObjectShape"); shape.setPosition(new unoidl.com.sun.star.awt.Point(1000, 1000)); shape.setSize(new unoidl.com.sun.star.awt.Size(10000, 10000)); ((unoidl.com.sun.star.beans.XPropertySet)shape).setPropertyValue("GraphicURL", new uno.Any(KCOpenOfficeHelper.ConvertToUrl("file:///C:/sample.jpg"))); ((unoidl.com.sun.star.beans.XPropertySet)shape).setPropertyValue("AnchorType", new uno.Any(TextContentAnchorType.AT_PAGE.ToString())); //シェイプの追加 drawPage.add(shape);Calcと比較してWriterでは、ドキュメントがXSpreadsheetDocumentではなくXTextDocumentであるところや、ドローページをドキュメントから取得していること、シェイプの設定でAnchorTypeの設定を行っているところが異なっています。