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,或應該說是 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 應該在所有的地方都含有正確的中文文字。
選擇性的:字體缺少 NBSP
(此部分只有當你要使用的中文字體缺少了無間斷空格 No-Break Space 時才有用。)
在我使用 WenQuanYi Micro Hei 作為斜體樣式之前,我先試了另一個 cwTex 字體 cwTexHeiBold。它在大部分時候沒問題,但它缺少了一個字形,剛好是被 FOP 用在產生文件的目錄。再一次地,這缺失的字形在 PDF 內顯示成 '#' 字符。
經過檢驗所產生的 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 應該現在有正確呈現的目錄了。