Entry

FOP を使ってみる(その2)

2005年03月22日

FOP をガリガリやっていたところ,OOo の SDK(UNO というらしい)から PDF を作れるなんて話を聞いてしまって,この話題はちょっと萎え気味だったりします……。OOo は XML 一般を扱えるわけじゃないから,本来は上手く使い分けるもんなんでしょうけどね。

ともあれ,前回は,org.apache.fop.fonts.apps.TTFReader でフォントメトリックファイルを作るというところまでやったのでした。これは FOP が用意していないフォントを登録するのに必要な作業ですから,デフォルトのフォントで事足りるようなら,不要な作業だったりします。デフォルトでは日本語フォントが使えないので,大部分の日本人は必要な作業ですね。

ここからやることは,

  • userconfig.xml を編集して XSL-FO の font-family を登録する
  • XSL-FO を書く
  • FOP を実行する

という手筈になります。2番目の「XSL-FO を書く」というのは,本来 XSLT に任せることですけれど,ここでは手書きでやってみます。

フォントメトリックファイルの続き

本題に入る前に,前回作ったフォントメトリックファイルを紹介しておきます。ここでは Windows XP に付いてきたフォントのうち,よく使うものを選んでみました。以下に置いておきます。Windows のフォントはバージョン毎に少しずつ中身が違うようなので,ファイル名が同じでも,別のバージョンのフォントだと使えないかもしれません。

下が内容物……順番に,フォントファイル名とメトリックファイル,[] は,ここで使う XSL-FO の font-family 名です。

  • msgothic.ttc
    • msgothic.xml [Gothic]
    • mspgothic.xml [PGothic]
    • msuigothic.xml [UIGothic]
  • msmincho.ttc
    • msmincho.xml [Mincho]
    • mspmincho.xml [PMincho]
  • arial.ttf
    • arial.xml [Arial]
  • arialbd.ttf
    • arialbd.xml [Arial]
  • ariali.ttf
    • ariali.xml [Arial]
  • arialbi.ttf
    • arialbi.xml [Arial]
  • verdana.ttf
    • verdana.xml [Verdana]
  • verdanab.ttf
    • verdanab.xml [Verdana]
  • verdanai.ttf
    • verdanai.xml [Verdana]
  • verdanaz.ttf
    • verdanaz.xml [Verdana]

欧文フォントは,字体毎にファイルが分割されているけれど,ここでは「同じフォント名の別の字体」という形で登録します(だから [] 内は同じ名前になっている)。

userconfig.xml を書く

メトリックファイルができたら,userconfig.xml を書きます。このファイルは,FreeBSD の Ports からインストールすると,${PREFIX}/share/fop/conf 以下にあるはずです。このディレクトリには,config.xml と userconfig.xml という2つのファイルがあるけれど,ユーザが編集できるのは,userconfig.xml の方です。

書き方は,ファイルに丁寧なコメントがあるから,それを見てもらうのが一番だと思います。うちでは,次のように編集してみました。フォントファイルを /usr/X11R6/lib/X11/fonts/truetype 以下,メトリックファイルを /usr/X11R6/lib/X11/fonts/fop-xml 以下にそれぞれ置いていることにします。

<!--<!DOCTYPE configuration SYSTEM "config.dtd">-->
<!-- 
     this file contains templates which allow an user easy 
     configuration of Fop. Actually normally you don't need this configuration 
     file, but if you need to change configuration, you should
     always use this file and *not* config.xml. 
     Usage: java org.apache.fop.apps.Fop -c userconfig.xml -fo fo-file -pdf pdf-file
-->
<configuration>

<!-- baseDir -->
<entry>
  <key>baseDir</key>
  <value>/usr/X11R6/lib/X11/fonts</value>
</entry>

<!--  fontBaseDir -->
<entry>
  <key>fontBaseDir</key>
  <value>/usr/X11R6/lib/X11/fonts</value>
</entry>

<!--
************************************************************************
                        HYPHENATION 
************************************************************************
-->
  
<!-- hyphenation directory -->
<entry>
  <key>hyphenation-dir</key>
  <value>/usr/local/share/fop/hyph</value>
</entry>

<!--
************************************************************************
  Add fonts here
************************************************************************
-->
<fonts>
  <!-- Arial -->
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/arial.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/arial.ttf">
    <font-triplet name="Arial" style="normal" weight="normal"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/arialbd.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/arialbd.ttf">
    <font-triplet name="Arial" style="normal" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/ariali.xml"
      kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/ariali.ttf">
    <font-triplet name="Arial" style="italic" weight="normal"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/arialbi.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/arialbi.ttf">
    <font-triplet name="Arial" style="italic" weight="bold"/>
  </font>
  <!-- Verdana -->
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/verdana.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/verdana.ttf">
    <font-triplet name="Verdana" style="normal" weight="normal"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/verdanab.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/verdanab.ttf">
    <font-triplet name="Verdana" style="normal" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/verdanai.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/verdanai.ttf">
    <font-triplet name="Verdana" style="italic" weight="normal"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/verdanaz.xml"
     kerning="yes" embed-file="/usr/X11R6/lib/X11/fonts/truetype/verdanaz.ttf">
    <font-triplet name="Verdana" style="italic" weight="bold"/>
  </font>
  <!-- MS Gothic -->
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/msgothic.xml"
     embed-file="/usr/X11R6/lib/X11/fonts/truetype/msgothic.ttc" kerning="yes">
    <font-triplet name="Gothic" style="normal" weight="normal"/>
    <font-triplet name="Gothic" style="normal" weight="bold"/>
    <font-triplet name="Gothic" style="italic" weight="normal"/>
    <font-triplet name="Gothic" style="italic" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/mspgothic.xml"
     embed-file="/usr/X11R6/lib/X11/fonts/truetype/msgothic.ttc" kerning="yes">
    <font-triplet name="PGothic" style="normal" weight="normal"/>
    <font-triplet name="PGothic" style="normal" weight="bold"/>
    <font-triplet name="PGothic" style="italic" weight="normal"/>
    <font-triplet name="PGothic" style="italic" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/msuigothic.xml"
     embed-file="/usr/X11R6/lib/X11/fonts/truetype/msgothic.ttc" kerning="yes">
    <font-triplet name="UIGothic" style="normal" weight="normal"/>
    <font-triplet name="UIGothic" style="normal" weight="bold"/>
    <font-triplet name="UIGothic" style="italic" weight="normal"/>
    <font-triplet name="UIGothic" style="italic" weight="bold"/>
  </font>
 <!-- MS Mincho -->
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/msmincho.xml"
     embed-file="/usr/X11R6/lib/X11/fonts/truetype/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>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/fop-xml/mspmincho.xml"
     embed-file="/usr/X11R6/lib/X11/fonts/truetype/msmincho.ttc" kerning="yes">
    <font-triplet name="PMincho" style="normal" weight="normal"/>
    <font-triplet name="PMincho" style="normal" weight="bold"/>
    <font-triplet name="PMincho" style="italic" weight="normal"/>
    <font-triplet name="PMincho" style="italic" weight="bold"/>
  </font>
</fonts>

</configuration>

一応 baseDir や fontBaseDir なんかも設定したけれど,うまく動かなかったので,フルパスで書いています。我ながら,ゴチャゴチャしてますね……。上のようにして,XSL-FO の font-family と実際のフォントファイル,それにフォントメトリックファイルとを関連付けていくわけです。地味な単純作業で,ここが一番しんどいと思います……。

XSL-FO を用意する

さて……これでFOP を使う準備はできました。後は,XSL-FO を作って変換するだけですね。XSL-FO の文法自体は,CSS と HTML を足して2で割ったようなもので,比較的簡単に書けます。日本語の解説が少ないところが,ちょっと難ですね……。詳しい解説は,以下を参照してみてください。

うちでは,次のような XSL-FO ファイルを作ってみました。

<?xml version="1.0" encoding="EUC-JP"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="ja">

  <fo:layout-master-set>
    <fo:simple-page-master
                    master-name="test"
                    page-height="297mm"
                    page-width="210mm"
                    margin-left="20mm"
                    margin-right="20mm"
                    margin-top="20mm"
                    margin-bottom="30mm">
      <fo:region-body
                    margin-top="5mm"
                    margin-bottom="5mm"/>
      <fo:region-before extent="1cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="test">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-family="Arial" font-weight="bold">
        Hello world. This is Arial Bold.
      </fo:block>
      <fo:block font-family="Verdana" font-weight="bold">
        This is Verdana Bold.
      </fo:block>
      <fo:block font-family="PGothic">
        (PGothic)FOP で XSL-FO 文書を処理させてみました。一応こんな感じで日本語も処理できます。昔は連続する文字列を入力すると,block を突き抜けてしまったけれど,20.5 はちゃんと折り返るみたいです。ちゃんと折り返るようにするには,fo:root の language 属性に "ja" をセットしておきましょう。
      </fo:block>
      <fo:block font-family="PMincho">
        (PMincho)ただ,見ても分かるとおり,禁則がヘタレなんですよね……。これはどうにかならないんでしょうか……。どうも,この問題, FOP では解決していないみたいです。巷では XSLT で前もって処理しておく方法が紹介されているけれど,根本的な解決にはなっていませんよね……。
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

</fo:root>

使っているエンコーディングに合わせて,XML 宣言の encoding 属性をセットしておきましょう。ルート要素である fo:root の language 属性を ”ja” にしておくのもお忘れなく。

FOP を実行する

やれやれ……やっと実行する用意ができました。最後に FOP を実行して PDF ファイルを作ってみましょう。Ports からインストールしている場合は,${PREFIX}/bin/fop が用意されます。-c オプションで,userconfig.xml の場所を教えてあげましょう。

上のソースを fop-test.fo とすると,以下のようにして実行できるはずです。

% fop -c userconfig.xml -fo fop-test.fo -pdf fop-test.pdf
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] FOP 0.20.5
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] building formatting object tree
[INFO] setting up fonts
[INFO] [1]
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] Parsing of document complete, stopping renderer

できた PDF ファイルが fop-test.pdf です……。禁則が……。まだ,禁則は上手く処理できないみたいですね。ここまで苦労したのにガックシです……。

最後に……

FOP の PDF 出力は,日本語の場合イマヒトツ……というか,イマミッツくらいですね……。大量にXML ファイルを持っているなんて場合じゃない限り,まだ一般的な使い道には向いていないように思います。改行にこだわらない文書(帳票等)に限られるといったところでしょうか。

ちなみに,FOP は PDF に限らずテキスト形式や SVG といった出力にも対応していたりします。禁則の難は,同じなんでしょうけど,各種フォーマットに対応していることは,将来的に期待できそうです。日本語対応が進めば,便利になることは間違いないんですけどね……あたしとしては,もう少し様子見です。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN