我有一个包含名称列表的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>

输出看起来像这样:

07-24 09:38
查看更多