gpt4 book ai didi

java - Apache FOP 使用 SimSun 显示 ###

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:08 24 4
gpt4 key购买 nike

我正在维护一个使用 Apache FOP 打印 PDF 文档的程序。有一些关于中文字符出现为“####”的提示。我找到了一个关于这个问题的现有线程,并在我这边做了一些研究。
http://apache-fop.1065347.n5.nabble.com/Chinese-Fonts-td10789.html
我的系统上确实安装了 uming.tff 语言文件。与此线程中的人不同,我仍然收到“####”。
从现在开始,有没有人看到允许您使用 Apache FOP 在 PDF 文档中打印复杂字符的解决方法?

最佳答案

必须采取三个步骤才能在使用 FOP 创建的 PDF 文件中正确显示中文字符(这对于默认字体中不可用的所有字符也是如此,更常见的是使用非默认字体)。

让我们使用这个简单的 fo 示例来显示出现问题时 FOP 产生的警告:

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="one">
<fo:region-body />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="one">
<fo:flow flow-name="xsl-region-body">
<!-- a block of chinese text -->
<fo:block>博洛尼亚大学中国学生的毕业论文</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

处理此输入时,FOP 会给出几个与此类似的警告:
org.apache.fop.events.LoggingEventListener processEvent
WARNING: Glyph "?" (0x535a) not available in font "Helvetica".
...

在 FO 文件中没有任何明确的字体系列指示,FOP 默认使用 Helvetica,它是 Base-14 fonts 之一。 (字体随处可用,因此无需嵌入它们)。

每种字体都支持一组字符,为它们分配一个可见的字形;当某个字体不支持某个字符时,会产生上述警告,并 PDF 显示“#”而不是缺少的字形 .

第一步:在FO文件中设置font-family

如果默认字体不支持我们文本的字符(或者我们只是想使用不同的字体),我们必须使用 font-family属性来说明所需的。
font-family的值是继承的,所以如果我们想为整个文档使用相同的字体,我们可以在 fo:page-sequence 上设置属性。 ;如果我们只为某些段落或单词需要特殊字体,我们可以设置 font-family上相关 fo:blockfo:inline .

因此,我们的输入变为(以我的字体为例):
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="one">
<fo:region-body />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="one">
<fo:flow flow-name="xsl-region-body">
<!-- a block of chinese text -->
<fo:block font-family="SimSun">博洛尼亚大学中国学生的毕业论文</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

但是现在我们收到了一个新的警告,除了旧的警告!
org.apache.fop.events.LoggingEventListener processEvent
WARNING: Font "SimSun,normal,400" not found. Substituting with "any,normal,400".
org.apache.fop.events.LoggingEventListener processEvent
WARNING: Glyph "?" (0x535a) not available in font "Times-Roman".
...

FOP 不知道如何将“SimSun”映射到字体文件 ,所以它默认为通用的 Base-14 字体(Times-Roman),不支持我们的汉字,和 PDF 仍然显示“#” .

第二步:在FOP的配置文件中配置字体映射

在 FOP 的文件夹中,文件 conf/fop.xconf是一个示例配置;我们可以直接编辑它或制作一个副本开始。

配置文件是一个XML文件,我们要添加 font mappings/fop/renderers/renderer[@mime = 'application/pdf']/fonts/ (每个可能的输出 MIME 类型都有一个 renderer 部分,因此请检查您是否将映射插入了正确的类型):
<?xml version="1.0"?>
<fop version="1.0">
...
<renderers>
<renderer mime="application/pdf">
...
<fonts>

<!-- specific font mapping -->
<font kerning="yes" embed-url="/Users/furini/Library/Fonts/SimSun.ttf" embedding-mode="subset">
<font-triplet name="SimSun" style="normal" weight="normal"/>
</font>

<!-- "bulk" font mapping -->
<directory>/Users/furini/Library/Fonts</directory>

</fonts>
...
</renderer>
...
</renderers>
</fop>
  • 每个font element 指向一个字体文件
  • 每个font-triplet条目标识 font-family 的组合+ font-style (正常,斜体,...) + font-weight (正常,粗体,...)映射到父字体文件 font元素
  • 使用 folder元素也可以自动配置指定文件夹内的所有字体文件(但如果文件夹包含大量字体,这需要一些时间)

  • 如果我们有一个完整的文件集,其中包含所需字体的特定版本(正常、斜体、粗体、浅色、粗斜体等),我们可以将每个文件映射到精确的三元组字体,从而生成非常复杂的 PDF。

    在光谱的另一端,我们可以将所有三元组映射到同一个字体文件,如果我们有可用的全部:在输出中所有文本将显示相同,即使在 FO 文件中它的部分被标记为斜体或胆大。

    请注意,我们不需要注册所有可能的字体三元组;如果缺少一个,FOP 将使用为“类似”字体注册的字体(例如,如果我们不映射三元组“SimSun,italic,400”,FOP 将使用映射到“SimSun,normal,400”的字体,警告我们关于字体替换)。

    我们还没有完成,因为没有下一步和最后一步,当我们处理输入文件时没有任何变化。

    第 3 步:告诉 FOP 使用配置文件

    如果我们从命令行调用 FOP,我们使用 -c指向我们的配置文件的选项,例如:
    $ fop -c /path/to/our/fop.xconf input.fo input.pdf

    从我们可以使用的 java 代码(另见 FOP's site ):
    fopFactory.setUserConfig(new File("/path/to/our/fop.xconf"));

    现在,终于,PDF 应该正确使用所需的字体并按预期显示。

    如果 FOP 突然终止并出现如下错误:
    org.apache.fop.cli.Main startFOP
    SEVERE: Exception org.apache.fop.apps.FOPException: Failed to resolve font with embed-url '/Users/furini/Library/Fonts/doesNotExist.ttf'

    表示FOP找不到字体文件,需要重新检查字体配置;典型的原因是
  • 字体 url 中的拼写错误
  • 权限不足,无法访问字体文件
  • 关于java - Apache FOP 使用 SimSun 显示 ###,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25895984/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com