作成 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 とほとんど同じ(というか一部)です。
今宵はここまで。。。