FOP やり直し HTML to PDF, Groovy を使用 date:2011-08-25

JGGUG の もくもくGroovy に参加したときの成果のまとめ。

HTMLからFO を生成して、FOP経由してPDFを作成するところまでやってみた。

以前の関連エントリ

xsltproc, fop コマンドのインストール

Ubuntu 11.04 では apt-get でインストール可能。


$ sudo apt-get install xsltproc
$ sudo apt-get install fop

DWからサンプルデータを入手

{link:http://www.ibm.com/developerworks/jp/xml/library/x-xslfo2app/} にHTMLからFOを生成してPDFにする説明があるのでこの記事を参考にしてみる。

そのページから入手できるサンプル x-xslfo2app-samples.zip を展開して...以下の内容の makefile を実行する.

makefile


result.pdf : tmp.fo
	groovy topdf.groovy $< $@

tmp.fo :
	xsltproc xhtml-to-xslfo.xsl everything.html > $@

topdf.groovyは後述

fo を PDF に変換するコード topdf.groovy

Apache FOP を使用して fo を PDF に変換します。(Apache FOPで配布されている exampleコードを Groovy に直したもの)

gist. 1170468

そのままではエラーになる


Caught: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: For "fo:simple-page-master", "fo:region-body" must be declared before "fo:region-before"! 

と言われるので、手作業で fo:simple-page-master, fo:region-body を fo:region-before の前に移動する 以下のように...


	<fo:region-body margin-top="50pt" margin-bottom="50pt"/>
	<fo:region-before region-name="rb-left" extent="25pt"/>
	<fo:region-after region-name="ra-left" extent="25pt"/>

これで groovy topdf.groovy tmp.fo result.pdf が通るようになります。

毎回手作業で fo を直すのではなく、変換のスタイルシート自体を書き換える

https://gist.github.com/1170543 から xsl.patch を入手して、xhtml-to-xslfo.xsl のあるディレクトリ内でpatchを当てます。


$ patch < xsl.patch

自分で用意したHTMLをPDFに変換してみる


<html>
	<body>
		<h1>Hello World!</h1>
		<p>This is a convert test from html to pdf.</p>
		<p>これは変換テストです。HTMLをPDFに変換します。</p>
	</body>
</html>

結果

日本語はフォントの設定をしないと通らないようです。
たぶん、この方の記事を読めばわかるはず... {link:http://d.hatena.ne.jp/harvester/20091006/p1}