【问题】
前提:
Docbook中,已经有此设置了:
<xsl:param name="title.font.family">Microsoft YaHei</xsl:param> <xsl:param name="body.font.family">Microsoft YaHei</xsl:param> <xsl:param name="monospace.font.family">Microsoft YaHei</xsl:param> <xsl:param name="symbol.font.family">Cambria Math</xsl:param>
然后docbook的xml源码中的某个para中包含unicode为0x21b5的特殊字符:
<para>回车(↵)后再输入:</para>
其中该特殊字符的实体定义为:
<!ENTITY crarr "↵" ><!--DOWNWARDS ARROW WITH CORNER LEFTWARDS -->
用fop编译生成pdf过程中,出现错误:
Jun 6, 2012 5:19:59 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei".
对应生成的pdf中的字符,由于无合适字体,所以也是被#代替了:
现在想要让pdf中可以正常显示此字符。
【解决过程】
1.参考了FOP的官网的解释:Missing Glyphs,其也没有给出解决方案。
2.其他很多地方,包括:Subject: RE: XSL-FO and unicode,都提到了,FOP遇到没法正常显示的字体,是不支持字体自动替换的,所以也就出现上述字符无法显示结果被#代替的问题了。
3.其他一些地方,比如:Subject: XSL-FO and unicode主要讨论的还是symbol,而不是我这里的glyph,所以,经过测试,即使去改了symbol.font.family或monospace.font.family,也都是无效果的。
因此我此处的特殊字符,是出于para中间,即对应着的字体应该是body.font.family的,但是此处又不想因为这单独的个别字符,而改变整个pdf的body.font.family字体的设置的。
4.在Windows上安装配置Apache FOP中的评论中,也有人遇到此问题,但是也没有解决办法。
5.官网的Typography中,也没有找到有效的办法。
6.后来参考:Using greek characters with docbook and fop,去把代码改为:
<para>回车(<phrase role="symbol">↵</phrase>)后再输入:</para>
后,结果就可以了,生成的pdf中,就可以正常显示该特殊字符了:
而此处看来是默认的stylesheet中已经包含了role=symbol的处理了,所以不需要我们自己去添加对应的配置了。因此是可以工作的。
【总结】
对于极个别的特殊的字符,如果其所对应的字体(我此处的是由于放在para中所以对应的是body.font.family=雅黑)无法显示的话,但是对应的别的字体(我此处的是symbol是设置的Cambria Math的字体,是包括了该特殊字符的),那么可以通过设置role的方式,让系统对此特殊字符特殊处理,使用你所指定的类型的字体去显示,即可。
对于我此处,即把:
<para>回车(↵)后再输入:</para>
改为:
<para>回车(<phrase role="symbol">↵</phrase>)后再输入:</para>
就可以实现让系统对此特殊字符,使用symbol.font.family所对应的Cambria Math字体,来显示默认的para所对应的微软雅黑所无法显示的unicode值为0x21B5的特殊字符了。
转载请注明:在路上 » 【已解决】Docbook用fop生成pdf过程中出现警告:WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei".