使用XSLT3.0与FOP-2.8无法渲染XML中的日文问题
日文内容XSL-FO渲染显示异常的解决方案
问题原因
Helvetica是西文字体,不包含日文汉字、平假名等东亚字符的字形(glyph),渲染时无法匹配对应字符,最终显示为占位符##。
解决方案
直接指定支持日文的字体
在fo:block标签中添加font-family属性,选用覆盖日文字符的字体,优先选择跨平台兼容的开源字体或系统自带日文字体:<fo:block font-size="3.4mm" font-family="Noto Sans JP, Meiryo, MS Gothic, sans-serif"> <xsl:value-of select="Item/ItemValue"/> </fo:block>说明:
Noto Sans JP是谷歌开源的多语言字体,完美覆盖日文;Meiryo/MS Gothic是Windows系统自带日文字体;最后的sans-serif作为兜底 fallback。配置FO处理器的字体映射(针对未识别字体)
如果使用Apache FOP等处理器无法自动识别指定字体,需在配置文件中注册字体路径。以Apache FOP为例,修改fop.xconf:<fonts> <font kerning="yes" embed-url="/absolute/path/to/NotoSansJP-Regular.otf"> <font-triplet name="Noto Sans JP" style="normal" weight="normal"/> </font> </fonts>启动FOP时通过
-c参数指定该配置文件:fop -c fop.xconf input.fo output.pdf开启字体嵌入确保跨设备显示
为避免在无对应字体的设备上显示异常,可开启字体嵌入,在fo:block或根元素添加font-embed="full"属性:<fo:block font-size="3.4mm" font-family="Noto Sans JP" font-embed="full"> <xsl:value-of select="Item/ItemValue"/> </fo:block>
内容的提问来源于stack exchange,提问作者Rito Sarkar
相关产品推荐
相关产品推荐

