ホーム  > X-plus >  XML & 開発

この記事を送る はてなブックマークに追加する
テキストリンクコードを取得する

Apache FOP実装の詳細~XSL-FOからFOツリーを作成し、Knuth要素を生成する~

2009年12月03日作成 

今回は、いよいよApache-FOPの実装詳細についてご説明しましょう!大まかな流れは以下のような感じです。


  1.  1.FOツリーの生成
  2.  2.Knuth要素の生成
  3.  3.表のKnuth要素の生成
  4.  4.行分割
  5.  5.ページ分割
  6.  6.レイアウト
  7.  7.レンダリング

では、早速詳細内容を説明しましょう。
しかし。。。。連載と言いつつ、間隔が空きすぎていて申し訳ありませんです。。


1.FOツリーの生成


FOツリーの生成は、Javaのjava.xml.transformパッケージの機能を使ってFOドキュメントを読み込むことにより行われています。 SAX(Simple API for XML)の仕組みによって、要素ごとにHandlerに対しイベントが発生し、それに応じてFOノードの生成が行われるようになっています。 (やはりDOMでは、メモリ食いすぎるんでしょうねぇ)

以下に、シーケンス詳細を図示します。

FOツリーの生成

2.Knuth要素の生成

Knuth要素(Box、Glue、Penalty)の生成はFOTextノードごとに行われます。生成に必要なレイアウト情報はLayoutContextというものを通して渡されます。

処理の大まかな流れは、

  1. 1. FOTextから一文字ずつ取得し、区切り位置を検出する。
  2. 2. 単語や音節、スペースの終わり等が検出された場合、それぞれの処理に分岐する。
  3. 3. 単語や音節の場合、フォント情報から文字列幅やカーニング値を取得し、Box要素を生成してシーケンスに追加する。
  4. 4. スペースの場合、幅や伸縮値を取得し、Glue要素およびPenalty要素を生成して、シーケンスに追加する。

というものになっています。

残念ながら、日本語組版独自の処理については、Apache FOPでは考慮されていません。(海外製なので仕方ないのですが、、、)

番外:Knuth要素の生成~日本語の処理を考えてみる~

と、いうことで、やや本題からそれますが、日本語組版の処理に関して考えてみます。

禁則処理などについては、この部分を調整することで実現できでしょう。たとえば、「っ」が禁則文字として指定されており、「かった」という文字列があったとすると

   
Box Penalty
(penalty: +infinity)
Box Penalty
(penalty: 0)
Box

のようにKnuth要素を生成すると、禁則処理が実現できる(と思います^^;)。 最初のPenalty要素のpenalty値が+infinityであるので、アルゴリズムは分割不可能な場所と見せるからです。

以下に、シーケンス詳細を図示します。

FOツリーの生成

続きはまた次回に・・・

天野さんのCMマタギ手法を使います、、(笑)。続きはまた次回!

事業推進 事業企画担当 遊撃手 吉田晃伸



この記事と関連の高い記事

関連キーワード:Apache


関連キーワード:Apache FOP


関連キーワード:Knuth


関連キーワード:XML


関連キーワード:XSL-FO


関連キーワード:遊撃手




ページトップへ戻る