当前位置: 首页 > 工具软件 > FOP > 使用案例 >

java fop_java – Apache FOP使用SimSun显示###

尉迟默
2023-12-01

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

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

博洛尼亚大学中国学生的毕业论文

处理此输入时,FOP会发出几个与此类似的警告:

org.apache.fop.events.LoggingEventListener processEvent

WARNING: Glyph "?" (0x535a) not available in font "Helvetica".

...

在FO文件中没有任何明确的字体系列指示,FOP默认使用Helvetica,这是Base-14 fonts之一(各地都可用的字体,因此不需要嵌入它们).

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

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

如果默认字体不支持我们文本的字符(或者我们只是想使用不同的字体),我们必须使用font-family属性来声明所需的字体.

font-family的值是继承的,所以如果我们想对整个文档使用相同的字体,我们可以在fo:page-sequence上设置属性;如果我们只需要一些段落或单词的特殊字体,我们可以在相关的fo:block或fo:inline上设置font-family.

所以,我们的输入成为(使用我有一个字体作为例子):

博洛尼亚大学中国学生的毕业论文

但是现在我们得到了一个新的警告,除了旧警告!

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仍然显示“#”.

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

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

配置文件是一个XML文件,我们必须添加font mappings内部/ fop / renderers / renderer [@mime =’application / pdf’] / fonts /(每个可能的输出mime类型都有一个渲染器部分,所以检查你正在插入正确的映射):

...

...

/Users/furini/Library/Fonts

...

...

>每个字体元素都指向一个字体文件

>每个font-triplet条目标识映射到父字体元素中的字体文件的font-family font-style(normal,italic,…)font-weight(normal,bold,…)的组合

>使用文件夹元素,也可以自动配置指定文件夹内的所有字体文件(但如果文件夹包含大量字体,则需要一些时间)

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

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

请注意,我们不需要注册所有可能的字体三元组;如果缺少一个,FOP将使用为“类似”注册的字体(例如,如果我们不映射三元组“SimSun,斜体,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找不到字体文件,需要再次检查字体配置;典型的原因是

>字体网址中的拼写错误>访问字体文件的权限不足

 类似资料: