Apache FOP にさわる

作成 2002/10/19

ちょっと仕事で使いそうなので、下準備で調べてみることにしました。 XMLからPDFが出来ちゃうなんて驚きです。

Apache FOPとは?

Apache FOPとは?

FOPとは、XSL FOからPDF文書を作成するJavaライブラリです。

hello.fo →(FOP)→ hello.pdf

XMLとXSL(XSLT)でFOを作り、それをPDFに変換することも可能です (というかそっちが主流?)。

hello.xml + hello.xsl → (FOP) → hello.pdf

XSL FOとは?

W3Cで制定された、XMLで文書のスタイルを記述するための仕様で、 FOはFormatting Objectsの略です。

でもって、XSL FOはXSLのサブセット(一部)です。

XSL = XSLT + XSL FO

XMLから他のXML(XHMTLなど)を作る場合はXSLTを使います。 XMLからXSL FOを作る場合にもXSLTを使います。 でもって印刷可能なPDFなどの文書はこのXSL FOから生成できます。

XML → (XSLT) → XHTML

XML → (XSLT) → XSL FO → PDF

Xなんとかがいっぱいあってややこしいですね。 とりあえず、PDF(などの文書)を作れるだけのレイアウトを含む文書情報が FOに書かれていて、FOからPDFに変換するツールの1つがFOPってことです。

準備

ダウンロード

http://xml.apache.org/fop/

からFOPのアーカイブをダウンロードします。 現在(2002/10/19)の最新バージョンは、0.20.4です。 毎月新しくなってたのが、7月以降更新がないのは、 重要な部分の再設計を行っているかららしいです。

アーカイブを展開し、fop-0.20.4を 適当な場所に配置します。

コマンドラインから使ってみる

FO→PDF

簡単なFOファイルを作ります。 hello.foは1ページ目にHello FOPと表示するだけの簡単なFOです。

hello.fo

<?xml version="1.0" encoding="Shift_JIS"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple">
      <fo:region-body margin-top="3cm"/>
      <fo:region-before extent="3cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="simple">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="18pt" text-align="center">
        Hello FOP
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

</fo:root>

FOの書式はまだよくわかりませんが、とりあえず、

ということらしいです。

fop.batがFOPの実行スクリプトです。 作成したhello.foをfop.batと(簡単のため)同じディレクトリに置いて、実行。

C:\apps\fop-0.20.4>fop hello.fo hello.pdf
hello.pdfが出力されます。 Acrobat Readerなどで開いてみると、 それっぽいものが出来てますね。

XML + XSL →PDF

今度はXMLと(XMLをFOに変換する)XSLTを作って、 PDFに変換してみましょう。 XMLとXSLファイルを作ります。

hello.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<text>
  Hello FOP from XML
</text>

hello.xsl

<?xml version="1.0" encoding="Shift_JIS"?>

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  version="1.0">


<xsl:template match="text">

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple">
      <fo:region-body margin-top="3cm"/>
      <fo:region-before extent="3cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="simple">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="18pt" text-align="center">
    <xsl:value-of select="."/>
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

</fo:root>

</xsl:template>

</xsl:stylesheet>

作成した、hello.xmlとhello.xslをfop.batと同じディレクトリに置いて fopを実行します。

C:\apps\fop-0.20.4>fop -xsl hello.xsl -xml hello.xml -pdf hello.pdf
同じようにhello.pdfが出来ましたね。

Javaプログラムから使ってみる

今度はJavaプログラムからFOPを実行してみましょう(Javaプログラムに組み込み)。

準備として、クラスパスにbuildのfop.jarおよびlib以下の*.jarを通します。

FO → PDF

プログラムはこんな感じ。 FOはさきほどのhello.foをつかいまわします。
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.fop.apps.Driver;
import org.xml.sax.InputSource;

public class Fo2Pdf {

  public static void main(String[] args) throws Exception{

    InputSource foFile = new InputSource("hello.fo");
    OutputStream out = new FileOutputStream("hello.pdf");

    Driver driver = new Driver(foFile, out);
    driver.setRenderer(Driver.RENDER_PDF);
    driver.run();
  }
}
実行するとhello.pdfができました。

XML + XSL → PDF

似たようなもんです。プログラムはこんな感じです。

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.fop.apps.Driver;
import org.apache.fop.apps.XSLTInputHandler;

public class XML2Pdf {

  public static void main(String[] args) throws Exception{

    XSLTInputHandler input = new XSLTInputHandler(
            new File("hello.xml"), 
            new File("hello.xsl"));
    OutputStream out = new FileOutputStream("hello.pdf");

    Driver driver = new Driver();
    driver.setRenderer(Driver.RENDER_PDF);
    driver.setOutputStream(out);
    driver.render(input.getParser(), input.getInputSource());
  }
}

実行するとhello.pdfができました。

ちなみに上の2つのプログラムは、 fopのdocs/examples/embedding/FopServlet.java とほとんど同じ(というか一部)です。

今宵はここまで。。。

参考

Apache FOP

W3C XSL

XSLT実践ガイド

XML的リンク


次へ
TOP