Apache FOPで、日本語をボールド出力する

こんにちは、松本です。

FOPで、MS明朝などの日本語フォントを使用した場合、font-weight に bold を指定しても太字で出力できません。

そこで、文字列を重ねて出力することで、太字を実現してみました。

フォントに Arial を指定した場合、

<fo:block font-family=”Arial”>
  ABC123
</fo:block>
<fo:block font-family=”Arial” font-weight=”bold”>
  ABC123
</fo:block>

太字は正常に出力されます。

20091001164618-00131

しかし、フォントにMS明朝を指定した場合、

<fo:block font-family=”Mincho”>
  あいうABC123
</fo:block>
<fo:block font-family=”Mincho” font-weight=”bold”>
  あいうABC123
</fo:block>

太字の指定は無視されて出力します。

20091001165156-00132

そこで、次のような template を作成します。

これは、count に指定した回数だけX位置を 0.1 ポイント調整しながら同じ文字列を出力するテンプレートです。

<xsl:template name=”bold-japanese”>
  <xsl:param name=”value”/>
  <xsl:param name=”count”/>
  <xsl:value-of select=”$value”/>
  <fo:block-container absolute-position=”absolute”
    left=”0.1″ right=”0.1″>
    <fo:block start-indent=”0″>
      <xsl:if test=”number($count) > 1″>
        <xsl:call-template name=”bold-japanese”>
          <xsl:with-param name=”value” select=”$value”/>
          <xsl:with-param name=”count” select=”number($count) – 1″/>
        </xsl:call-template>
      </xsl:if>
    </fo:block>
  </fo:block-container>
</xsl:template>

block-container の部分が、位置を調整して重ね書きするロジックです。

このテンプレートを以下のように呼び出すと、

<fo:block font-family=”Mincho”>
  あいうABC123
</fo:block>
<fo:block font-family=”Mincho”>
  <xsl:call-template name=”bold-japanese”>
    <xsl:with-param name=”value”>
      あいうABC123
    </xsl:with-param>
    <xsl:with-param name=”count” select=”5″/>
  </xsl:call-template>
</fo:block>

 太字のように出力します。

20091001171457-00133

ここでは、「日本語が使える」前提で書いています。日本語フォントを使用する方法は、他のページを探してください、たくさんヒットすると思います。

コメントを残す

メールアドレスが公開されることはありません。