在 Apache FOP 生成的 PDF 中显示 Unicode 字符

Displaying Unicode characters in PDF produced by Apache FOP

我有一个包含名称列表的 XML 文件,其中一些使用 characters/glyphs,但默认 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".

我查看了文档,似乎建议可用的选项是:

  1. 使用 OpenType 字体 - 但 FOP 不支持。
  2. 仅为文本的非 ASCII 部分切换到不同的字体。

我不想为每种语言使用不同的字体,因为PDF中会有中英文混合的,据我所知没有办法弄清楚哪个是哪个XSLT/XSL-FO.

是否可以嵌入一种字体来涵盖所有情况?目前我只需要英文和中文,但我以后可能需要扩展它。

我在 Ubuntu 上使用 Apache FOP 2.1 和 Java 1.7.0_91。我之前看过一些关于类似主题的问题,但大多数问题似乎都在使用更旧版本的 Apache FOP(例如 0.95 或 1.1),我不知道在此期间是否有任何问题 changed/improved。

编辑: 我的问题与建议的重复问题不同(我认为)。我已经切换到使用 Ubuntu Font Family,在我的 FOP 配置中使用以下代码:

<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>

但是,我仍然收到 'glyph not available' 警告:

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".

我知道 UbuntuRegular 有这两个字形,因为它是我的标准系统字体。

编辑 2: 如果我使用 GNU Unifont,字形显示正确。但是,它似乎是一种更适合控制台使用而不是文档中使用的字体。

我的问题的答案是使用 GNU Unifont,其中:

  1. 支持中文和英文
  2. 可在免费许可下使用。
  3. 'Just works' 如果将其添加到 FOP 配置文件中。

或者为英文和中文 PDF 制作单独的模板,并为每个模板使用不同的字体。

如果您找不到合适的字体同时支持中文和英文(或者您找到了,但您不太喜欢它的拉丁字形),请记住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>

输出如下所示: