その時々

その時々で違うんです。特に決まっていないんです。

WindowsXP+Apache FOPでXMLからPDFを作成する

環境

WindowsXP
Apache FOP 1.0
Java SE Runtime (1.6.0_24)

概要

XMLからXSLTとXSL-FOを利用してPDFを作成します。
実際のところ、Hello World的な内容ですが導入まで結構苦労しました。
でも物にしたら結構色々できそうです。

苦戦したところ

Javaのランタイムやクラスがないとかでfopが動かなかったり
TTFReaderが動かなかったりしたこと。

Javaが混在する場合

環境変数
PATHにC:\Program Files\Java\jre6\binなどのbinフォルダを最初に挿入。
先頭の方から順番に読んでいくので、古いJavaRuntimeが入っていると
そっちが優先されてしまう。

その時に出るエラーメッセージ例

java.lang.UnsupportedClassVersionError: org/apache/fop/cli/Main (Unsupported major.minor version 48.0)
Classが見付からない場合

java -cpオプションでクラスサーチパスを指定するが、
jarファイルがあるところを指定することと
環境変数CLASSPATHが変なところ(例えば古いところ)を指定していないかをチェック
今回の場合は

java -cp build\fop.jar;lib\*

と指定

エラーが出るときのメッセージ例

java.lang.NoClassDefFoundError: org/apache/fop/fonts/apps/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>

2. フォントの設定用xml作成 コマンドプロンプトから

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属性を省いてよくなりました。
これでフォントの追加は簡単になります。