Apache FOPとは

Apache FOPは、XSL-FO文書からPDF文書を作成するためのJavaライブラリである。XSL-FO(XSL Formatting Objects)とはW3C勧告として公開されているXML文書の仕様であり、XSL(Extensible Stylesheet Language)によって組版を行うことを目的として開発された。XSL仕様では、XSL-FOのほかに、XML文書からXSL-FO文書を生成するためのXSLTおよびXPathも規定されている。したがって、Apache FOPを利用すればXSL-FO文書からPDF文書を生成するだけでなく、XSLTを使ってXML文書からPDF文書を生成することも可能である。

Apache FOPでは、XSL-FOファイルまたはXML+XSLTファイルからPDFファイルを生成するためのコマンドラインベースのプログラムが提供される。それだけでなく、Javaプログラムにおいて同様の変換を行うためのAPIも用意されている。したがってXML形式で保存されている情報を元に、Javaプログラムを利用してPDF文書を作成するといったケースでもApache FOPを利用することができる。

XSL-FOファイルからPDFファイルを生成する

Apache FOPは公式サイトのダウンロードページよりダウンロードすることができる。バイナリとソースコードが公開されているが、今回は最新版であるバージョン1.0のバイナリを利用する。ダウンロートしたファイル(zip形式またはtar+zip形式)を解答すると、fop-1.0ディレクトリの中に必要なファイルが展開される。Windowsの場合はfop.batまたはfop.cmdが、Apache FOPをコマンドプロンプトから利用するための実行ファイルになる。UNIXのシェル環境ではfopというファイル名でシェルスクリプトが用意されている。

まずはXSL-FO形式のファイルからPDF形式のファイルを生成してみよう。以下にXSL-FOファイル(これをfop-sample.foとする)の例を示す。

リスト1

<?xml version="1.0" encoding="UTF-8"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="A4-portrait"
               page-height="29.7cm" page-width="21.0cm" margin="2cm">
      <fo:region-body margin-top="1cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="A4-portrait">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="12pt" margin="0.5cm">
            Hello, Apache FOP!
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

これは1ページ目に「Hello Apache FOP!」と表示するだけの例である。XSL-FO文書では、<fo:root>がルート要素となり、<fo:layout-master-set>要素で文書全体のフォーマットを設定する。この例では、A4サイズのページに、前後左右のマージンが2cm、さらにbody領域の上部のマージンが1cmとなるように設定している。

この例では<fo:page-sequence>要素は1つしか記述していないが、複数の要素を持たせることも可能。<fo:flow>は印刷対象となるさまざまなコンテンツを含む要素であり、<fo:block>は文書の1つのブロックを表す要素である。したがってこの例は、A4の1ページ目に「Hello Apache FOP!」と表示するだけのXSL-FO文書ということになる。

※ XLS-FO仕様の詳細についてはW3Cのサイトを参照のこと。

このXSL-FOファイルからApache FOPを使ってfo-sample.pdfというPDFファイルを出力する場合、次のようなコマンドを実行すればよい。

プロンプト1

>fop fop-sample.fo fop-sample.pdf

生成されるPDFファイルは図1のようになる。

図1 Apache FOPを使ってXLS-FO文書を元に生成したPDF文書

日本語の使用方法

Apache FOPではデフォルトの設定のままでは日本語フォントを利用することができない。日本語フォントを使えるようにするためには、まずフォント情報を記述したxmlファイル(Font Metricsファイル)を生成する必要がある。Apache FOPにはTrue TypeフォントからFont Metricsファイルを生成するためのツールが用意されている。

まずは自身の環境で利用できるTrue Typeフォントを確認しよう。Windowsの場合にはC:\Windows\Fontsフォルダに.ttfや.ttcという拡張子のファイルが用意されている。これがTrue Typeフォントのファイルである。筆者の環境では「ipam.ttf」という名前でIPA明朝フォントが用意されているので、このフォントのFont Metricsファイルを作ってみる。MS明朝フォントの場合は「msmincho.ttf」などのファイルが用意されているはずだ。

Font Metricsファイルの生成は、build/fop.jarに含まれるorg.apache.fop.fonts.apps.TTFReaderというクラスを用いて行う。コマンドは、fop.jarおよびlib以下の各jarファイルをクラスパスに追加する形で、次のようになる。

プロンプト2

>java -cp build/fop.jar:lib/* org.apache.fop.fonts.apps.TTFReader -ttfname 'IPA Mincho' C:/WINDOWS/Fonts/ipam.ttf ipam.xml

-ttfnameではフォント名として「IPA Mincho」を指定している。このコマンドで、ipam.xmlというFont Metricsファイルが生成される。続いて、このフォントの設定をconf/fop.xconfファイルに追加する。fop.xconfにはフォントの設定例がコメントアウトで記述されているので、その付近に以下のような設定を追加すればよい。

リスト2

<font metrics-url="ipam.xml" kerning="yes" embed-url="C:\WINDOWS\Fonts\ipam.ttf">
  <font-triplet name="IPA Mincho" style="normal" weight="normal"/>
  <font-triplet name="IPA Mincho" style="normal" weight="bold"/>
  <font-triplet name="IPA Mincho" style="italic" weight="normal"/>
  <font-triplet name="IPA Mincho" style="italic" weight="bold"/>
</font>

以上で準備は完了だ。この「IPA Mincho」フォントを<fo:block>要素で使用する例を以下に示す。使用するフォント名はfont-family属性で指定する。ここではついでにcolor属性も利用して文字色も変更している。

リスト3

<fo:block font-size="14pt" color="red" margin="0.5cm" font-family="IPA Mincho">
  攻略! ツール・ド・プログラミング
</fo:block>
<fo:block font-size="12pt" margin="0.5cm"  font-family="IPA Mincho">
  この連載ではプログラミングを手助けするツールやライブラリ、フレームワーク、プラットフォームなどについて紹介しています。
</fo:block>

<fo:block>要素以外の部分は先ほどのfop-sample.foと同様でよい。これをfop-sample-ja.foとして保存し、PDFファイルを生成してみる。フォントの設定を有効にするためには、fopコマンドに-cオプションでconf/fop.xconfファイルを指定しなければならない。したがってコマンドは次のようになる。

プロンプト3

>fop -c conf/fop.xconf fop-sample-ja.fo fop-sample-ja.pdf

このコマンドで、fop-sample-ja.pdfというファイル名のPDF文書が生成される。中身は図2のようになっており、日本語が出力できていることがわかる。

図2 日本語を含むPDF文書を出力した例