使用mPDF实现网站页面一键生成PDF功能详解

使用mPDF实现网站页面一键生成PDF功能详解

mpdf.github.io mPDF documentation mpdf.github.io 项目地址: 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();

安全注意事项

  1. 必须验证请求来源,防止他人滥用你的服务
  2. 限制只处理自己域名的请求
  3. 考虑添加访问频率限制

前端集成

简单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;
?>

高级优化建议

  1. 缓存处理:对生成的PDF进行缓存,避免重复生成相同内容
  2. 性能监控:记录PDF生成时间和大小,优化大页面处理
  3. 错误处理:添加try-catch块捕获处理异常
  4. PDF配置:根据内容自动选择最佳页面大小和方向
  5. 水印支持:为生成的PDF添加水印标识

常见问题解决

  1. 中文乱码:确保在mPDF初始化时设置正确的编码

    $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8']);
    
  2. 图片不显示:检查图片路径是否为绝对路径,或正确设置setBasePath()

  3. 样式不生效:确认CSS选择器是否正确,并检查是否有更高优先级样式覆盖

  4. 大页面处理:对于内容很多的页面,考虑分页或增加内存限制

结语

通过mPDF实现网站页面转PDF功能既简单又强大。本文介绍的方法可以灵活应用于各种网站架构,无论是静态页面还是动态生成的页面。关键在于合理设计PDF专用样式表,并处理好前后端的交互逻辑。

mpdf.github.io mPDF documentation mpdf.github.io 项目地址: https://gitcode.com/gh_mirrors/mp/mpdf.github.io

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁战崇Exalted

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值