JooConverter[igapyon,JooConverter,opensource,free,xls,excel,pdf,LGPL] Java帳票ソリューションとして画期的なパスを提供するためのオープンソースツールのひとつ。OpenOffice.orgと連係動作して ExcelファイルをPDFファイルに変換することなどが可能です。 |
JooConverterについて |
JooConverterは OpenOffice.orgのJava-APIを使いやすくするためのユーティリティークラスです。オープンソースライセンス下で公開されています。Java言語によって帳票システムを構築するというニーズは業務システム分野においてはありふれて存在する場面なのですが、JooConverterは それら帳票システム構築に画期的な生産性を与えるものだと考えています。例えば下記のような利用形態が考えられます。
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ファイル変換方法
"?:\Program Files\OpenOffice.org1.1.4\program\soffice.exe" "-accept=socket,port=8100;urp;" |
?:\Program Files\OpenOffice.org1.1.4\share\registry\schema\org\openoffice\Setup.xcs |
「prop oor:name="ooSetupConnectionURL」というところがあるので、下記のように変更します。 |
?:\Program Files\OpenOffice.org1.1.4\program\classes |
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ランチャー) と共に利用するのが適切な組み合わせです。変換の都度、下記の起動・停止手順を全て実行するようにするのです。
このことにより、OpenOffice.orgプロセスに多少の矛盾がたまったとしても 都度プロセスの起動・停止を行うために 毎回リセットされて確実に動作する状態を得ることが出来ます。
ただし、私に時間とヒマが出来たなら、OpenOffice.org SDK をベースに スクラッチでラッパークラスを開発したいという感触も得ました。OpenOffice.org
SDK を用いて 全て実装しなおした方が安定したものが得られるとも考えています。
OpenOffice.org SDK を使いこなすことが出来たら、かなり応用範囲が広そうですし、意義は十分にあります。
OpenOffice.org + JooConverterを利用する際のTIPS |
JooConverterに関するニュース |
JooConverterにたどり着くまでに検討したプロダクト |
下記のプロダクトを検討した結果、2005.02時点では JooConverter採用が妥当であろうと判断を行いました。