使用mPDF实现网站页面一键生成PDF功能详解
mpdf.github.io mPDF documentation 项目地址: https://gitcode.com/gh_mirrors/mp/mpdf.github.io
前言
在网站开发中,我们经常需要为用户提供将网页内容保存为PDF的功能。mPDF作为一个强大的PHP库,能够帮助我们轻松实现这一需求。本文将详细介绍如何利用mPDF为网站每个页面添加"生成PDF"功能。
准备工作
1. 创建专用CSS样式表
首先需要为PDF输出准备专用的CSS样式表,因为网页上通常包含导航栏、页眉页脚等元素,这些在PDF中是不需要的。
/* mypdf.css */
#header, #sidebar, #footer, .advertisement {
display: none;
}
.main-content {
float: none;
margin: 0;
padding: 0;
width: 100%;
}
关键点:
- 使用
display: none
隐藏不需要的元素 - 重置主内容区的布局样式
- 从mPDF 5.0开始,
display: none
也支持内联元素
2. 在网页中引入样式表
将上述样式表引入到网页的<head>
部分,注意使用media="mpdf"
属性:
<link href="mypdf.css" type="text/css" rel="stylesheet" media="mpdf" />
media="mpdf"
确保浏览器会忽略这个样式表,而mPDF会专门使用它。
核心实现
创建PDF生成脚本
下面是核心的PHP脚本(makepdf.php),负责处理请求并生成PDF:
<?php
require __DIR__ . '/vendor/autoload.php';
// 安全验证 - 只允许指定域名的请求
$url = urldecode($_REQUEST['url']);
if (!preg_match('@^https?://www\.yourdomain\.com/@', $url)) {
die("Access denied");
}
// 处理POST请求
if (count($_POST) > 0) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => $_POST
]);
$html = curl_exec($ch);
curl_close($ch);
}
// 处理GET请求
elseif (ini_get('allow_url_fopen')) {
$html = file_get_contents($url);
} else {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
}
// 初始化mPDF
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4'
]);
// 配置PDF
$mpdf->CSSselectMedia = 'mpdf'; // 使用我们定义的mpdf媒体类型
$mpdf->setBasePath($url); // 设置基础路径用于解析相对URL
$mpdf->SetHeader("{$url}\n\nPage {PAGENO}"); // 添加页眉
// 生成PDF
$mpdf->WriteHTML($html);
$mpdf->Output();
安全注意事项
- 必须验证请求来源,防止他人滥用你的服务
- 限制只处理自己域名的请求
- 考虑添加访问频率限制
前端集成
简单GET请求实现
对于普通页面,可以使用JavaScript动态生成链接:
<script type="text/javascript">
document.write(`
<a href="makepdf.php?url=${encodeURIComponent(location.href)}"
class="pdf-link">
生成本页PDF
</a>
`);
</script>
处理表单POST请求
如果页面是通过表单POST请求生成的,需要特殊处理:
<?php
$pdfForm = '
<script type="text/javascript">
document.write(\'<form method="POST" action="makepdf.php?url=\' +
encodeURIComponent(location.href) + \'">\');
';
foreach ($_POST as $name => $value) {
$pdfForm .= "document.write('<input type=\"hidden\" name=\"{$name}\" value=\"{$value}\" />');";
}
$pdfForm .= '
document.write(\'<button type="submit">生成PDF</button></form>\');
</script>';
echo $pdfForm;
?>
高级优化建议
- 缓存处理:对生成的PDF进行缓存,避免重复生成相同内容
- 性能监控:记录PDF生成时间和大小,优化大页面处理
- 错误处理:添加try-catch块捕获处理异常
- PDF配置:根据内容自动选择最佳页面大小和方向
- 水印支持:为生成的PDF添加水印标识
常见问题解决
-
中文乱码:确保在mPDF初始化时设置正确的编码
$mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8']);
-
图片不显示:检查图片路径是否为绝对路径,或正确设置
setBasePath()
-
样式不生效:确认CSS选择器是否正确,并检查是否有更高优先级样式覆盖
-
大页面处理:对于内容很多的页面,考虑分页或增加内存限制
结语
通过mPDF实现网站页面转PDF功能既简单又强大。本文介绍的方法可以灵活应用于各种网站架构,无论是静态页面还是动态生成的页面。关键在于合理设计PDF专用样式表,并处理好前后端的交互逻辑。
mpdf.github.io mPDF documentation 项目地址: https://gitcode.com/gh_mirrors/mp/mpdf.github.io
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考