引言:为什么 HTML+CSS 转 PDF 令人头疼(以及如何解决)
想象一下:您正在用 PHP 开发一个网站,客户要求:“做一个‘下载 PDF’按钮,能导出漂亮的发票、报告或证书。”您心想:“这还不简单!拿一个 HTML 模板,加上 CSS 样式,然后转换成 PDF 就行了。”但现实往往更复杂:字体错位、表格散架,而 flexbox 这个 CSS 属性时灵时不灵。
在 Stack Overflow 上,“How can I add HTML and CSS into PDF” 这个问题获得了数千次浏览。这意味着几乎每个 PHP 开发者都遇到过这个问题。在本文中,我们将介绍三个流行的库——Dompdf、TCPDF 和 mPDF——并展示如何在 PHP 中正确地将 HTML 和 CSS 转换为 PDF。
您将了解到:
- 如何根据不同的任务选择合适的库
- 如何引入 CSS 样式(外部、内联、@import)
- 如何解决常见问题:西里尔字母、表格、图片
- 如何编写可运行的代码,从 HTML 生成 PDF
为什么不能直接将 HTML 保存为 PDF?
浏览器可以完美渲染 HTML+CSS,但 PDF 生成器并非浏览器。它们使用自己的渲染引擎,并非所有 CSS 属性都受支持。例如:
flexbox和grid——并非在所有地方都有效border-radius——仅部分支持@media print——可能被忽略- 字体(尤其是西里尔字母)——需要额外加载
好消息是:现代的 PHP 库在不断改进,采用正确的方法,您可以获得看起来几乎与浏览器中一样的 PDF。
PHP 中用于 HTML+CSS 转 PDF 的库概览
我们来介绍三个最流行的工具。每个都有其优势。
1. Dompdf
优点:轻量级,通过 Composer 安装简单,对 CSS 2.1 支持良好,部分支持 CSS3。非常适合简单的文档——如发票、收据。
缺点:对复杂布局(flexbox、grid)支持较弱,处理大量 HTML 时可能有问题。
2. TCPDF
优点:稳定、强大,支持 Unicode(西里尔字母),无需外部库。非常适合包含图表、二维码、多页表格的复杂 PDF 文件。
缺点:语法复杂,CSS 样式需要手动引入,代码较为冗长。
3. mPDF
优点:对 CSS 支持最好(包括 @media、float、position),对西里尔字母处理出色,支持外部文件样式。被认为是“黄金标准”。
缺点:比 Dompdf 更重,处理大型文档时可能较慢。
建议:快速上手请用 Dompdf。对于严肃项目,请用 mPDF。如果需要最大灵活性且愿意编写更多代码,请用 TCPDF。
实践示例:使用 Dompdf 从 HTML 生成 PDF
让我们编写实际代码。通过 Composer 安装 Dompdf:
composer require dompdf/dompdf现在创建一个 PHP 脚本,将 HTML 模板转换为 PDF:
<?phprequire_once 'vendor/autoload.php';
use Dompdf\\Dompdf;use Dompdf\\Options;
// 设置$options = new Options();$options->set('defaultFont', 'DejaVu Sans'); // 支持西里尔字母$options->set('isRemoteEnabled', true); // 允许外部图片
$dompdf = new Dompdf($options);
// HTML 模板$html = '<!DOCTYPE html><html><head> <style> body { font-family: DejaVu Sans, sans-serif; } .invoice { width: 100%; max-width: 80