引言:为什么您可能需要将HTML转换为PDF?
\n想象一下这种情况:您在网站上创建了一张漂亮的发票,用HTML进行排版,添加了样式,一切看起来都很完美。但客户要求发送PDF。或者您需要生成带有图表、表格和复杂排版的报告。手动绘制PDF已经是过去式了。更简单的方法是编写HTML+CSS,然后通过程序将其转换为PDF。
\nStack 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
在本文中,我们将重点介绍mPDF作为最方便的选择,但也会展示Dompdf的示例以供比较。
\n\n通过Composer安装库
\n首先,创建一个项目并安装依赖项。打开终端并执行:
\ncomposer require mpdf/mpdf\n如果您想尝试Dompdf:
\ncomposer require dompdf/dompdf\n现在,在项目根目录下创建一个文件generate_pdf.php,并开始编写代码。
示例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()即可。
示例2:使用外部CSS文件
\n样式通常存储在单独的文件中。mPDF支持通过<link>引入外部CSS:
<?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会解析它并应用样式。
示例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在将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我们分析了三种将HTML和CSS转换为PDF的方法。以下是简要总结:
\n- \n
- Dompdf — 适用于简单文档,易于使用,但CSS支持有限。 \n
- TCPDF — 功能强大,但需要更多代码,对CSS支持较差。 \n
- mPDF — 最佳选择,适用于复杂布局、表格、样式。推荐用于大多数项目。 \n
现在您知道如何回答“How Can I add HTML And CSS Into PDF”这个问题了。选择适合您的库,开始生成专业的PDF文档吧!