Tommy 碎碎念

Tommy Wu's blog

修正在 FPDF UTF-8 簡繁中文支援裡頭, AliasNbPages 沒有作用的問題
post by tommy @ 24 四月, 2009 16:31

在之前有提過有人寫了一個 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 來使用吧.

Del.icio.us Furl HEMiDEMi Technorati MyShare
Bad Behavior 已經阻擋了 90 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS