当前位置: 首页 > 知识库问答 >
问题:

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

欧阳智志
2023-03-14

我有一个包含名称列表的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不支持这种字体

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

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

我在Ubuntu上使用ApacheFop2.1和Java1.7.091。我在前面看到过一些关于类似主题的问题,但大多数问题似乎使用的是更旧的Apache FOP版本(例如0.95或1.1),我不知道在此期间是否有任何更改/改进。

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

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

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

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

共有2个答案

南宫俊逸
2023-03-14

我的问题的答案是要么使用GNU统一字体,它:

  1. 支持中文和英文
  2. 可免费获得许可证
  3. 如果将其添加到FOP配置文件中,则“只起作用”

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

东门晨
2023-03-14

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

输出如下所示:

 类似资料:
  • 我试图使用Apache Fop和Java生成PDF,但生成的Pdf总是一个空白页。它都嵌套在一个网络应用程序中,割断器是玻璃鱼。 有人有什么建议吗? 以下是我的xsl: 示例XML文件如下所示: 编辑:应该生成pdf的Java代码。。。 第二次编辑: 我发现我的outputStream有问题。我想显示另存为对话框,以便从web应用程序下载生成的文件。我不明白,我的输出有什么问题。。。

  • 我正在为jasper pdf报告使用以下代码来显示字符M平方(\u33a1) 对于这段代码,我无法在PDF中看到unicode字符。它只是一片空白。但在XLSX中,我可以看到角色。我尝试了以下内容: 删除pdfEncoding 但运气不好 更新:我使用的自定义字体似乎不支持平方m字符。我无法添加新字体或更新现有的自定义字体。但是我可以为该特定字符使用任何或内置字体。如何使用内置字体实现此目的? 我

  • 我正在用apache fop库(v2.2)生成PDF文件。如果我从Eclipse IDE运行应用程序,所有运行都没有问题,但是如果我从Eclipse IDE生成JAR,并且库处理设置为将所需的库提取到生成的JAR中,然后我将运行JAR,它将生成没有图像的PDF文件(文本如预期的那样可见)。首先我认为这是由无效的文件路径引起的,但是如果我直接在XSL中使用base64编码的图像,图像仍然不可见。如果

  • 在“在另一个PDF文件的可用空间追加PDF”之前,我问了一个问题,我已经成功地将原生iText和JFreeChart结合在一个页面中制作了一个PDF。 我使用教程“SpringWebMVC与PDF视图示例(使用iText5.x)”将此设置合并到我的SpringMVC应用程序中。 我明白使用Spring的并反过来实现为 并且JFreeChart实例需要将现有PDF文件插入其中,如“使用嵌入式JFre

  • 我正在尝试使用raylib显示包含西里尔字符的字符串。所以我加载了一个代码点如下的字体: 如果我画