top / index / prev / next / target / source

2005-06-12 diary: Java: OpenOffice.org SDKを用いた PDFファイルを新規作成するサンプル

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: OpenOffice.org SDKを用いた PDFファイルを新規作成するサンプル

OpenOffice.org SDK を用いた PDFファイルを新規作成するトイプログラムを作りました。サンプルソースコードをメモします。

OpenOffice.org SDK を用いた PDFファイルを新規作成するためのサンプル

OpenOffice.org SDK を用いた PDFファイルを新規作成するためのサンプルです。

確認に利用した動作環境

動作条件

/*
 * OpenOffice.org: Excelファイルの新規作成サンプル
 * Copyright (C) 2005 伊賀敏樹 作成日: 2005/06/12
 */

import java.io.File;

import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.XPropertySetInfo;
import com.sun.star.bridge.XBridge;
import com.sun.star.bridge.XBridgeFactory;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.connection.ConnectionSetupException;
import com.sun.star.connection.NoConnectException;
import com.sun.star.connection.XConnection;
import com.sun.star.connection.XConnector;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XController;
import com.sun.star.frame.XModel;
import com.sun.star.frame.XStorable;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheetView;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.text.XText;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;

/**
 * @author Tosiki IGA
 */
public class OOoWritePDFSample {
    /**
     * UNO接続で利用する接続先情報
     */
    public static final String DEFAULT_CONNECTION_STRING = "socket,host=localhost,port=8100,tcpNoDelay=1";

    /**
     * UNO接続で利用するソケットコネクション
     */
    private XConnection connection = null;

    public static void main(String[] args) {
        try {
            new OOoWritePDFSample().process();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void process() throws Exception {
        System.out.println("Calcブックを新規作成してファイル保存します.");

        File fileTarget = new File("./sample.pdf");
        if (fileTarget.exists()) {
            fileTarget.delete();
        }

        System.out.println("OpenOfficeに接続するための前準備を実施します.");
        XBridge bridge = createOOoBridge(DEFAULT_CONNECTION_STRING);
        if (bridge == null) {
            return;
        }
        Object desktop = createDesktopInstance(bridge);
        if (desktop == null) {
            return;
        }
        System.out.println("OpenOfficeに接続するための前準備が完了しました.");

        XComponentLoader componentLoader = (XComponentLoader) UnoRuntime
                .queryInterface(XComponentLoader.class, desktop);

        System.out.println("Calcドキュメントを新規作成します.");
        PropertyValue[] loadProps = new PropertyValue[1];
        loadProps[0] = new PropertyValue();
        loadProps[0].Name = "Hidden";
        loadProps[0].Value = new Boolean(false);

        XComponent component = componentLoader.loadComponentFromURL(
                "private:factory/scalc", "_blank", 0, loadProps);
        XSpreadsheetDocument document = (XSpreadsheetDocument) UnoRuntime
                .queryInterface(XSpreadsheetDocument.class, component);

        System.out.println("Calcシートを新規作成します.");
        XSpreadsheets sheets = document.getSheets();
        sheets.insertNewByName("Sheet1", (short) 0);
        XSpreadsheet sheet = (XSpreadsheet) UnoRuntime.queryInterface(
                XSpreadsheet.class, sheets.getByName("Sheet1"));

        System.out.println("Sheet1をアクティブに設定します.");
        XModel model = (XModel) UnoRuntime.queryInterface(XModel.class,
                component);
        XController controller = model.getCurrentController();
        XSpreadsheetView view = (XSpreadsheetView) UnoRuntime.queryInterface(
                XSpreadsheetView.class, controller);
        view.setActiveSheet(sheet);

        System.out.println("A1に値をセット. (XText経由)");
        XText text = (XText) UnoRuntime.queryInterface(XText.class, sheet
                .getCellByPosition(0, 0));
        text.setString("test");

        System.out.println("A2に値をセット. (setValue経由)");
        sheet.getCellByPosition(0, 1).setValue(123456);

        System.out.println("A3に値をセット. (セルのプロパティFormulaLocal経由)");
        XPropertySet prop = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, sheet.getCellByPosition(0, 2));
        prop.setPropertyValue("FormulaLocal", "256,512");
        prop.setPropertyValue("CellBackColor", new Integer(0xC0C0C0));

        if (false) {
            System.out.println("PropertySetInfoをデバッグ表示します.");
            XPropertySetInfo propinfo = prop.getPropertySetInfo();
            Property[] props = propinfo.getProperties();
            for (int index = 0; index < props.length; index++) {
                System.out.println("propertySet:" + props[index].Name + "="
                        + prop.getPropertyValue(props[index].Name).toString());
            }
        }

        Thread.sleep(2000);

        System.out.println("Calcドキュメントを指定のPDFファイル(" + fileTarget.getAbsolutePath()
                + ")に保存処理します.");
        XStorable storable = (XStorable) UnoRuntime.queryInterface(
                XStorable.class, component);

        PropertyValue[] saveProps = new PropertyValue[1];
        saveProps[0] = new PropertyValue();
        saveProps[0].Name = "FilterName";
        saveProps[0].Value = "calc_pdf_Export";

        storable.storeToURL(fileTarget.toURL().toString(), saveProps);
        component.dispose();

        System.out.println("OpenOfficeへの接続の後処理(UNO接続のクローズ処理)を実施します.");
        connection.close();

        System.out.println("Calcブックを新規作成してPDFファイル保存の一連の処理を終了します.");
    }

    /**
     * OpenOfficへのブリッジ接続(UNO接続)をオープンします
     * 
     * @param 接続先情報
     * @return
     */
    public XBridge createOOoBridge(String connectionString) {
        System.out.println("OpenOfficへのブリッジ接続(UNO接続)をオープンします.");
        try {
            XComponentContext localContext = Bootstrap
                    .createInitialComponentContext(null);
            XMultiComponentFactory localServiceManager = localContext
                    .getServiceManager();
            XConnector connector = (XConnector) UnoRuntime.queryInterface(
                    XConnector.class, localServiceManager
                            .createInstanceWithContext(
                                    "com.sun.star.connection.Connector",
                                    localContext));
            try {
                connection = connector.connect(connectionString);
            } catch (NoConnectException ex) {
                System.err.println("UNO接続に失敗しました:" + ex.toString());
                return null;
            } catch (ConnectionSetupException ex) {
                System.err.println("UNO接続のセットアップに失敗しました:" + ex.toString());
                return null;
            }
            XBridgeFactory bridgeFactory = (XBridgeFactory) UnoRuntime
                    .queryInterface(XBridgeFactory.class, localServiceManager
                            .createInstanceWithContext(
                                    "com.sun.star.bridge.BridgeFactory",
                                    localContext));
            return bridgeFactory.createBridge("", "urp", connection, null);
        } catch (Exception ex) {
            System.err.println("ブリッジ作成処理全般を通して例外が発生しました.:" + ex.toString());
            return null;
        }
    }

    /**
     * OpenOfficeのデスクトップインスタンスを作成します.
     * 
     * @param bridge
     * @return
     */
    public static Object createDesktopInstance(XBridge bridge) {
        System.out.println("OpenOfficeのデスクトップインスタンスを作成します.");
        try {
            XMultiComponentFactory serviceManager = (XMultiComponentFactory) UnoRuntime
                    .queryInterface(XMultiComponentFactory.class, bridge
                            .getInstance("StarOffice.ServiceManager"));
            XPropertySet propertySet = (XPropertySet) UnoRuntime
                    .queryInterface(XPropertySet.class, serviceManager);
            XComponentContext remoteContext = (XComponentContext) UnoRuntime
                    .queryInterface(XComponentContext.class, propertySet
                            .getPropertyValue("DefaultContext"));
            XMultiComponentFactory remoteServiceManager = remoteContext
                    .getServiceManager();
            return remoteServiceManager.createInstanceWithContext(
                    "com.sun.star.frame.Desktop", remoteContext);
        } catch (Exception ex) {
            System.err.println("OpenOfficeのデスクトップインスタンス作成において例外が発生しました.:"
                    + ex.toString());
            return null;
        }
    }
}

関連する日記


この日記について