昨天研究如何在既有的 PDF 檔案上放入中文字,雖然找到支援中文的 FPDF ,但是有些 Unicode 字集我實在試不出如何顯示 (如:堃) 。
我的同事建議我用圖形來解決看看,以下就是我的實驗過程 (我用的是 Windows 平台) 。
我用的相關技術如下:
首先,我利用 FPDI 來載入一個已存在的 PDF :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<?php error_reporting (E_ALL); require_once ('FPDI/FPDI.php'); // 建立 FPDI 物件 $pdf = new FPDI(); // 載入現在 PDF 檔案 $page_count = $pdf->setSourceFile("test.pdf"); // 匯入現在 PDF 檔案的第一頁 $tpl = $pdf->importPage(1); // 在新的 PDF 上新增一頁 $pdf->addPage(); // 在新增的頁面上使用匯入的第一頁 $pdf->useTemplate($tpl); // 輸出成本地端 PDF 檔案 $pdf->output("final.pdf", "F"); // 結束 FPDI 剖析器 $pdf->closeParsers(); ?>
|
FPDI 是繼承自 FPDF 這個類別,所以它本身就算是一個加強型的 FPDF 。上面的程式會把現有 PDF 的第一頁輸出成新的 PDF 檔案。
接著我把表單傳送過來的文字,放到一個現有的圖形檔上。這裡有兩種實作方式:如果 HTML 頁面編碼是 Big5 ,那麼我會先把表單傳送過來的文字用 iconv 轉成 UTF-8 編碼;如果 HTML 頁面編碼已經是 UTF-8 ,那麼就不必再用 iconv 轉換。我採用的是第一種方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
<?php $text = isset($_POST['text']) ? trim($_POST['text']) : NULL; $is_created = FALSE; if ($text) { // 產生圖片 $img = imagecreatefrompng('test.png'); // 設定黑色畫筆 $black = imagecolorallocate($img, 0, 0, 0); // 轉換文字編碼 $utf_text = iconv('big5', 'utf-8', $text); // 繪製文字 imagettftext($img, 30, 0, 10, 40, $black, "DFSongSd.ttf", $utf_text); // 儲存圖片 imagepng($img, 'final.png'); imagedestroy($img); $is_created = TRUE; } ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=big5" /> <title>測試</title> </head> <body> <form name="form1" id="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="text" name="text" id="text" value="<?php echo $text; ?>" /> <input type="submit" name="Submit" value="送出" /> <a href="./">重新製作</a> </form> <?php if ($is_created) { ?> <img src="final.png" alt="<?php echo $text; ?>" /> <?php } ?> </body> </html>
|
如此一來在輸入文字並按下送出鈕後,就會在現有圖片上加上指定的文字。當然文字的位置要加以計算,我是先用最簡單的方式來完成。
最後就是要將製作好的圖片加到 PDF 上了, FPDF 提供了 image 函式來讓我們可以在 PDF 上放置圖形。實作方式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
// 產生圖片 $img = imagecreatefrompng('test.png'); $black = imagecolorallocate($img, 0, 0, 0); $utf_text = iconv('big5', 'utf-8', $text); imagettftext($img, 30, 0, 10, 40, $black, "DFSongSd.ttf", $utf_text); imagepng($img, 'final.png'); imagedestroy($img); // 載入現在 PDF 的第一頁 $pdf = new FPDI(); $page_count = $pdf->setSourceFile("test.pdf"); $tpl = $pdf->importPage(1); $pdf->addPage(); $pdf->useTemplate($tpl); // 放置圖形 $pdf->image("final.png", 75, 85, 50); // 輸出成本地端 PDF 檔 $pdf->output("final.pdf", "F"); $pdf->closeParsers();
|
要注意的是,貼上去的圖形可以大一點,這樣縮小並貼到 PDF 時會有比較好的列印效果。而圖形的放置位置和大小,也要經過計算再貼上去。