作成 2002/10/19
ちょっと仕事で使いそうなので、下準備で調べてみることにしました。 XMLからPDFが出来ちゃうなんて驚きです。
FOPとは、XSL FOからPDF文書を作成するJavaライブラリです。
hello.fo →(FOP)→ hello.pdf
XMLとXSL(XSLT)でFOを作り、それをPDFに変換することも可能です (というかそっちが主流?)。
hello.xml + hello.xsl → (FOP) → hello.pdf
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ってことです。
準備
からFOPのアーカイブをダウンロードします。 現在(2002/10/19)の最新バージョンは、0.20.4です。 毎月新しくなってたのが、7月以降更新がないのは、 重要な部分の再設計を行っているかららしいです。
アーカイブを展開し、fop-0.20.4を
適当な場所に配置します。
コマンドラインから使ってみる
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.pdfhello.pdfが出力されます。 Acrobat Readerなどで開いてみると、 それっぽいものが出来てますね。
今度は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プログラムからFOPを実行してみましょう(Javaプログラムに組み込み)。
準備として、クラスパスにbuildのfop.jarおよびlib以下の*.jarを通します。
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ができました。
似たようなもんです。プログラムはこんな感じです。
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 とほとんど同じ(というか一部)です。
今宵はここまで。。。