MPDF 是基於 FPDF/FPDI 的 PHP 類庫,支援 UTF-8、CSS 2.1/3 部分屬性、HTML 直接轉 PDF,適合發票、報表、合約等文件生成。本文涵蓋安裝、基本用法、中文支援、頁首頁尾、水印、效能優化。
composer require mpdf/mpdf
或官網下載 ZIP 包 手動引入。
<?php
require_once __DIR__ . '/vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf([
'mode' => '+aCJK', // 中文支援關鍵
'format' => 'A4',
'margin_top' => 20,
'margin_bottom' => 20,
]);
$html = '<h1>Hello MPDF</h1><p>這是第一個 PDF。</p>';
$mpdf->WriteHTML($html);
$mpdf->Output('first.pdf', \Mpdf\Output\Destination::DOWNLOAD);
?>
$mpdf->SetHTMLHeader('
<table width="100%">
<tr><td>公司名稱</td><td style="text-align:right;">頁碼: {PAGENO}/{nbpg}</td></tr>
</table>
', 'O'); // 'O' 奇數頁,'E' 偶數頁
$mpdf->SetHTMLFooter('
<div style="text-align:center; font-size:8pt;">機密文件</div>
');
$mpdf->SetWatermarkText('CONFIDENTIAL');
$mpdf->showWatermarkText = true;
$mpdf->watermark_font = 'notosanscjktc';
$mpdf->watermarkTextAlpha = 0.1;
$mpdf->AddPage('NEXT', '', '', '', '');
$mpdf->WriteHTML('<tocpagebreak><h1>目錄</h1><toc>');
// 內容頁使用 <h2>...</h2> 自動建立書籤
$mpdf->SetProtection(
['print', 'copy'], // 允許權限
'user_pass', // 使用者密碼
'owner_pass', // 擁有者密碼
128 // 加密長度
);
| 問題 | 解決 | |
|---|---|---|
| 中文顯示方框 | 檢查 `+aCJK`、字型註冊、`autoLangToFont` | |
| CSS 不生效 | MPDF 僅支援部分 CSS,避免 Flex/Grid,用 table 布局 | |
| 圖片不顯示 | 路徑需為絕對路徑或相對執行腳本路徑;支援 data URI | |
| 記憶體耗盡 | 增加 `memory_limit`、分批輸出、使用 `Output('', 'S')` 回傳字串再分塊輸出 | |
| 生成速度慢 | 關閉 `useSubstitutions`、減少字型檔案大小、啟用 OpCache |
| 庫 | 優點 | 缺點 |
|---|---|---|
| MPDF | HTML/CSS 支援最好、中文友善、功能全 | 大檔案記憶體佔用高、速度較慢 |
| TCPDF | 純 PHP、無依賴、支援條碼 | HTML/CSS 支援弱、中文配置繁瑣 |
| DomPDF | CSS 2.1 支援較好 | 大檔案極慢、記憶體爆炸 |
| wkhtmltopdf (外部工具) | WebKit 渲染、完美 CSS/JS | 需安裝二進制、併發需管理進程池 |