PHP实现HTML转PDF的完整指南:从基础到实践
在Web开发中,将HTML页面转换为PDF文件是一项常见需求,比如生成发票、合同、报告等需要长期保存或打印的文档,PHP作为主流的服务端脚本语言,提供了多种工具和库来实现HTML转PDF的功能,本文将详细介绍几种主流的实现方式,包括环境配置、代码示例、优缺点对比及注意事项,帮助你快速PHP中HTML转PDF的技巧。
为什么需要将HTML转PDF?
在了解具体实现之前,先简单梳理一下HTML转PDF的典型应用场景:
- 文档归档:将网页内容转换为PDF,便于长期存储和跨设备查看。
- 报表生成:如财务报表、销售统计、用户数据导出等,PDF格式能保证排版一致性。
- 合同/发票打印:避免因浏览器样式差异导致的打印错乱,确保打印效果与设计一致。
- 批量导出:例如电商平台的订单导出、教育机构的证书生成等,通过后台批量生成PDF供用户下载。
PHP实现HTML转PDF的主流方案
PHP生态中,HTML转PDF的方案主要分为三类:
- 基于命令行的工具调用(如wkhtmltopdf)
- 基于PHP扩展的库(如TCPDF、mPDF)
- 基于API的在线服务(如PDFShift、CloudConvert)
下面将逐一展开介绍。
使用wkhtmltopdf(推荐,功能强大)
什么是wkhtmltopdf?
wkhtmltopdf是一个开源的命令行工具,它基于WebKit(Chrome浏览器内核)渲染引擎,能将HTML页面转换为PDF、图片等格式,其优势在于:
- 支持CSS3、HTML5、JavaScript(部分场景)。
- 能准确还原网页的排版和样式(包括分页、页眉页脚、水印等)。
- 跨平台支持(Linux、macOS、Windows)。
环境准备
步骤1:安装wkhtmltopdf
- Linux(Ubuntu/Debian):
sudo apt-get update sudo apt-get install wkhtmltopdf
- macOS(通过Homebrew):
brew install wkhtmltopdf
- Windows:从官网下载安装包,配置环境变量到
PATH
。
步骤2:验证安装
终端执行wkhtmltopdf --version
,若显示版本信息则安装成功。
PHP调用示例
PHP通过shell_exec()
或exec()
等函数调用wkhtmltopdf命令,核心是将HTML文件或URL转换为PDF。
示例1:从HTML字符串生成PDF
<?php $html = ' <!DOCTYPE html> <html> <head> <meta charset="UTF-8">测试PDF</title> <style> body { font-family: Arial, sans-serif; } h1 { color: #333; } .content { margin: 20px; } </style> </head> <body> <h1>PHP HTML转PDF测试</h1> <div class="content"> <p>这是通过wkhtmltopdf生成的PDF文件。</p> <p>当前时间:' . date('Y-m-d H:i:s') . '</p> </div> </body> </html> '; // 保存HTML到临时文件 $htmlFile = tempnam(sys_get_temp_dir(), 'html_'); file_put_contents($htmlFile, $html); // 定义PDF输出路径 $pdfFile = '/tmp/test.pdf'; // 调用wkhtmltopdf命令(--encoding utf-8 解决中文乱码) shell_exec("wkhtmltopdf --encoding utf-8 {$htmlFile} {$pdfFile}"); // 删除临时HTML文件 unlink($htmlFile); // 提供下载 if (file_exists($pdfFile)) { header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="test.pdf"'); readfile($pdfFile); unlink($pdfFile); exit; } ?>
示例2:从URL生成PDF
$url = 'https://www.example.com'; $pdfFile = '/tmp/url.pdf'; shell_exec("wkhtmltopdf {$url} {$pdfFile}"); // 后续下载逻辑同上
常用参数
wkhtmltopdf支持丰富的参数,可优化PDF输出效果:
--page-size A4
:设置纸张大小(默认A4)。--orientation Portrait/Landscape
:页面方向(纵向/横向)。--margin-top 10mm
:设置页边距。--header-center "页眉内容"
:添加页眉。--footer-center "第 [page] 页"
:添加页脚(自动页码)。--disable-smart-shrinking
:禁用智能缩放(避免字体过小)。
优缺点
- 优点:渲染效果接近浏览器,支持复杂CSS和JS,功能全面。
- 缺点:需安装依赖,服务器需支持命令行执行(禁用
shell_exec()
时无法使用)。
使用mPDF(纯PHP库,无需依赖)
什么是mPDF?
mPDF是一个纯PHP库,无需额外依赖,直接通过PHP代码生成PDF,它支持UTF-8、中文、CSS样式,适合简单的PDF生成场景。
环境准备
通过Composer安装:
composer require mpdf/mpdf
PHP调用示例
<?php require_once __DIR__ . '/vendor/autoload.php'; $html = ' <h1>mPDF测试</h1> <p>这是通过mPDF生成的PDF文件,支持中文:你好,世界!</p> <table border="1"> <tr> <th>姓名</th> <th>年龄</th> </tr> <tr> <td>张三</td> <td>25</td> </tr> </table> '; // 创建mPDF实例 $mpdf = new \Mpdf\Mpdf(); // 设置中文字体(需确保服务器有字体文件,或使用内置字体) $mpdf->SetFont('simhei'); // 使用黑体(需提前上传字体文件到mpdf/ttfonts目录) // 写入HTML内容 $mpdf->WriteHTML($html); // 输出PDF(I:浏览器显示;D:下载;F:保存到文件) $mpdf->Output('test.pdf', 'D'); ?>
优缺点
- 优点:纯PHP实现,无需服务器依赖,适合简单PDF生成。
- 缺点:对复杂CSS(如flex布局、媒体查询)支持较差,渲染效果与浏览器有差距。
使用TCPDF(功能丰富的PHP库)
什么是TCPDF?
TCPDF是另一个流行的PHP PDF生成库,支持HTML、表格、图片、条形码等,功能强大但学习成本较高。
环境准备
通过Composer安装:
composer require tecnickcom/tcpdf
PHP调用示例
<?php require_once __DIR__ . '/vendor/autoload.php'; $html = ' <h1>TCPDF测试</h1> <p>这是通过TCPDF生成的PDF文件。</p> '; // 创建TCPDF实例 $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // 设置文档信息 $pdf->SetCreator('PHP'); $pdf->SetAuthor('Your Name'); $pdf->SetTitle('TCPDF Test'); // 添加一页 $pdf->AddPage(); // 写入HTML(需启用HTML解析器) $pdf->writeHTML($html, true, false, true, false, ''); // 输出PDF $pdf->Output('test.pdf', 'D'); ?>
优缺点
- 优点:功能全面(支持条形码、二维码、SVG等),适合复杂文档生成。
- 缺点:API复杂,文档较少,对CSS支持有限。
使用在线API服务(无需本地安装)
适用场景
如果服务器无法安装依赖(如共享虚拟主机),或需要高可用性服务,可选择在线API(如PDFShift、CloudConvert)。
示例(以PDFShift为例)
步骤1:注册账号获取API Key
访问PDFShift官网注册,获取API Key。
步骤2:PHP调用API
<?php $apiKey = 'your_api_key'; // 替换为你的API Key $html = '<h1>API测试</h1><p>这是通过PDFShift生成的PDF。</p>'; $url =
还没有评论,来说两句吧...