茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1675769 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00142.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2012/9/18 14:48:08

[程式] 使用PHP產生UNICODE中文PDF

從晚上九點弄到一點,趕緊把筆記寫起來


應該會很亂,來源處也要慢慢補


==========================


前言:


因為工作關係需要能用PHP產生PDF作報名表單


爬很多文章看人介紹PDF套件後,選擇了FPDI這套工具


因為FPDI可以匯入已經產生好的PDF檔,在覆蓋一層文字加工


很適合做成表單類的輸出(不然整個表格慢慢一行一行刻會掛點 囧)


 


簡介FPDI


FPDI是繼承於FPDF,FPDF可以說是PHP作PDF的大祖宗,一堆套件都是基於FPDF而發展的


而FPDI可以用樣版匯入的功能是繼承自FPDF_TPL,應該也是FPDF的繼承者吧~


繼承連結(箭頭左方繼承自右方):FPDI.php => FPDF_TPL.php => FPDF.php


 


FPDF http://www.fpdf.org/



FPDI http://www.setasign.de/products/pdf-php-solutions/fpdi/


 


殘酷的事實,UNICODE的逆襲


從<網站製作學習誌>看到這篇 利用 FPDI 製作 PDF 檔案


當中是利用FPDI,再利用圖片輸出UTF8的解決方案


問題來了,原來FDPI不支援UTF8 = =


 


沙漠中的綠洲? 還是海市蜃樓


於是又再繞一大圈,UFPDF、TCPDF....一堆解決方案,就是沒有可以用樣板匯入的功能


但過程中找到FPDF為了解決中文字體的問題,而有chinese.php的改良版


這支chinese.php也是繼承至FPDF發展的,可以輸出中文的PDF


但是還是不支援UNICODE


 



於是又有強者發表了chinese-unicode.php的程式,繼承至chinese.php (很繞口吧)


繼承連結(箭頭左方繼承自右方):chinese-unicode.php => chinese.php => FPDP.php


但是,還是只能一行一行刻= =,已經兩小時了一點進展都沒(嘆)


 


<<chinese(-unicode).php>> http://www.wretch.cc/blog/evanchen/12079184


 


一語點醒夢中人


試了許多組的關鍵字去GOOGLE看有沒有其他可用的解決方法,發現有人原本用ZEND PDF產生也遇到中文的問題


改用FPDI與chinese-unicode.php結合!! 好像又露出一線生機


但是!


要修改chinese-unicode.php,我看不懂原始碼啦= =


又開始CODING地獄


 



<<有人的BLOG>> http://wlx.westgis.ac.cn/556/


 


兩套標準,怎麼結合?


FPDI的繼承路線:FPDI.php => FPDF_TPL.php => FPDF.php


Chinese-Uni:   chinese-unicode.php => chinese.php => FPDP.php


 


這讓我傷透腦筋阿~所以又開始亂拼,居然被我拼出來要改的地方還真多



  1. 修改FPDI.php 從繼承FPDF_TPL改為PDF_Unicode (在chinese-unicode.php)

  2. 修改chinese.php 把 require('fpdf.php') 注解掉  (我已經先引入還是會有問題,乾脆注掉)

  3. 修改chinese.php 內 PDF_Chinese 類別從繼承FPDF改為繼承FPDF_TPL


這時候,已經可以由 樣板產生的 中文 UNICODE PDF ,灑花~~~~~~~


隊只懂物件導向皮毛的我是一件非常不可能的事情XDD



 


新細明體真不搭,標楷體怎麼辦?


GOOGLE: chinese-unicode 標楷體


BINGO! 有兩篇可以看


原來只要修改chinese-unicode.php內的程式碼即可


" function AddUniCNShwFont ($family='Uni', $name='DFKai-SB')  // name for Kai font is DFKai-SB "


其實只要修改粗體的地方(原本是 PMingLiU),改為DFKai-SB即可


 


<<標楷體>> http://www.wretch.cc/blog/evanchen/12079184


 


ADOBE太肥 我要用FOXIT!


另外的小修正,這樣改可以在ADOBE READER正常顯示標楷體


但是FOXIT不行= =



於是有人提出解決方法


將DFKai-SB改為DFKaiShu-SB-Estd-BF


在FOXIT 2.2沒用,更新為3就可以了


(插曲:我在改用其他方案的時候,因為要製作字型描述檔 就把標楷體移過去,所以我一直試都無法變成標楷體,還以為是被唬爛,沒想到是我自己把標楷體弄不見= =,難怪會無法顯示)


<<FOXIT也是標楷體>> http://www.yces.chc.edu.tw/LifeType/blog/1


 


UTF測試正常


其實我也不知道要測甚麼字,就丟了"許公蓋烱測試堃",都可以正常顯示(使用FOXIT 3)


2009-11-22_014941.jpg


 


程式碼



幾乎都是從網站製作學習誌A來的,我只是多REQUIRE一堆東西


如果不想這麼複雜,可能要自己把相關檔案集合,我是都分資料夾比較不會亂



<?php
error_reporting (E_ALL);
define('FPDF_FONTPATH','font/');
require_once ('fpdi/FPDf.php');
require_once ('FPDI/FPDf_tpl.php');
require_once ('chinese-unicode/chinese-unicode.php');
require_once ('fpdi/FPDI.php');

// 建立 FPDI 物件
$pdf = new FPDI();

// 載入現在 PDF 檔案
$page_count = $pdf->setSourceFile("123.pdf");

// 匯入現在 PDF 檔案的第一頁
$tpl = $pdf->importPage(1);

// 在新的 PDF 上新增一頁
$pdf->addPage();

// 在新增的頁面上使用匯入的第一頁
$pdf->useTemplate($tpl);

$pdf->AddUniCNShwFont('uni');
$pdf->SetFont('uni','',20);

//$pdf->SetFont('Arial');
$pdf->SetTextColor(255,0,0);
$pdf->SetXY(25, 25);
$pdf->Write(0, "許公蓋烱測試堃");

// 輸出成本地端 PDF 檔案
$pdf->output("final.pdf", "D");

// 結束 FPDI 剖析器
$pdf->closeParsers();
?>


 



目錄結構


/=>


chinese-unicode/ => chinese.php, chinese-unicode.php ...etc


fpdi/ => fpdi.php, fpdf.php...etc


index.php


123.pdf (Template File)


 


報告完畢,剩下就是喬位子了 Orz...


2011/07/19:關於喬位子,可參考 這篇 補充說明


 


=== 網友David補充 ===


如使用時會出現類似以下錯誤碼


Deprecated: Assigning the return value of new by reference is deprecated in /var/www/html/work/phppdf/fpdi/fpdi.php on line 88


應為使用PHP 5.3.X 版本,導致new class function的時候出問題。(本文是在PHP 5.2.10測試)



此時請修改 fpdi.php 內的 '=& new' 改為 '= new'即可


感謝David!




101.01.17 Update:


這幾天把PHP版本更新為5.3也發生這個問題,補充一下:


要把 =& new 改為 = new 有下列檔案:fpdi.php, fpdi.pdf_parser.php, pdf_parser.php


 


===還有這個錯誤訊息=========================


Message: Function set_magic_quotes_runtime() is deprecated


Filename: chinese-unicode/chinese.php


=======================================


請搜尋 set_magic_quotes_runtime(  取代為 ini_set("magic_quotes_runtime",




原文出處:AsperBlog!: [程式] 使用PHP產生UNICODE中文PDF
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|