HTML和CSS转PDF的PHP完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么您可能需要将HTML转换为PDF?

\n

想象一下这种情况:您在网站上创建了一张漂亮的发票,用HTML进行排版,添加了样式,一切看起来都很完美。但客户要求发送PDF。或者您需要生成带有图表、表格和复杂排版的报告。手动绘制PDF已经是过去式了。更简单的方法是编写HTML+CSS,然后通过程序将其转换为PDF。

\n

Stack Overflow上关于“How Can I add HTML And CSS Into PDF”的问题已经积累了数千次浏览——这意味着这个问题对许多开发者来说都很常见。在本文中,我们将介绍在PHP中实现这一点的三种最流行的方法,展示代码示例,并帮助您为任务选择最佳工具。

\n\n

库比较:Dompdf、TCPDF和mPDF

\n

在编写代码之前,让我们先弄清楚如何选择。在PHP领域,有三个主要的“巨头”用于将HTML转换为PDF:

\n
    \n
  • Dompdf — 轻量级库,很好地支持CSS 2.1和部分CSS 3。非常适合简单的文档。
  • \n
  • TCPDF — 功能强大、稳定,但对于复杂排版需要更多代码。对CSS不太友好。
  • \n
  • mPDF — 如果您需要支持复杂CSS(flexbox、渐变、透明度),这是最佳选择。最“CSS友好”的库。
  • \n
\n

在本文中,我们将重点介绍mPDF作为最方便的选择,但也会展示Dompdf的示例以供比较。

\n\n

通过Composer安装库

\n

首先,创建一个项目并安装依赖项。打开终端并执行:

\n
composer require mpdf/mpdf
\n

如果您想尝试Dompdf:

\n
composer require dompdf/dompdf
\n

现在,在项目根目录下创建一个文件generate_pdf.php,并开始编写代码。

\n\n

示例1:使用mPDF将简单HTML转换为PDF

\n

从一个最基本的示例开始。假设我们有一个发票的HTML模板:

\n
<!DOCTYPE html>\n<html>\n<head>\n    <style>\n        body { font-family: Arial, sans-serif; }\n        .invoice { max-width: 800px; margin: 0 auto; }\n        .header { background: #4CAF50; color: white; padding: 20px; }\n        .total { font-size: 24px; font-weight: bold; }\n    </style>\n</head>\n<body>\n    <div class="invoice">\n        <div class="header">发票编号123 日期:2025年3月1日</div>\n        <p>客户:伊万·彼得罗夫</p>\n        <table border="1" width="100%">\n            <tr><th>服务</th><th>价格</th></tr>\n            <tr><td>网站开发</td><td>50,000 卢布</td></tr>\n            <tr><td>SEO推广</td><td>15,000 卢布</td></tr>\n        </table>\n        <div class="total">总计:65,000 卢布</div>\n    </div>\n</body>\n</html>
\n

现在,用于生成PDF的PHP代码:

\n
<?php\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n$html = file_get_contents('invoice.html'); // 或者直接是包含HTML的字符串\n\n$mpdf = new \\Mpdf\\Mpdf();\n$mpdf->WriteHTML($html);\n$mpdf->Output('invoice.pdf', 'I'); // 'I' — 在浏览器中打开,'D' — 下载\n?>
\n

运行脚本——PDF就准备好了!请注意:mPDF自动从<style>中获取了CSS。这就是对“How Can I add HTML And CSS Into PDF”这个问题的回答——只需将带有CSS的HTML传递给WriteHTML()即可。

\n\n

示例2:使用外部CSS文件

\n

样式通常存储在单独的文件中。mPDF支持通过<link>引入外部CSS:

\n
<?php\n$html = '\n<!DOCTYPE html>\n<html>\n<head>\n    <link rel="stylesheet" type="text/css" href="style.css">\n</head>\n<body>\n    <h1>月度报告</h1>\n</body>\n</html>';\n\n$mpdf = new \\Mpdf\\Mpdf();\n$mpdf->WriteHTML($html);\n$mpdf->Output('report.pdf', 'D');\n?>
\n

确保style.css文件与PHP脚本位于同一目录中。mPDF会解析它并应用样式。

\n\n

示例3:使用Dompdf生成PDF

\n

现在让我们看看如何使用Dompdf实现相同的功能:

\n
<?php\nrequire_once __DIR__ . '/vendor/autoload.php';\n\nuse Dompdf\\Dompdf;\n\n$dompdf = new Dompdf();\n$html = file_get_contents('invoice.html');\n$dompdf->loadHtml($html);\n$dompdf->setPaper('A4', 'portrait');\n$dompdf->render();\n$dompdf->stream('invoice.pdf');\n?>
\n

如您所见,Dompdf的API略有不同:使用loadHtml()和render(),而不是WriteHTML()。但总体思路是一样的。

\n\n

常见问题及解决方案

\n

在将HTML转换为PDF时,可能会遇到一些典型问题。以下是常见问题及其解决方案:

\n
    \n
  • 中文字符显示为方块 — 使用支持中文的字体,例如:$mpdf->autoLangToFont = true;
  • \n
  • CSS样式未应用 — 检查CSS语法。mPDF不支持所有CSS属性,例如position: fixed可能无法正常工作。
  • \n
  • PDF文件过大 — 优化图像并使用$mpdf->img_dpi = 72;降低分辨率。
  • \n
  • 内存错误 — 增加PHP内存限制:ini_set('memory_limit', '256M');
  • \n
\n\n

结论:选择哪种库?

\n

我们分析了三种将HTML和CSS转换为PDF的方法。以下是简要总结:

\n
    \n
  • Dompdf — 适用于简单文档,易于使用,但CSS支持有限。
  • \n
  • TCPDF — 功能强大,但需要更多代码,对CSS支持较差。
  • \n
  • mPDF — 最佳选择,适用于复杂布局、表格、样式。推荐用于大多数项目。
  • \n
\n

现在您知道如何回答“How Can I add HTML And CSS Into PDF”这个问题了。选择适合您的库,开始生成专业的PDF文档吧!

博客

书籍推荐