MPDF 6.x 生成 PDF 時中文顯示亂碼(方框/問號),核心原因是**未正確載入 CJK 字型**。本文提供最簡配置修正與實例代碼,支援中日韓文字完美渲染。
<?php
require_once __DIR__ . '/vendor/autoload.php'; // Composer 安裝
$mpdf = new \Mpdf\Mpdf([
'mode' => '+aCJK', // 關鍵:啟用 CJK 字型回退
'format' => 'A4',
'default_font_size' => 12,
'margin_left' => 20,
'margin_right' => 15,
'margin_top' => 25,
'margin_bottom' => 25,
'margin_header' => 10,
'margin_footer' => 10,
]);
$html = '
<h1 style="color:#2c3e50;">MPDF 中文測試</h1>
<p>這是一段包含中文、英文、數字 123 的測試內容。</p>
<p>支援標點符號:,。!?;:「」『』()【】…</p>
<ul>
<li>列表項目一</li>
<li>列表項目二</li>
</ul>
';
$mpdf->WriteHTML($html);
$mpdf->Output('chinese_test.pdf', \Mpdf\Output\Destination::DOWNLOAD);
?>
MPDF 內建 **DejaVu Sans** 不含中文字型。需自行下載開源中文字型(如 **Noto Sans CJK TC**、**思源黑體 Source Han Sans TC**、**微軟正黑體** - 需授權)放入 `ttfonts/` 目錄,並在 `config_fonts.php` 註冊:
// config_fonts.php 片段
$this->fontdata['notosanscjktc'] = [
'R' => 'NotoSansCJKtc-Regular.otf',
'B' => 'NotoSansCJKtc-Bold.otf',
];
// 若使用 mode '+aCJK',MPDF 會自動嘗試回退至已註冊的 CJK 字型
| 錯誤做法 | 正確做法 |
|---|---|
| 使用 `mode => 'c'` 或 `mode => 'utf-8'` | 必須用 `'+aCJK'` (MPDF 6+) 或 `'zh-CN'` (舊版) |
| 未設定 `autoLangToFont = true` | config.php 必須啟用,否則不會自動切換字型 |
| 字型檔放錯路徑或未註冊 | 放入 `ttfonts/`,並在 `config_fonts.php` 註冊 fontdata |
| HTML 未宣告 charset | 確保 HTML 含 `` 或傳入 UTF-8 字串 |
$mpdf->SetFont('notosanscjktc'); // 強制使用指定字型
// 或在 CSS 中
$html = '<style> body { font-family: "notosanscjktc"; } </style>...';
正確配置 `+aCJK` 模式、啟用 `autoLangToFont`、註冊可用 CJK 字型,即可徹底解決 MPDF 中文亂碼,生成專業級中文 PDF 文件。