天天看點

fpdf chinese-unicode.php,Tommy 碎碎念 : 修正在 FPDF UTF-8 簡繁中文支援裡頭, AliasNbPages 沒有作用的問題...

在之前有提過有人寫了一個 FPDF UTF-8 簡繁中文支援的方案 (作者不是我), 不過, 有使用者反應會造成 AliasNbPages 沒有作用. 剛剛 trace 了一下, 發現在 chinese-unicode.php 裡頭, 就直接把字串轉成 unicode 內碼的十六進位字串了, 是以後來原本的 FPDF 在轉換 AliasNbPages 這個變數時, 自然不會有任何的作用.

舉例來說, 一般內定的 AliasNbPages 是用 {nb} 這個字串, 會變成 007b006e0062007d 的內容, 而在原本的 FPDF 依然是找 {nb}, 自然不會轉換. 是以我們需要針對 chinese-unicode.php 來特別處理這個部份.

你可以在 chinese-unicode.php 的 function PDF_Unicode() 之後,  加上一個 function Uni_putpages() 如下:function Uni_putpages()

{

if(!empty($this->AliasNbPages)) {

//Replace number of pages

// find the pages alias already converted to hex string

$search = '';

$len = strlen($this->AliasNbPages);

for ($i = 0; $i < $len; $i++)

$search .= sprintf("%04x", ord($this->AliasNbPages[$i]));

// replace the pages alias with page number (hex format)

$replace = '';

$total_pages = ''.$this->page.'';

$len = strlen($total_pages);

for ($i = 0; $i < $len; $i++)

$replace .= sprintf("%04x", ord($total_pages[$i]));

// replace it now

for ($n = 1; $n <= $this->page; $n++)

$this->pages[$n] = str_replace($search, $replace, $this->pages[$n]);

}

}

然後在使用時, 在最後產生 PDF 之前, 記得呼叫這個 function, 如:$pdf->Uni_putpages();

$pdf->Output();

這樣子應該就可以把頁數轉換出來了.

不過這樣子的處理, 並不保證那個轉換不會造成別的問題. 以內定的 {nb} 來說, 因為隻是單純比對 007b006e0062007d 來轉換, 雖然機率不大, 還是有可能會轉錯的. 如果有碰到, 還想避免這個問題, 可以考慮弄個比較複雜的 alias 來使用吧.