本文目录导读:

- 纯 PHP 库(适合简单/中等复杂度)
- 利用浏览器内核渲染(适合高保真网页转 PDF)
- 商业 SaaS / 云端 API 服务(适合高并发/免运维)
- 选型总结对比表
- 推荐建议(针对 PHP 开发者)
- 代码示例(Mpdf 快速上手)
PHP 导出 PDF 有多种成熟的解决方案,主要分为第三方库、HTML 转 PDF 工具和商业服务三大类,以下是最常用的方案及选型建议:
纯 PHP 库(适合简单/中等复杂度)
这些方案不依赖外部浏览器,直接在 PHP 环境中渲染。
TCPDF
- 特点:PHP 原生库,功能最全面,支持几乎所有 PDF 标准(如数字签名、条形码、各种字体)。
- 优点:不需要安装额外软件;对
UTF-8和东亚字符(中文/日文)支持较好(需配置字体)。 - 缺点:API 过于底层,写代码复杂,需要手动计算坐标;生成速度较慢。
- 适用场景:生成电子发票、合同、简单的表格报告。
FPDF
- 特点:经典老牌库,入门简单。
- 优点:轻量级,上手快。
- 缺点:默认不支持 Unicode(中文会乱码,需下载中文字体包);功能比 TCPDF 少。
- 适用场景:极简单的纯英文/数字标签打印。
Dompdf
- 特点:将 HTML 和 CSS 转换为 PDF。
- 优点:开发效率高,直接写 HTML 模板即可输出 PDF,适合“表格 + 样式”的场景。
- 缺点:对复杂 CSS(如
flex、grid)支持有限,渲染效果可能与浏览器有差异;依赖 PHP 的DOM和IMAP扩展;对 CSS 2.1 支持较好。 - 适用场景:后台管理系统的报表导出、订单打印,无需高精度视觉还原。
利用浏览器内核渲染(适合高保真网页转 PDF)
这是目前最流行的方案,利用 Chrome/Firefox 的打印功能进行解析,能完美还原现代 CSS(Bootstrap、Flexbox、Tailwind 等)。
Puppeteer / headless Chrome(配合 PHP 调用)
- 特点:通过 PHP
Shell_exec调用 Node 的 Puppeteer 或直接执行chrome --headless --print-to-pdf命令。 - 优点:像素级还原 Web 页面,支持 JavaScript(图表、地图)。
- 缺点:服务器必须安装 Chrome 浏览器;并发高时消耗内存较大;需要处理异步任务队列。
- 适用场景:网页前端页面(如报表看板、可视化图表)直接导出 PDF。
wkhtmltopdf
- 特点:使用 Qt WebKit 引擎将 HTML 转换为 PDF(命令行工具)。
- 优点:老牌稳定,也是直接吃 HTML,对
CSS 2.0支持好。 - 缺点:官方已停止维护(2023年停止更新),对新版 JS/CSS 支持不足;依赖系统安装
wkhtmltopdf二进制文件。 - 适用场景:旧系统升级、对 CSS3 要求不高的项目。
Mpdf
- 特点:基于 FPDF 扩展,重点解决HTML 解析。
- 优点:对中文字体支持极佳(内置 Unicode 字体处理),比 Dompdf 快,支持复杂的 CSS(如边框、阴影)比 Dompdf 好。
- 缺点:对非常复杂的 DIV+CSS 布局仍可能错位;内存占用较高。
- 适用场景:中文报表导出,这是目前 PHP 社区最推荐的组合(HTML + Mpdf)。
商业 SaaS / 云端 API 服务(适合高并发/免运维)
BuildPhp / EasePHP / API2PDF 等
- 特点:将 HTML 通过 REST API 发送到云端,由云端服务器生成 PDF 返回。
- 优点:零本地安装;处理文档极快(如合并、拆分、加密);适合高并发。
- 缺点:需要付费;有数据隐私风险(涉及敏感数据需谨慎)。
选型总结对比表
| 方案 | 技术栈要求 | 中文支持 | 视觉还原度 | 开发难度 | 适用场景 |
|---|---|---|---|---|---|
| TCPDF / FPDF | 纯 PHP | 需手动配字体 | 低(画线拼凑) | 高 | 简单表格、标签、固定格式票据 |
| Dompdf | 纯 PHP | 支持良好 | 中(不支持 Flex) | 低 | 普通 HTML 表格导出 |
| Mpdf | 纯 PHP | 优秀 | 中高(CSS 覆盖广) | 低 | 中文报告、合同、发票 |
| Puppeteer / Chrome | Node.js + Chrome | 很好 | 极高 | 中 | 单页应用、图表可视化、网页快照 |
| wkhtmltopdf | 系统安装包 | 好 | 中(老旧引擎) | 低 | 老旧项目维护 |
| 商业 API | 无(仅 HTTP) | 好 | 视服务商而定 | 极低 | 高并发、无需维护的云服务 |
推荐建议(针对 PHP 开发者)
- 快速简单:如果只是后台管理员导出简单的 HTML 表格,选 Dompdf。
- 中文排版:如果包含大量中文、类似印刷排版(如 PDF 报告书),选 Mpdf(PHP 阵营口碑最好,几乎无乱码问题)。
- 复杂现代 UI:如果页面用了大量 Vue/React 动态渲染,或者需要截图功能,建议用 Puppeteer(通过 Node 服务)或将 HTML 发送到 云端 API。
- 禁止外部依赖:如果服务器环境封闭(无法安装 Chrome),只能选 TCPDF 或 Mpdf。
代码示例(Mpdf 快速上手)
<?php
require_once __DIR__ . '/vendor/autoload.php'; // 使用 Composer 安装
// 使用 Composer:composer require mpdf/mpdf
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'margin_top' => 15,
'margin_bottom' => 15,
]);
$html = '<h1>用户订单报告</h1>';
$html .= '<table border="1" width="100%">
<tr><th>订单号</th><th>金额</th><th>状态</th></tr>
<tr><td>CN10001</td><td>¥299.00</td><td>已支付</td></tr>
</table>';
$mpdf->WriteHTML($html);
// 输出到浏览器(或保存文件)
$mpdf->Output('报告.pdf', 'D'); // I=内联预览, D=下载, F=保存服务器
?>
如果你还在用纯 PHP 且要求效果好,首选 Mpdf;如果你是现代化架构且对页面还原度有极高要求,请选择 Chrome headless 方案。