作成 2002/10/21
FOPではデフォルトで数種類のフォントが用意されています。 デフォルトのフォント以外のフォントを使いたい(FOPに追加したい)場合、 例えば日本語のMS明朝が使いたいとかいう場合は、 ちょっとした環境設定が必要になります。
環境設定の手順はこんな感じです。
font metricsファイルというのは、Font情報を記述したxmlファイルです。 作成するには、org.apache.fop.fonts.appsパッケージのツールを使います。
FOPに追加できるフォントはType1フォントとTrue Typeフォントです。
(Type1とTrue Typeってよく知りませんが、
http://www.net.intap.or.jp/oiia/cont1/p0302.html%7B0recid=10367.html
によると、世界標準の2大アウトラインフォントらしい)
ここではWindowsに標準で付いてるTrue Typeフォントを例に話を進めます。 MS明朝をFOPに組み込んでみましょう。
True Typeフォントは、うちの環境(Windows XP)の場合、 C:\WINDOWS\Fonts に入ってます。 .ttf、.ttcという拡張子のファイルがたくさん入っています。 ttfがTrue Type Fontで、 ttcの方はTrue Type FontのCollection(複数入ったもの)ではないかと思われます(たぶん)。
コマンドラインで、org.apache.fop.fonts.apps.TTFReaderを使って、 True Typeのコレクションファイルmsmincho.ttcから font metricsファイルmsmincho.xml を作ってみましょう。
C:\apps\fop-0.20.4>java -cp build/fop.jar;lib/xerces.jar;lib/xalan.jar;lib/batik.jar org.apache.fop.fonts.apps.TTFReader -ttcname "MS Mincho" C:/WINDOWS/Fonts/msmincho.ttc msmincho.xml(実際は一行)
confディレクトリのuserconfig.xmlを編集します。
以下のような記述をします。デフォルトのuserconfig.xmlに 日本語フォント記述のサンプルがあるので、それをコピーして 書き換えればいいかなと思います。
<font metrics-file="msmincho.xml" embed-file="C:\windows\fonts\msmincho.ttc" kerning="yes"> <font-triplet name="Mincho" style="normal" weight="normal"/> <font-triplet name="Mincho" style="normal" weight="bold"/> <font-triplet name="Mincho" style="italic" weight="normal"/> <font-triplet name="Mincho" style="italic" weight="bold"/> </font>
日本語フォントを使ったfoを用意しましょう。
jp.fo(hello.foの以下だけ編集)
<fo:block font-size="18pt" text-align="center" font-family="Mincho"> はろーFOP </fo:block>
FOPを実行します。 このとき、-cオプションでuserconfig.xmlを指定します。
C:\apps\fop-0.20.4>fop -c conf/userconfig.xml jp.fo jp.pdf
日本語もちゃんと出てますね〜。
ちなみに、このあたりの基本的な情報は、FOPドキュメントのfontsのところに書いてます。
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import org.apache.fop.apps.Driver; import org.apache.fop.apps.Options; import org.xml.sax.InputSource; public class JpFont { public static void main(String[] args) throws Exception{ InputSource foFile = new InputSource("jp.fo"); OutputStream out = new FileOutputStream("jp.pdf"); //これだけでstaticなコンフィグ設定になるらしい File userConfigFile = new File("userconfig.xml"); Options options = new Options(userConfigFile); Driver driver = new Driver(foFile, out); driver.setRenderer(Driver.RENDER_PDF); driver.run(); } }
組み込みの場合、userconfig.xmlの
metrics-fileの指定をフルパスで指定しないとうまく動きませんでした。
このあたりはまだちょっと不安定なとこかも。。。
プリンタに印刷してみる
FOから作成したPDFをプログラム上から印刷したい場合があります。 そんなことできるのかなぁと思っていたら、サンプルありました。 これです。
docs/examples/embedding/PrintServlet.java
Java Print APIを通して印刷しているようです。
サーブレットコードをアプリケーションに直して 試してみたら、プリンタにウィーンと印刷されました。 あまりにもサンプルそのままなので、ソースはここに書きませんが、 動くことは確認しました。