XMLサーバ/Cocoon自由自在!
最終回 XML文書からPDFファイルを生成する


いままでCocoonを使って、XML文書をWebブラウザ用やPalm用など、さまざまなスタイルに変換してきた。Cocoonには、XML文書をPDFに変換するモジュールも用意されている。最終回ではXML文書を印刷出力としても美しく出力できるよう、PDFファイルとして出力する方法を紹介する。

太田一郎
ティアイエス株式会社
2002/2/27

PDFモジュールをCocoonに組み込む

 Cocoonの応用編ということで、前回「XML文書をiモードとPalmに対応させる」ではスタイルシートの切り替えに挑戦しました。今回はその続きということで、Cocoonに組み込まれているFOP(Formatting Object Processor)を用い、XML文書をPDFファイルに変換してみます。

XSL-FOとFOP

 画面や印刷物のレイアウトを行うためのタグセットとして、XSL-FOがあります。FOPとは、このXSL-FOによって記述されたページレイアウトを、PDFの形式でレンダリングするためのソフトウェアです。Cocoonと一緒に配布されていることからも分かるように、FOPもThe Apache XML Projectにより開発が行われているソフトウェアの1つです。

 FOPは独立したソフトウェアとしても機能しますが、Cocoonと連携させることも可能です。XML文書にスタイルシートを適用してXSL-FOに変換し、さらにその出力をPDFに変換します。今回はこのCocoonとの連携の実例を取り上げたいと思います。

 では早速実例を……と進めたいところなのですが、今回はまずFOPで日本語を出せるようにするところから始める必要があります。FOPの最新版は2002年2月現在、0.20.2です。このバージョンでは少し手間が必要ですが、日本語のフォントも問題なく扱えるようになっています。

 しかし残念なことに、Cocoon 1.7.4にバンドルされているバージョンのFOPは最新のものではないため、日本語をうまく取り扱うことができません(下記コラム参照)。

 そこで今回は、横浜ベイキットによって日本語化されたCocoon 1.8.2 + FOP 0.20.2を用いることにしましょう。

【コラム 〜 バージョンをめぐる問題】
 Cocoon 1.7.4にバンドルされているFOPでは日本語がうまく取り扱えない、と書きました。これはCocoon 1.8.2でも同様です。困ったことに、バンドルされているFOPを単純に新しいものと置き換えるだけでは動作しません。

 新しいFOPをバンドルしたCocoonのディストリビューションがなぜないのでしょう?

 いや実はあるのです。ただしそれはCocoon 2と呼ばれるまったく新しいバージョンになってしまうのです。Cocoon 2はパイプライン処理に基づく新しいアーキテクチャを採用した、どちらかというとまったく別のソフトウェアです。

 使い方もかなり変わるため、単純に「じゃ、Cocoon 2を使えばいいや」というわけにはいきません。用途によってはCocoon 1の方が使いやすいというケースも考えられます。そのような場合は、この記事で紹介しているように、横浜ベイキット版のCocoonを使うとよいでしょう。

CocoonとFOPの差し替え

 それではCocoonとFOPを、横浜ベイキット版に差し替えましょう。横浜ベイキットのサイトから最新のBXSのアーカイブをダウンロードしてください。ここでは2002年2月現在の最新版である1.0.21を用います。

 アーカイブをどこか適当な場所に展開します。以下ではその展開したディレクトリのパスを${BXS_HOME}と記述しますので、適宜読み替えてください。また、いままでCocoonを展開していたディレクトリのパスを${COCOON_HOME}、tomcatを展開していたディレクトリのパスを${TOMCAT_HOME}と記述することにします。こちらについても適宜読み替えるようにしてください。

(1)ライブラリの差し替え

 ${COCOON_HOME}/samples/WEB-INF/libにあるライブラリをすべて差し替えます。まず、拡張子がjarのファイルをすべて削除してください。削除した後に、以下のファイルをコピーします。

${BXS_HOME}/lib/batk.jar
${BXS_HOME}/lib/fop-0.20.1-jp.jar
${BXS_HOME}/lib/bxi.jar
${BXS_HOME}/bin/lib/xerces.jar

 さらに、${BXS_HOME}/webapps/cocoon/WEB-INF/lib以下にある拡張子jarのファイルもすべてコピーしてください。

(2)cocoon.propertiesの更新

 Cocoonの設定ファイルであるcocoon.propertiesも更新が必要です。これもBXSに含まれている以下のファイルをそのまま利用します。

${BXS_HOME}/webapps/cocoon/cocoon.properties

 これで、${COCOON_HOME}/samples/WEB-INF下にあるものを差し替えてください。

(3)JAXPの更新

 以上でCocoonのセットアップはほぼ完了ですが、困ったことにこのままだとtomcatがうまく動作しません。tomcatはXMLパーサとしてJAXP 1.0を利用していますが、これがCocoon 1.8.2に含まれるxerces.jarと相性が悪いのです。

 そこで、tomcatが用いるXMLパーサをJAXP 1.1に更新してやることにします。まず、米サン・マイクロシステムズのJAVA TECHNOLOGY & XML Downloads & SpecificationsからJava XML PACK Fall 01 Releaseをダウンロードします(実際には上記ページは最新版のJava XML Pack Winter 01に変わってしまっていますので、このJava XML Packのページの一番下にあるJava XML PACK Fall 01をダウンロードして使ってください)。

 次に、${TOMCAT_HOME}/libにあるJAXP 1.0のバイナリを削除します。

${TOMCAT_HOME}/lib/jaxp.jar
${TOMCAT_HOME}/lib/parser.jar

 削除した後、ダウンロードしたアーカイブに含まれる以下のバイナリを${TOMCAT_HOME}/libにコピーします。

jaxp-1.1.3/crimson.jar
jaxp-1.1.3/xalan.jar

 これでだいたい準備は完了です。

日本語環境のセットアップ

 FOP 0.20.2は日本語フォントも問題なく取り扱うことができる、と書きました。ただし、使用するフォントのメトリクス情報をあらかじめ定義ファイルの形で準備し、FOPに読み込ませる必要があります。この作業はまじめにやると結構手間がかかります。そこで今回はBXSに添付されている、横浜ベイキット製のfonttoolを利用して簡単に作成してみます。

 なお、日本語を利用するに当たり、日本語のTrueTypeフォントが必要です。使用しているマシンに、日本語TrueTypeフォントがインストールされていることを確認してください。

 まず、コマンドプロンプトもしくはシェルを開いて、${BXS}/binに移動してください。そのうえで、以下のようにfonttoolを起動します。

fonttool フォント格納ディレクトリ 定義ファイルの出力ディレクトリ

 例えば、Windows2000の環境ならば、c:\winnt\fontsにフォントが格納されていることでしょう。このフォントを利用するための定義ファイルを${COCOON_HOME}/samples/WEB-INFに出力するとした場合は、以下のようになります。

fonttool c:\winnt\fonts ${COCOON_HOME}/samples/WEB-INF

 ${COCOON_HOME}はそのまま入力せず、適宜実際のパスに置き換えてください。

 fonttoolがエラーなく処理を終えれば、指定したディレクトリの下に定義ファイル群が作成されているはずです。フォントごとに“フォントファイル名.xml”という定義ファイルが作成され、さらにuserconfig-ja.xmlという定義ファイルが作成されているはずです。

注:これらのファイルには絶対パスの情報が含まれているため、生成後はファイルを移動させてはいけません。

 作成したフォント情報をFOPに読み込ませるには、以下のJavaプロパティにuserconfig-ja.xmlへのフルパスを設定します。

org.apache.fop.apps.config

 tomcatの起動スクリプトは、環境変数TOMCAT_OPTSに含まれている文字列をjava起動時のオプションとして追加してくれます。ですから、tomcatの起動スクリプトを実行する前に、以下のように環境変数を設定すればよいでしょう(下記はWindows 2000での設定例)。

set TOMCAT_OPTS=-Dorg.apache.fop.apps.config=${COCOON_HOME}\samples\
WEB-UNF\userconfig-ja.xml

 繰り返しになりますが、${COCOON_HOME}は実際のパスに置き換えてください。毎回設定するのが面倒なら、tomcatの起動スクリプト${TOMCAT_HOME}/bin/tomcat.shもしくはtomcat.batに直接書き加えてしまうのもよいでしょう。

 今度こそ準備は完了です。

  XMLからPDFを出力してみよう

Index
XMLサーバ/Cocoon自由自在!
最終回 XML文書からPDFファイルを生成する
PDFモジュールをCocoonに組み込む
  XMLからPDFを出力してみよう

「XMLサーバ/Cocoon自由自在!」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間