我有一个包含名称列表的XML文件,其中一些使用默认PDF字体(Helvetica / Arial)中未表示的字符/字形:
<name>Paul</name>
<name>你好</name>
我正在使用XSLT和Apache FOP处理此文件,以生成列出名称的PDF文件。目前,我在控制台上收到以下警告,并且在PDF中将汉字替换为##:
Jan 30, 2016 11:30:56 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "你" (0x4f60) not available in font "Helvetica".
Jan 30, 2016 11:30:56 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "好" (0x597d) not available in font "Helvetica".
我看了看文档,似乎建议可用的选项是:
使用OpenType字体-FOP不支持这种字体。
仅针对文本的非ASCII部分切换到其他字体。
我不想为每种语言使用不同的字体,因为会有混合了中文和英文的PDF,据我所知,没有办法确定XSLT / XSL-FO中的哪个。
是否可以嵌入单个字体来涵盖所有情况?目前,我只需要英语和中文,但将来可能需要扩展它。
我在Ubuntu上使用Apache FOP 2.1和Java 1.7.0_91。我曾在类似主题上看到过一些较早的问题,但大多数问题似乎使用的是Apache FOP的较旧版本(例如0.95或1.1),并且我不知道在此期间是否进行了任何更改/改进。
编辑:我的问题与建议的重复项不同(我认为)。我已在FOP配置中使用以下代码切换为使用Ubuntu Font Family:
<font kerning="yes" embed-url="../fonts/ubuntu/Ubuntu-R.ttf" embedding-mode="full">
<font-triplet name="Ubuntu" style="normal" weight="normal"/>
</font>
<font kerning="yes" embed-url="../fonts/ubuntu/Ubuntu-B.ttf" embedding-mode="subset">
<font-triplet name="Ubuntu" style="normal" weight="bold"/>
</font>
但是,我仍然收到“字形不可用”警告:
Jan 31, 2016 10:22:59 AM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Glyph "你" (0x4f60) not available in font "Ubuntu".
Jan 31, 2016 10:22:59 AM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Glyph "好" (0x597d) not available in font "Ubuntu".
我知道Ubuntu Regular有这两个字形,因为它是我的标准系统字体。
编辑2:如果使用GNU Unifont,字形将正确显示。但是,它似乎是一种比控制台中更多的针对控制台使用的字体。
最佳答案
如果找不到合适的字体同时支持中英文(或者您找到了一种,但您不太喜欢它的拉丁字形),请记住font-family
可以包含逗号分隔的名称列表,用于那个命令。
因此,您可以先为英文文本列出所需的字体,然后为中文文本列出所需的字体:
<!-- this has # instead of the missing Chinese glyphs -->
<fo:block font-family="Helvetica" space-after="1em" background-color="#AAFFFF">
Paul 你好</fo:block>
<!-- this has all the glyphs, but I don't like its latin glyphs -->
<fo:block font-family="SimSun" space-after="1em" background-color="#FFAAFF">
Paul 你好</fo:block>
<!-- the best of both worlds! -->
<fo:block font-family="Helvetica, SimSun" space-after="1em" background-color="#FFFFAA">
Paul 你好</fo:block>
输出看起来像这样: