在 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".
我查看了文档,似乎建议可用的选项是:
- 使用 OpenType 字体 - 但 FOP 不支持。
- 仅为文本的非 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,其中:
- 支持中文和英文
- 可在免费许可下使用。
- '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>
输出如下所示:
我有一个包含名称列表的 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".
我查看了文档,似乎建议可用的选项是:
- 使用 OpenType 字体 - 但 FOP 不支持。
- 仅为文本的非 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,其中:
- 支持中文和英文
- 可在免费许可下使用。
- '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>
输出如下所示: