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

时间:2016-01-30 11:52:52

标签: unicode fonts apache-fop

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

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

  1. 使用OpenType字体 - FOP不支持此字体。
  2. 仅针对非ASCII文本部分切换为其他字体。
  3. 我不想为每种语言使用不同的字体,因为会有中英文混合的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,则字形显示正确。但是,它似乎是一种更倾向于使用控制台而不是文档的字体。

2 个答案:

答案 0 :(得分:4)

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

输出如下:

screenshot of PDF output

答案 1 :(得分:1)

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

  1. 支持中文和英文。
  2. 可在免费许可下使用。
  3. 如果将其添加到FOP配置文件中,则“正常工作”。
  4. 或者为英文和中文PDF制作单独的模板,并为每种PDF使用不同的字体。