WindowsXP+Apache FOPでXMLからPDFを作成する
概要
XMLからXSLTとXSL-FOを利用してPDFを作成します。
実際のところ、Hello World的な内容ですが導入まで結構苦労しました。
でも物にしたら結構色々できそうです。
苦戦したところ
Javaのランタイムやクラスがないとかでfopが動かなかったり
TTFReaderが動かなかったりしたこと。
SETUPからテストまで
それではFOPを導入していきたいと思います。
1. apache fop binaryをダウンロード
http://xmlgraphics.apache.org/fop/
2. c:\fop-1.0に解凍 (結構時間がかかります。)
3. Sample(fop-sample.fo)
<?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="25pt" margin="0.5cm"> Hello, Apache FOP! </fo:block> </fo:flow> </fo:page-sequence> </fo:root>
参考URL
http://journal.mycom.co.jp/column/tool/029/index.html
4. PDF作成
fop fop-sample.fo fop-sample.pdf
これでPDFが作成されました。
日本語フォントを使用
日本語フォントを使えるようにするには一苦労あります。
1. fop-1.0フォルダ内でSampleを作成
Sample (fop-sample-ja.fo)
<?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="14pt" color="red" margin="0.5cm" font-family="MS Gothic"> 攻略! XSL-FO </fo:block> <fo:block font-size="12pt" margin="0.5cm" font-family="MS Gothic"> Apache FOPを使って日本語PDFを作る! </fo:block> </fo:flow> </fo:page-sequence> </fo:root>
java -cp build\fop.jar;lib\* org.apache.fop.fonts.apps.TTFReader -ttcname "MS Gothic" C:\WINDOWS\Fonts\msgothic.ttc msgothic.xml
3. conf/fop.xconfに設定追加
<font metrics-url="c:\fop-1.0\msgothic.xml" kerning="yes" embed-url="C:\WINDOWS\Fonts\msgothic.ttc"> <font-triplet name="MS Gothic" style="normal" weight="normal"/> <font-triplet name="MS Gothic" style="normal" weight="bold"/> <font-triplet name="MS Gothic" style="italic" weight="normal"/> <font-triplet name="MS Gothic" style="italic" weight="bold"/> </font> </fonts>
4. PDF作成 フォントの設定を反映させるには-cオプションでconf/fop.xconfを指定
fop -c conf/fop.xconf fop-sample-ja.fo fop-sample-ja.pdf
xmlファイルとxsltを利用してPDFを作成
それではいよいよ本題です。
1. Sample XML (fop-sample-ja2.xml)
<?xml version="1.0" encoding="utf-8"?> <column> <title> 攻略! XSL-FO </title> <abstract> 今度はXMLファイルからXSLTを利用してXSL-FOからPDFを作成します。 </abstract> </column>
2. Sample XSL (xml2fo-sample.xsl)
<?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" indent="yes"/> <xsl:template match="/column"> <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="14pt" color="red" margin="0.5cm" font-family="MS Gothic"> <xsl:value-of select="title"/> </fo:block> <fo:block font-size="12pt" margin="0.5cm" font-family="MS Gothic"> <xsl:value-of select="abstract"/> </fo:block> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> </xsl:stylesheet>
3. PDFを作成
fop -c conf/fop.xconf -xml fop-sample-ja2.xml -xsl xml2fo-sample.xsl pdf-from-xml.pdf
2011.5.5追記
FOP0.94からフォントの追加はメトリクスファイルが必要なくなっていました。
ということでjava -cpでTTFReaderを使用するところを省き、
font.xconfのmetrics-url属性を省いてよくなりました。
これでフォントの追加は簡単になります。