/ 網站開發

2023年03月17日 325

TCPDF 中文內文與下載中文檔名解決


TCPDF 是一款強大的 Html 轉 PDF 的生成工具
引入後只要把內容用 Html 規則組合好,即可輸出 PDF格式 的文件
比較麻煩的是很多樣式不吃,只能邊寫樣式邊測試去解決佈局問題
但若遇到中文時的困擾更大,主要有以下兩點:

  1. 輸出中文內容有缺字或亂碼問題
    解決方法:
    $this->SetFont('msungstdlight', '', 18);   // 設定 msungstdlight 字型

    由於這是內建字體真的蠻醜的,更囉唆的是在 Windows 系統中會變成『新細明體』
    如果想要各系統中產出的PDF檔都可以是美美的黑體,可以下載『台北黑體TCPDF字型檔
    設定改為

    $this->SetFont('TaipeiSansTCBeta', '', 18);   // 設定 TaipeiSansTCBeta 字型

    這樣輸出時就可以是美美的黑體囉
     

  2. 下載涵中文檔名時,不同瀏覽器可能會有亂碼檔名問題
    解決方法:
    找到套件檔案 tcpdf.php 大約在 7667 行左右
    case 'D': 這個下載規則中有一段 header
    header('Content-Disposition: attachment; filename="'.basename($name).'"')

    把他註解掉,手動修改為以下判斷式的語法,來幫檔名做瀏覽器的不同規則

    // header('Content-Disposition: attachment; filename="'.basename($name).'"');
    // 解決各瀏覽器下載中文檔名亂碼問題
    if (preg_match("/MSIE/", $_SERVER["HTTP_USER_AGENT"])) {
       $name = urlencode($name);
       $name = str_replace("+", "%20", $name); // 替换空格
       $attachment = "attachment; filename=\"{$name}\"; charset=UTF-8";
    } elseif (preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) {
       $attachment = 'attachment; filename*=utf-8\'\'' . $name;
    } elseif (preg_match("/Safari/", $_SERVER["HTTP_USER_AGENT"])) {
       $name = rawurlencode($name);
       $attachment = 'attachment; filename*=utf-8\'\'' . $name;
    } else {
       $attachment = "attachment; filename=\"{$name}\"; charset=UTF-8";
    }
    header('Content-Disposition: ' . $attachment);

    目前在 IE、Chrome、Firefox、Safari 測試,下載的檔名就不再是亂碼都能是正確中文囉!!

參考連結:tcpdf.org

標籤: #PHP