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 檔案,並把以下幾行插入 與 之間:

 				<!-- 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。在該檔案內,插入以下的碼:

<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