FOPを入れよう

mzp2007-02-23

id:mzp:20070223:xmlの続き。最後に残ったXSL-FOフォーマッタ、FOPを入れよう。
XSL-FOは印刷用マークアップ言語。XMLからPDFやPostScriptに変換するときの中間言語として用いられる。

インストール

Apache(tm) FOP - a print formatter driven by XSL formatting objects (XSL-FO) and an output independent formatter.から最新版のソースコードをダウンロード。Java1.5のバイナリは用意されていなかったので、自分でビルドすることにした。

$ tar xvzf fop-0.93-src.tar.gz
$ cd fop-0.93
$ ls
KEYS                build.xml           forrest.properties  status.xml
LICENSE             conf/               hyph/               test/
NOTICE              examples/           known-issues.xml
README              fop                 lib/
build.properties    fop.bat             src/

$ ant

makeじゃなくて、antなのがポイント。antが入っていないなら、DarwinPortとかでいれる。

あとは、適当なディレクトリに移動してパスを通して終わり。

$ cd ..
$ sudo mv fop-0.93 /opt/manual/fop

使い方

ヘルプによると

Fop -xml foo.xml -xsl foo.xsl -pdf foo.pdf

という使い方ができるらしいので、XMLXSLTを用意してやる。

まずは、XML。前回のやつと同じ。

<?xml version="1.0" encoding="utf-8" ?>
<doc>
  <para>Hello World!!</para>
  <para>Second Line</para>
</doc>

そして、XSL-FO用のXSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output method="xml" encoding="utf-8" />

  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master
           master-name="the-only-page-type"
           page-height="4in" page-width="4in"
           margin-top="0.5in" margin-bottom="0.5in"
           margin-left="0.5in" margin-right="0.5in">
          <fo:region-body />
        </fo:simple-page-master>
      </fo:layout-master-set>
      <xsl:apply-templates />
    </fo:root>
  </xsl:template>

  <xsl:template match="doc">
    <fo:page-sequence master-reference="the-only-page-type">
      <fo:flow flow-name="xsl-region-body">
        <fo:block font-family="helvatica, sans-serif"
                  font-size="24pt"
                  text-align="center"
                  padding="0.25in">
          <xsl:apply-templates />
        </fo:block>
      </fo:flow>
    </fo:page-sequence>
  </xsl:template>

  <xsl:template match="para">
    <fo:block padding="0.25in" border="solid 1pt black">
      <xsl:apply-templates />
    </fo:block>
  </xsl:template>
</xsl:stylesheet>

そして、変換してやる。

$ fop -xml doc.xml -xsl fo.xsl -pdf foo.pdf