こんにちは、松本です。
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>
太字は正常に出力されます。
しかし、フォントにMS明朝を指定した場合、
<fo:block font-family=”Mincho”>
あいうABC123
</fo:block>
<fo:block font-family=”Mincho” font-weight=”bold”>
あいうABC123
</fo:block>
太字の指定は無視されて出力します。
そこで、次のような 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>
太字のように出力します。
ここでは、「日本語が使える」前提で書いています。日本語フォントを使用する方法は、他のページを探してください、たくさんヒットすると思います。