Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

FPDF UTF-8 簡繁中文支援
post by tommy @ 20 十月, 2007 12:49

以前, 在 FPDF 的中文支援中, 並不支援 UTF-8 編碼, 所以每次要產生 pdf 檔案時, 都要用 iconv 轉成 BIG5 或 GB 來使用. 如果同一段文字有簡體也有繁體時, 這個轉換就會有問題 (不過還好我們之前的案子, 還沒碰到這個問題, 系統把兩種編碼分開來用, 並沒有衝突的情形發生). 後來, 有人改了一個 unicode 版本的 FPDF, 雖然有支援 UTF-8 了, 但是... 作法是把字型檔也整個編入 pdf 檔案中, 結果.... 是可以使用沒錯, 但是... 原本幾 KB 的 pdf 檔案, 變成幾 MB, 根本沒有實用性.今天, 閒閒在網路上逛, 不小心看到有人弄出了一個 unicode 的中文支援, 趕快把 chinese-unicode.zip (放了一份在我這兒) 抓下來使用, 果然可以正確的產生簡繁共存的 UTF-8 編碼的 PDF 檔案, 檔案也是小小的一個. 雖然其他的語言的 UTF-8 的字不能用, 不過... 至少中文是沒有問題的. 

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

那英文跟數字ok 嗎?

commons icon [2] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

英文與數字是正常的.

commons icon [3] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

可以請教一下如何使用chinese-unicode.zip嗎?

是不是將原本的
require('chinese.php');
改成
require('chinese-unicode.php')
就可以正常的顯示繁簡字???(假如位置是正確的話)

有包含繁簡的測試檔可以給我嗎???

commons icon [4] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

你有下載那個 zip 檔案? 裡頭有個 test-unicode.php 就是範例啊.

commons icon [5] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

請問,為啥我run test的檔案,結果會出現這個訊息??
我的是PHP5的版本啊!
Call to undefined function: mb_internal_encoding()

commons icon [6] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

你的 php 沒有 mbstring 模組, 裝上就應該可以用了.

commons icon [7] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

還有這個訊息...
Call to undefined function mb_convert_encoding()
我的本機好像只能使用iconv這個功能,而mb_convert的功能都不能用,
請問各位大大為啥??

commons icon [8] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

使用没有错误,但是当输入的是非英语和中文,请问怎样处理才不会在pdf中乱码?
比如西班牙语中的: ñ á é ú 之类的.
有劳各位大侠!

commons icon [9] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

說真的, 我也不知道這種同時存在多國文字的 pdf 檔要怎麼處理.
我沒仔細去研究過, 不過以前看相關 pdf generator 的程式, 好像對每一種語系的字型都是另外去指定. 所以這類的內容, 也許要自行去判斷該字是屬於那一個語系, 再去指定字型. 這樣處理會很複雜.
或許要等 Adobe 出一個萬用的字型檔, 把所有的字都納入後才能簡單處理吧.

commons icon [10] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

當我用了這個"chinese-unicode.php"後,冇錯,是能gen中文的pdf,但原本的英文字字距變得很大,font style 也變了,跟本不能使用.請問大大有解決方法嗎? 最起碼可變繳字距.

commons icon [11] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

請教一下, 有人在使用 chinese-unicode時, 使用 aliasnbpages()及{nb}來產生總頁數時, 可否正常? 我發現好多人都有這個問題(印的都是 1/{nb} ,不是總頁數), 同樣的程式使用FPDF class很正常但使用PDF_Unicode時卻怎麼都不行, 但在chinese-unicode.php及chinese.php都沒動到 aliasnbpages.
這是怎麼回事?

commons icon [12] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

哈哈 我也碰到 11 樓問題了

我去 fpdf 把 aliasnbpage 的變數改了又改還是沒用

它就是直接把字印出來(轉成字串?)

等待有人可以解決這個問題= = ....

commons icon [13] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

因為在 UniCell() 裡頭就把字串的內容轉換了, 所以最後面處理 {nb} 時, 已經不是字串了.

commons icon [14] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

那請問該怎麼改
是在 fuction 裡加個例外嗎
寫 ... if 字串 ="{nb}" 就跳出 @@?
不知道該怎麼寫 ...

commons icon [15] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

我利用外加 function 的方式來處理這個問題. 可以參考 http://blog.teatime.com.tw/1/post/324 的內容.

commons icon [16] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

間距的問題, 我記得有人說過用簡體的字型就比較正常.
參考一下, 不過我沒試過.
http://twpug.net/modules/newbb/viewtopic.php?forum=14&post_id=11346&topic_id=3026

commons icon [17] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

原來 tommy 大已經寫了解決的內容 沒爬到

感謝

不過我試的結果是可以用

不過如果是當文件只有一頁時,就還是印出 {nb}

如果是多頁(譬如三頁好了)

一二頁沒問題 最後一頁就印不出來還是變{nb}

我再研究看看 再次感謝

commons icon [18] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

補上文件開頭
require('../fpdf/chinese-unicode.php');
class PDF extends PDF_Unicode
{
//Page header

//Page footer
function Footer()
{
//Position at 1.5 cm from bottom
$this->SetY(-15);
//Arial italic 8
$this->SetFont('Arial','I',8);
//Page number
$this->Cell(0,10,'Page '.$this->PageNo().' / Page {nb}',0,0,'C');
}
}

$pdf=new PDF();
$pdf->FPDF($orientation = 'P');
$pdf->Open();
$pdf->AliasNbPages();
$pdf->AddUniCNShwFont('uni');
$pdf->SetFont('uni','',14);

印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印印

$pdf->Uni_putpages();
$pdf->Output();

commons icon [19] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

你可以自己加一些 log 在 Uni_putpages() 裡頭, 把每一頁產生的碼在 str_replace() 前後有什麼差別. 也許是因為那行太長, 在處理時會被自動換行, 造成該字串被拆在不同行處理, 所以就沒有處理到.

commons icon [20] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

我已經把fpdf.php, chinese-unicode.php copy 好,
並調用了上文的
require('../fpdf/chinese-unicode.php');
class PDF extends PDF_Unicode

結果卻出現錯誤:
Fatal error: Class 'PDF_Unicode' not found in C:\Program Files\EasyPHP 3.0\www\chinese-unicode\mysql_report.php on line 8.

究竟該如何解決?各位大俠!

commons icon [21] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

我試過成功但如果同時出繁體及簡體... 就會出現亂碼... 怎麼辦??

commons icon [22] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

20F的大大
那是因為unicode那隻用的是

commons icon [23] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

大大,
剛剛試了一下, 以下是心得

原本PDF_Unicode(Constructor) 是不能設定紙張大小的, 建議改為以下
function PDF_Unicode ($ori='P', $unit='mm', $size, $charset = 'UTF-8')
{
$this->FPDF ($ori, $unit, $size);
$this->charset = strtoupper(str_replace ('-', '', $charset));
$this->isUnicode = in_array ($this->charset, array ('UTF8', 'UTF16', 'UCS2'));
}

commons icon [24] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

最後一頁沒有替換的原因是 Call Uni_putpages() 時,最後一頁尚未有 Footer。最後一頁呼叫 Footer 是在 Close() 的時候,所以你怎麼換也換不到。

我的方法是把 fpdf.php 中 Close() 呼叫 Footer() 的地方去掉,

然後寫一個自己的函數自己呼叫 Footer ,然後再如同前面的人的作法。

function Myout()
{
$this->InFooter=true;
$this->Footer();
$this->InFooter=false;

$this->Uni_putpages();
$this->Output();
$this;
}

commons icon [25] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

写的不错,如果能涉及PDF文档如何添加标题和作者等信息就更好了。

commons icon [26] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

不用寫呼叫, 只需在fpdf.php的 Close() 內加入$this->Uni_putpages();即可

function Close()
{
//Terminate document
if($this->state==3)
return;
if($this->page==0)
$this->AddPage();
//Page footer
$this->InFooter=true;
$this->Footer();
$this->InFooter=false;

//Total Pages
$this->Uni_putpages();

//Close page
$this->_endpage();
//Close document
$this->_enddoc();
}

commons icon [27] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

為什麼我會一直跑出'PDF_Unicode' not found的問題,誰能救救我

commons icon [28] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

通常 PDF_Unicode not found 是表示你的程式沒有正確的 include 到 chinese-unicode.php 這個檔案. (改用 require 試看看, 如果沒載入會有錯誤)

commons icon [29] Re:FPDF UTF-8 簡繁中文支援 [ 回覆 ]

我用requrie還是一樣顯示PDF_Unicode not found耶,請問還怎麼解決?

迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

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