ODFDOMを使ってODF文書を作成する

ODFDOMはODF(OpenDocument Format)の文書を扱うためのJava APIであり、OpenOffice.orgプロジェクトによって開発されている。ODFDOMというその名が示す通り、DOMを操作することでODFにアクセスするAPIであり、ODF仕様に定められたXML要素および属性向けのクラスを備えている。これを使うことによって、Javaプログラムから比較的容易にODF文書の作成や操作できるようになる。

ODFDOMの最新版は7月22日にリリースされたばかりのバージョン0.7であり、同じく発表されたばかりであるODF 1.2のコミュニティドラフト仕様をいち早くサポートしている。Apache License 2のもとで公開されており、ODF ToolkitのプロジェクトページよりバイナリおよびJavadocがダウンロードできるほか、MercurialまたはSubversionリポジトリよりソースコードが入手できる。

バイナリ版にはodfdom.jarというファイルが含まれており、これがODFDOMの本体である。ODFDOMを使うためのはこのファイルと、Apache Xerces(Java版を解凍して得られるxercesImpl.jar)が必要となる。OpenOffice.orgの本体は必要としない。なお、ソースコードからビルドする場合にはApache Mavenを利用する。従来はApache Antを利用していたが、0.7よりMavenを利用するように変更された。

ODFDOMで最も基本となるクラスは次の5つだ。これらのクラスはOdfDocumrnt抽象クラスを継承しており、それぞれ関連するODF文書を扱うための機能を有している。

  • OdfTextDocument - ワープロドキュメント(.odtファイル)を扱うクラス
  • OdfSpreadsheetDocumet - 表計算ドキュメント(.odsファイル)を扱うクラス
  • OdfGraphicsDocument - 図形ドキュメント(.odgファイル)を扱うクラス
  • OdfPresentationDocument - プレゼンテーションドキュメント(.odpファイル)を扱うクラス
  • OdfChartDocument - 他のODF文書に埋め込む文書を扱うクラス

次のコードは、ワープロドキュメントを作成してファイルに出力する例である。

package jp.co.mycom.toolde;

import java.net.URI;
import org.odftoolkit.odfdom.doc.OdfTextDocument;

public class CreateOdtDocument {
    public static void main(String[] args) {
        try {
            // ワープロ文書を作成
            OdfTextDocument odtDoc = OdfTextDocument.newTextDocument();
            odtDoc.addText("これはODFテキストドキュメントのサンプルです。");
            odtDoc.newParagraph();
            odtDoc.newImage(new URI("icon.gif"));

            // ファイルにセーブ
            odtDoc.save("sample.odt");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

OdfTextDocumentクラスのインスタンスは、この例のようにnewTextDocument()というstaticメソッドを呼び出すことで作成する。addText()とnewImage()はそれぞれテキストと画像を、newParagraph()は新しい段落を追加するためのメソッドである。そしてsave()を実行することでファイルに出力することが可能となっている。

このプログラムを実行すると、図1のようなドキュメントが作成される。

図1 ODFDOMで作成したワープロドキュメントの例

このままでは寂しいので、少しだけスタイルを指定したコンテンツを追加してみよう。ODFDOMでは、ODFドキュメントのコンテンツのDOMはOdfTextDocumentクラスのgetContentDom()メソッドで、コンテンツのルート要素はgetContentRoot()メソッドで取得することができる。前者はOdfFileDomのインスタンス、後者はOdfOfficeTextのインスタンスである。これらはいずれもcontent.xmlに記述される情報をモデル化したものである。

スタイルについてはOdfFileDomクラスのgetOrCreateAutomaticStyles()メソッドを呼び出すことで、content.xmlのoffice:automatic-styles要素の内容をOdfOfficeAutomaticStylesオブジェクトとして取得することができる。あるいは、OdfTextDocumentのgetStylesDom()メソッドを使ってstyles.xmlの内容をモデル化したDOMオブジェクトを取得し、これを利用してスタイル情報を操作する。

次のコードは、ワープロドキュメントに見出しとパラグラフ、リストを追加するプログラムの例である。

package jp.co.mycom.toolde;

import java.net.URI;
import org.odftoolkit.odfdom.OdfFileDom;
import org.odftoolkit.odfdom.doc.OdfTextDocument;
import org.odftoolkit.odfdom.doc.office.*;
import org.odftoolkit.odfdom.doc.style.*;
import org.odftoolkit.odfdom.doc.text.*;
import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;

public class CreateOdtDocument {
    public static void main(String[] args) {
        try {
            // ワープロ文書を作成
            OdfTextDocument odtDoc = OdfTextDocument.newTextDocument();
            odtDoc.addText("これはODFテキストドキュメントのサンプルです。");
            odtDoc.newParagraph();
            odtDoc.newImage(new URI("icon.gif"));

            // コンテンツのルートとDOMを取得
            OdfFileDom contentDom = odtDoc.getContentDom();
            OdfOfficeText officeText = odtDoc.getContentRoot();

            // スタイルの設定
            OdfOfficeAutomaticStyles contentAutoStyles = contentDom.getOrCreateAutomaticStyles();
            // リストのスタイル
            OdfTextListStyle listStyle = contentAutoStyles.newListStyle();
            listStyle.setStyleNameAttribute("MY_LIST_STYLE");
            // パラグラフのスタイル
            OdfStyle paraStyle = contentAutoStyles.newStyle(OdfStyleFamily.Paragraph);
            paraStyle.setStyleNameAttribute("MY_PARA_STYLE");
            paraStyle.setProperty(OdfStyleParagraphProperties.Border, "0.01cm solid #000000");
            paraStyle.setProperty(OdfStyleParagraphProperties.MarginLeft, "1cm");
            paraStyle.setProperty(OdfStyleParagraphProperties.MarginRight, "1cm");

            // コンテンツの作成
            // 見出し
            OdfTextHeading heading1 = new OdfTextHeading(contentDom);
            heading1.addContent("見出し");
            OdfTextHeading heading2 = new OdfTextHeading(contentDom);
            heading2.addContent("リストの例");
            // パラグラフ
            OdfTextParagraph paragraph = new OdfTextParagraph(contentDom,"MY_PARA_STYLE");
            paragraph.addContent("これはODFテキストドキュメントのサンプルです。");
            // リスト
            String[] itemList = {"アイテムA", ".アイテムA-1", "..アイテムA-1-1", ".アイテムA-2",
                "アイテムB", ".アイテムB-1", " アイテムC", ".アイテムC-1", ".アイテムC-2"};
            OdfTextList list = new OdfTextList(contentDom, itemList, '.', "MY_LIST_STYLE");

            // コンテンツの追加
            officeText.appendChild(heading1);
            officeText.appendChild(paragraph);
            officeText.appendChild(heading2);
            officeText.appendChild(list);

            // ファイルにセーブ
            odtDoc.save("sample.odt");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

ここではOdfOfficeAutomaticStylesオブジェクトに対して独自にリスト用とパラグラフ用のスタイルを追加している。スタイルを定義するためのクラスは、org.odftoolkit.odfdom.doc.styleパッケージにコンテンツ別に用意されている。OdfOfficeAutomaticStylesを使う場合、リスト用のスタイルはnewListStyle()メソッドで、その他のスタイルはnewStyle()メソッドにどのコンテンツ用のものかを指定することで作成できる。

コンテンツを操作するためのクラスはorg.odftoolkit.odfdom.doc以下の各パッケージ内に用意されている。たとえばテキストコンテンツの場合にはorg.odftoolkit.odfdom.doc.textに用意されたクラスを利用する。この例では見出しのためのOdfTextHeadingクラス、パラグラフのためのOdfTextParagraphクラス、リストのためのOdfTextListクラスを利用している。

最後に、ルートであるOdfOfficeTextオブジェクトに、子要素としてこれらのコンテンツを追加すればよい。このプログラムを実行すると、図2のようなワープロドキュメントが生成される。

図2 スタイルを利用したワープロドキュメントの例

さまざまなクラスが用意されているとはいえ、DOMに直接アクセスする感覚なので使用方法はやや複雑だ。現段階ではODFドキュメントの構造をある程度知らなければ簡単に使えるとは言い難いが、ODFを正しく扱えるという一点だけでも貴重なAPIと言える。