Publican Logo

Publican 是一件单一源码的出版工具。它使用 DocBook XML 档案作为输入的源码,能够产生出各样格式文件,像是 HTML、PDF、ePub、Man、WebHelp...等等。不少网际网路上的开源专案,如 Debian、Fedora、GIMP...等等,均以 Publican 作为产生文件的工具。

在 Publican 里已经有内建支援多种语言,包含正体中文和简体中文。然而,我们必须先做些准备工作,才能够让 Publican 产生较令人满意的中文 PDF 文件。

安装预设中文字体

当产生文件时的语言码被设为 zh-TW (正体中文) 或 zh-CN (简体中文) 时,Publican 将分别使用 AR PL UMing TW (AR PL ShanHeiSun Uni) 及 AR PL UMing CN (ZYSong18030) 来呈现文件中的文字。若是 Publican 无法找到适当的字体,它将退回到使用预设字体 Liberation,该字体里并没有任何中文字形。

因此,要让中文文字能在 PDF 内正确地呈现,第一件要做的事情就是把需要的中文字体安装起来。在 Debian Linux 平台上,例如 Ubuntu,你可以使用下面的指令来安装 AR PL UMing 字体,该字体里面含有繁体与简体中文字形。

$ sudo apt-get install fonts-arphic-uming

现在你可以试试利用 Publican 产生一份含有中文文字的 PDF。假设你已经设定好一个 Publican 文件夹以及一个语言翻译子目录,像是 zh-TW。那么,你能够在那个文件夹内,以下面的指令产生 PDF:

$ publican build --formats=pdf --langs=zh-TW

利用一个 PDF 阅读程式,你可以在子目录 tmp/zh-TW/pdf 内查看新产生的 PDF。大部分的中文字应该如预期地呈现出来,但有些文字却以一串的 '#' 字符显示。

Publican PDF - hastags

安装额外的中文字体

结果原来是 Publican,或应该说是 FOP (这是大多数安装上使用的底层 PDF 制作引擎),在某些地方预期一个字体会同时有斜体和粗体的变化字体存在。但不幸地,中文字体时常只有一个样式。当 FOP 试着要为一段文字产生 PDF 码,但无法找到所指定的字体或样式时,它则使用预设的字体,并且把那段文字以一串的 '#' 字符取代,如果预设字体内没有那些字形。

我们需要做的是用不同的中文字体来假冒 AR PL UMing TW 的斜体、粗体和斜粗体样式。首先,我们必须安装更多的中文字体。

$ sudo apt-get install fonts-arphic-ukai
$ sudo apt-get install fonts-wqy-microhei
$ sudo apt-get install fonts-cwtex-fs

前两个字体内含了正体语简体字形。最后一个只支援正体中文。

假冒斜体、粗体和斜粗体样式

额外的中文字体安装好之后,我们可以进行 /usr/share/publican/fop/fop.xconf 档案的修改,以假冒 AR PL UMing TW (或 AR PL UMing CN,如果你用 zh-CN 语言码) 的斜体、粗体和斜粗体样式。

你可以在 /usr/share/publican/fop/fop.xconf 档案里看到,在预设状况下,Publican 要求 FOP 自动侦测系统上安装的字体。我们将手动地建造那三个额外中文字体的字体量度,并新增项目来使它们成为 AR PL UMing TW 字体的各种样式。

要为那些字体建造字体量度,执行以下的指令。所产生的字体量度将被放在 /usr/share/publican/fop/font-metrics 档案夹里面。

$ cd /usr/share/publican/fop
$ mkdir font-metrics
$ fop-ttfreader -ttcname 'AR PL UKai TW' /usr/share/fonts/truetype/arphic/ukai.ttc font-metrics/ukai-tw.xml
$ fop-ttfreader -ttcname 'WenQuanYi Micro Hei' /usr/share/fonts/truetype/wqy/wqy-microhei.ttc font-metrics/wqy-microhei.xml
$ fop-ttfreader /usr/share/fonts/truetype/cwtex/cwfs.ttf font-metrics/cwfs.xml

现在你应该有 3 个档案:ukai-tw.xml、wqy-microhei.xml 和 cwfs.xml,放在 font-metrics 子目录内。接着,开启 /usr/share/publican/fop/fop.xconf 档案,并把以下几行插入 <fonts> 与 <auto-detect/> 之间:

 				<!-- following font tags were added to fake styles not existed in AR PL UMing font. - Kochin -->
				<!-- Use WenQuanYi Micro Hei to fake AR PL UMing TW Bold -->
				<font metrics-url="/usr/share/publican/fop/font-metrics/wqy-microhei.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/wqy/wqy-microhei.ttc">
					<font-triplet name="AR PL UMing TW" style="normal" weight="bold"/>
				</font>
				<!-- Use cwTeXFangSong to fake AR PL UMing TW Italic -->
				<font metrics-url="/usr/share/publican/fop/font-metrics/cwfs.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/cwtex/cwfs.ttf">
					<font-triplet name="AR PL UMing TW" style="italic" weight="normal"/>
				</font>
				<!-- Use AR PL UKai TW to fake AR PL UMing TW Italic Bold -->
				<font metrics-url="/usr/share/publican/fop/font-metrics/ukai-tw.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/arphic/ukai.ttc">
					<font-triplet name="AR PL UMing TW" style="italic" weight="bold"/>
				</font>
基本上那几行告诉 FOP,当需要 AR PL UMing TW 的不同样式时,使用 WenQuanYi Micro Hei 当作粗体、cwTexFanSong 当作斜体、AR PL UKai TW 当作斜粗体。

再一次用之前的 Publican 指令建造你的中文 PDF。这次输出的 PDF 应该在所有的地方都含有正确的中文文字。

Publican PDF - correct

选择性的:字体缺少 NBSP

(此部分只有当你要使用的中文字体缺少了无间断空格 No-Break Space 时才有用。)

在我使用 WenQuanYi Micro Hei 作为斜体样式之前,我先试了另一个 cwTex 字体 cwTexHeiBold。它在大部分时候没问题,但它缺少了一个字形,刚好是被 FOP 用在产生文件的目录。再一次地,这缺失的字形在 PDF 内显示成 '#' 字符。

Publican PDF Missing NBSP

经过检验所产生的 PDF 码之后,我了解到所缺少的字形是无间断空格 No-Break Space (NBSP),它的 Unicode 码是 0x00A0。查看了一下该字体的字体量度档案,确定了 Unicode 码 0x00A0 的确不在它的 CMAP 里面。对了,cwTexHeiBold 的字体量度是用下面的指令产生的:

$ cd /usr/share/publican/fop
$ fop-ttfreader /usr/share/fonts/truetype/cwtex/cwheib.ttf font-metrics/cwheib.xml

用一个文字编辑器开启字体量度档案 /usr/share/publican/fop/font-metrics/cwheib.xml。在该档案内 <bfranges></bfranges>,插入以下的码:

<bf gi="3" ue="160" us="160"/>

这段码告诉 FOP 使用字形 3 来呈现 Unicode 160 (0x00A0)。字形 3 其实是正常的空格字符。因为 cwTexHeiBold 没有给无间断空格的字形,我使用正常空格字形。

修改 /usr/share/publican/fop/fop.xconf 档案,使得 <fonts> 与 <auto-detect/> 之间的码成为:

				<!-- following font tags were added to fake styles not existed in AR PL UMing font. - Kochin -->
				<!-- Use cwTeXHeiBold to fake AR PL UMing TW Bold -->
				<font metrics-url="/usr/share/publican/fop/font-metrics/cwheib.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/cwtex/cwheib.ttf">
					<font-triplet name="AR PL UMing TW" style="normal" weight="bold"/>
				</font>
				<!-- Use cwTeXFangSong to fake AR PL UMing TW Italic -->
				<font metrics-url="/usr/share/publican/fop/font-metrics/cwfs.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/cwtex/cwfs.ttf">
					<font-triplet name="AR PL UMing TW" style="italic" weight="normal"/>
				</font>
				<!-- Use AR PL UKai TW to fake AR PL UMing TW Italic Bold -->
				<font metrics-url="/usr/share/publican/fop/font-metrics/ukai-tw.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/arphic/ukai.ttc">
					<font-triplet name="AR PL UMing TW" style="italic" weight="bold"/>
				</font>
以 Publican 重新建造文件,新产生的 PDF 应该现在有正确呈现的目录了。

Publican PDF Correct NBSP

 

FaLang translation system by Faboba