JooConverter

[igapyon,JooConverter,opensource,free,xls,excel,pdf,LGPL] Java帳票ソリューションとして画期的なパスを提供するためのオープンソースツールのひとつ。OpenOffice.orgと連係動作して ExcelファイルをPDFファイルに変換することなどが可能です。

インディックスページへ戻る
JooConverterについて

JooConverterは OpenOffice.orgのJava-APIを使いやすくするためのユーティリティークラスです。オープンソースライセンス下で公開されています。Java言語によって帳票システムを構築するというニーズは業務システム分野においてはありふれて存在する場面なのですが、JooConverterは それら帳票システム構築に画期的な生産性を与えるものだと考えています。例えば下記のような利用形態が考えられます。

  1. 最初に Excelファイルの形式で帳票を作成する
    これは Jakarta POIなどで作成することができます。→ ちなみに、ここに JooConverterの姉妹品であるJooTemplatesを用いると、もっと統一感の取れた生産性の高さを得ることが出来ます。
    2005.03.05 追記
    一方で Jakarta POIのExcelファイル作成に微妙な問題があることがわかっています。、、、がその件は別の機会に。
  2. JooConverter を使って (内部的には OpenOfficeの機能を利用して) ExcelファイルをPDFファイルに変換を行います。
  3. たったこれだけで、PDF帳票作成が可能になります。しかも PDF作成のために準備した入力データである Excelファイルについて、これは単純にExcelファイルであるので、別の用途 (例えばデータの2次加工など) にも転用ができるのも魅力です。

Java言語において帳票システムをどのように構築するのかについては、いろいろなアプローチがあります。OpenOffice.orgのJava APIを 直接呼び出すというアプローチも選択可能なのですが、現時点では情報が少なく、実際にOpenOffice.org API直接呼び出しをプログラミングしてみると かなり厄介であることがわかります。そこに JooConverterが登場します。後述のように、とてもシンプルなコーディングで ExcelファイルをPDFファイルに変換することができるのです。もちろん WordファイルをPDF化することもできます。OpenOffice.orgの能力が プログラミング言語から利用可能になるのです。

2005.06.10追記 現時点では blanco Frameworkの blancoReport という実装に関与しています。日本風の Excel帳票およびPDF帳票については blancoReportのアプローチが適していると考えています。

JooConverterのサンプルソースコード

動作確認プラットフォーム

JooConverterを使った Excelファイル → PDFファイル変換方法

  1. Sun Java2 SDK 1.4.2以上 (Windows版) をインストールします。
    事前に JDKをインストールしておくと、OpenOffice.orgインストール時に Javaを自動認識してくれるので、とても便利です。トラブルを避けるために、この順序性は維持するのが望ましいです。
  2. OpenOffice.org 1.1.4 日本語版のダウンロードを行います。
  3. OpenOffice.org のインストール
  4. セットアップが終わったら、いったん OpenOffice.orgを起動しておきます。
    これは、登録画面を確定させておきたいからです。

    なお、今回は OpenOffice.orgへの登録手順は割愛しました。
  5. OpenOffice.orgのプロセス常駐 (または OOoLauncherを用いた OpenOffice.orgの起動・停止)
    下記のいずれかの方法でOpenOffice.orgを起動または常駐させます。
  6. JooConverterを入手&設定します。
  7. OpenOffice.orgのAPIを構成するjarファイルをセットアップします。
    ?:\Program Files\OpenOffice.org1.1.4\program\classes
    このフォルダに入っている下記のファイルをクラスパスに通します。
  8. 下記のようなソースコードを利用すると、inputExcel.xlsという名前の xlsファイルをpdfファイルに変換することができます。
JooConverterSample.java
/*
 * JooConverterを用いた Excel→PDF 変換サンプル
 * Copyright(C) 2005 伊賀敏樹
 * 作成日: 2005/02/17
 */

import java.io.File;
import java.io.IOException;
import java.net.ConnectException;

import net.sf.joott.uno.DocumentConverter;
import net.sf.joott.uno.DocumentConverterFactory;
import net.sf.joott.uno.DocumentFormat;

/**
 * JooConverterを使って OpenOffice.orgと協調動作しながら ExcelファイルをPDFファイルに変換します.
 * 
 * @author iga
 */
public class JooConverterSample {
        /**
         * 入力ファイルとして与えるExcelファイルのファイル名
         */
        private static final String INPUT_FILE_EXCEL = "inputExcel.xls";

        /**
         * 出力ファイルとして与えるPDFファイルのファイル名
         */
        private static final String OUTPUT_FILE_PDF = "outputPdf.pdf";

        public static void main(String[] args) {
                System.out.println("ExcelファイルをPDFファイルに変換するサンプルプログラム.");
                File fileInput = new File(INPUT_FILE_EXCEL);
                if (fileInput.exists() == false) {
                        System.out.println("入力Excelファイル[" + fileInput.getAbsolutePath()
                                        + "]が見つかりませんでした. 処理を中断します.");
                        return;
                }
                if (fileInput.canRead() == false) {
                        System.out.println("入力Excelファイル[" + fileInput.getAbsolutePath()
                                        + "]は読み込むことができません. 処理を中断します.");
                        return;
                }
                File fileOutput = new File(OUTPUT_FILE_PDF);
                if (fileOutput.exists()) {
                        if (fileOutput.delete() == false) {
                                System.out
                                                .println("出力PDFファイル[" + fileOutput.getAbsolutePath()
                                                                + "]が既に存在していたので事前に削除しようとしましたが"
                                                                + "削除に失敗しました."
                                                                + " 処理を中断します.");
                                return;
                        }
                }

                System.out.println("入力Excelファイル[" + fileInput.getAbsolutePath()
                                + "を出力PDFファイル[" + fileOutput.getAbsolutePath() + "]に変換開始します.");
                DocumentConverter converter = null;
                try {
                        converter = DocumentConverterFactory.getConverter();
                } catch (ConnectException ex) {
                        System.out.println("コンバーターの取得に失敗しました.処理を中断します.:" + ex.toString());
                        ex.printStackTrace();
                        return;
                }
                try {
                        converter.convert(fileInput, fileOutput, DocumentFormat.PDF_CALC);

                        // 2005.02.23 下記コードを検証中!!!
                        DocumentConverterFactory.getConnection().close();
                } catch (IOException ex) {
                        System.out.println("変換中に入出力例外が発生しました.処理を中断します.:" + ex.toString());
                        ex.printStackTrace();
                        return;
                }
                if (fileOutput.exists() == false) {
                        System.out.println("変換が終了したにもかかわらず、出力PDFファイル["
                                        + fileOutput.getAbsolutePath() + "]が作成されていません.処理を中断します.");
                        return;
                }
                if (fileOutput.canRead() == false) {
                        System.out.println("変換が終了したにもかかわらず、出力PDFファイル["
                                        + fileOutput.getAbsolutePath()
                                        + "]が読み込みできない状態になっています.処理を中断します.");
                        return;
                }

                System.out.println("ExcelファイルのPDFファイルへの変換が正常に終了しました.");
        }
}

確認したこと

参考にしたページ

OOoLauncher : OpenOffice.orgランチャー・クラスライブラリ

2005.03.06 OOoLauncherは OpenOffice.orgを Javaのプログラムから起動&停止を行うことが出来るようにするためのプログラム・クラスライブラリです。(現時点では一つのクラスしか含まれていませんけれども…) このソフトを利用することにより、OpenOffice.orgを常駐させるのではなく 私たちが欲する任意のタイミングにおいて OpenOffice.orgプロセスを起動または停止することができるようになります。

なぜ このようなものが必要になるのかというと、OpenOffice.org SDK または JooConverterなどを用いた OpenOffice.org APIを利用する際には OpenOffice.orgのプロセスが起動している必要があるからなのです。OS起動時に OpenOffice.org を常駐させるというのが OpenOffice.org SDK が提示している一般的な解決策なのですが、現時点において私が試した範囲では OpenOffice.orgを常駐させっぱなしにすると、どうしても動作が不安定になりがちであるとう現象が発生しています。(これは一般的に知られた問題でもあります)
この問題を解決するための解が OOoLauncherなのです。OOoLauncherを用いることにより、プログラム側の都合に合わせた OpenOffice.orgプロセスの起動・終了を行うことができるようになります。もちろん OpenOffice.org APIを利用するために必要な OpenOffice.orgロードモジュールへの起動時の引数も 確実に引き渡すことが可能になります。難しい設定は必要ありません。

このOOoLauncherのコア部分は、Seasar2プロジェクトの一部である S2Jooというライブラリを起源としています。SeasarおよびJooConverterのソリューションを手がける 株式会社スターロジック羽生章洋さんから情報の提示をいただきました。また S2Jooは 同社まこたんさんが開発されたものです。
(ちなみに羽生さんは 同社のCEOであるとともに、著名なITライターさんでもあります。皆が認める日本を代表するITコンサルタントさんです。)

S2Jooのライセンスを 羽生章洋さんに問い合わせたところ、Seasarと同じライセンスを採用するとの回答を得ました。このため、OOoLauncherについても Seasarのライセンスを踏襲します。

ちなみに、S2Jooのソースコードは OooLauncherのベースになっていると共に、JooConverterの使い方そのものを理解する上でも、とても参考になりました。このような有益なソースコードを提供下さったスターロジック社の方々、羽生章洋さん、まこたんさんに 大変感謝しています。

JooConverterTI

2005.03.06 更新 JooConverterは 内部に staticな OOoへの接続オブジェクトを保持しています。これはソースコードを閲覧すれば すぐにわかります。しかし、それでは エラー時の再接続などに不具合が発生することがわかってきました。このため、staticなOOoへのオブジェクトは利用せずに、淡々と接続・切断を行うような場当たり的なパッチを適用した版を作成しました。(対応は場当たり的ですが、OOoLauncherと組み合わせると ちゃんと動作するようになります)

なお、このパッチ付きバージョンは、後述の OOoLauncher (OpenOffice.orgランチャー) と共に利用するのが適切な組み合わせです。変換の都度、下記の起動・停止手順を全て実行するようにするのです。

  1. OOoLauncherによる OpenOffice.orgプロセス起動
  2. JooConverterTI による Uno接続の取得
  3. JooConverterTIによる Excel→PDF変換の実行
  4. JooConverterTI による Uno接続の切断
  5. OOoLauncherによる OpenOffice.orgプロセス停止

このことにより、OpenOffice.orgプロセスに多少の矛盾がたまったとしても 都度プロセスの起動・停止を行うために 毎回リセットされて確実に動作する状態を得ることが出来ます。

ただし、私に時間とヒマが出来たなら、OpenOffice.org SDK をベースに スクラッチでラッパークラスを開発したいという感触も得ました。OpenOffice.org SDK を用いて 全て実装しなおした方が安定したものが得られるとも考えています。
OpenOffice.org SDK を使いこなすことが出来たら、かなり応用範囲が広そうですし、意義は十分にあります。

OpenOffice.org + JooConverterを利用する際のTIPS
JooConverterに関するニュース
JooConverterにたどり着くまでに検討したプロダクト

下記のプロダクトを検討した結果、2005.02時点では JooConverter採用が妥当であろうと判断を行いました。


いがぴょんについて
Last modified: $Date: 2005/06/21 15:25:43 $