Docbook PDF格式输出效果增强实例

Docbook的PDF格式输出流程相对HTML而言,是比较复杂的。CSS运用熟练的话,HTML格式输出的效果可以做得很漂亮;不过PDF格式就没那么多选项可供操作了。本文以Docbook常见的emphasis标签为例,介绍如何增强PDF格式输出的效果。

在Docbook的诸多标签中,emphasis算是比较常用的一个。从字面意义上看,它可以用于表示强调。当然了,定义是死的,怎么用它则是用户说了算,例如我打算用它来表示UI中的菜单名,又有何不可呢?

Emphasis属于inline element,即可以放在诸如para这样的标签内,下面是一个实例:

<para>This is an <emphasis>important<emphasis> case.</para>

Emphasis有如下几种用法:

<emphasis>emphasis</emphasis>
<emphasis role=”strong” >strong emphasis</emphasis>
<emphasis role=”bold” >bold emphasis</emphasis>
<emphasis role=”underline” >underline emphasis</emphasis>

以上几种方式都可以用来跟正文字体区别开(如表示强调),在PDF中的显示效果分别为斜体、粗斜体、粗体以及下划线。需要说明的是,这里的PDF效果指的是英文字体的情形。中文字体在后边会继续提及。

在实际的文档工作中,我们发现,PDF格式中的斜体效果在大段的英文中很不明显,无法发挥应有的强调作用。于是,和同事讨论后,决定采用<emphasis role=”bold” >bold emphasis</emphasis>来表示强调,粗体显示效果更好。

前面提过,中文PDF与英文PDF不太一样。基本上,Docbook的PDF格式输出需要嵌入字体才能正常显示中文。问题是,英文字体有font family的概念,如Arial的粗体有Arial Bold,斜体有Arial Italic等,但中文字体一般没这么多变形的啊!什么?你说MS Word可以将中文加粗或倾斜显示?那是微软通过内置算法整出来的,Docbook可没这么强大(确切地说是FO处理程序没这么强大),需要有对应字体才能显示。关于这个问题,常见的对策是使用其他字体来替换,如用黑体替换粗体效果,用楷体替换斜体效果。

这里以Apache FOP为例,假设你已经整理好宋体(作为正文主字体body.font.family)和黑体的字体配置文件了。一般情况下,在fop.xconf中可以这么写:

<font metrics-url=”file:///…/…/SimSun.xml” kerning=”yes” embed-url=”file:///…/…/simsun.ttc”>
<font-triplet name=”SimSun” style=”normal” weight=”normal”/>
<font-triplet name=”SimSun” style=”normal” weight=”bold”/>
<font-triplet name=”SimSun” style=”italic” weight=”normal”/>
<font-triplet name=”SimSun” style=”italic” weight=”bold”/>
</font>

正如前面提过的,斜体和粗体这些形式在中文字体中一般都没有对应的字体,因此凡是遇到这些形式的显示效果时,如果你用上面这种写法的话,全都跟正文字体一样,没有任何区别。<emphasis role=”bold” >bold emphasis</emphasis>这种写法,必须有对应字体才能正确显示出加粗的效果。如要用黑体替换宋体的boldface属性,可以在字体配置文件中添加如下片段:

<font metrics-url=”file:///…/…/SIMHEI.xml” kerning=”yes”
embed-url=”file:///…/…/SIMHEI.ttf”>
<font-triplet name=”SimSun” style=”normal” weight=”bold”/>
</font>

此外,还要删除宋体部分原有的<font-triplet name=”SimSun” style=”normal” weight=”bold”/>。

这样一来,中文PDF也能以粗体(其实是黑体)显示emphasis标签效果了。

“Docbook PDF格式输出效果增强实例”的4个回复

  1. 我说看着你的网站,怎么有点眼熟呢,原来是前不久折腾docbook时,就来看过你这个帖子的。
    握个爪~

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注