开发背景
在实际开发过程中,有一些特殊需要:需要把相关网页转换成PDF格式,作为资料留存
下面讲一下我所遇到的相关需求:证书的发放,在前期的需求调研的时候甲方提出一个需求,电子证书需要实时生成并且通过邮件发送,于是我开始找相关的资料开始学习,于是找到了以下几个:
1.pdf.js
缺点:分页时会造成文字或表格截断等,所以自己要使用css去规范网页在一个页面中,所以只适合单网页生成pdf,这个看自己需求来顶
2.dompdf
要求:该库要求PHP> = 5.0,并且已启用mbstring和DOM扩展。 它还需要一些字体,这些字体通常在大多数计算机上都可用。
示例:
//引入资源文件
require_once "dompdf_config.inc.php";
//初始化对象
$dompdf = new DOMPDF();
$html = <<<'ENDHTML'
<html>
<body>
<h1>test</h1>
</body>
</html>
ENDHTML;
//载入HTML资源文件
$dompdf->load_html($html);
//重载
$dompdf->render();
//输出
$dompdf->stream("test.pdf");
总结:大型表或者长网页很容易导致内存不足。
3.html2ps
示例:
//引入资源文件
require_once "html2fpdf.php";
//初始化对象
$pdf=new HTML2FPDF();
//加载实例方法
$pdf->AddPage();
//获取生成页面
$fp = fopen("test.html","r");
//获取生成页面参数
$strContent = fread($fp, filesize("sample.html"));
//关闭
fclose($fp);
//加载实例方法
$pdf->WriteHTML($strContent);
//输出
$pdf->Output("test.pdf");
4.wkhtmltopdf
示例:
//需要生成pdf的页面(注意:在自己的项目中,该页面一定要是不需要有登录凭证的页面)
$http = “https://www.baidu.com”;
//指定生成pdf的存放地址(注意:最好是项目的绝对路径:也就是带域名的全路径)
$root_url = ””’;
//执行pdf生成
shell_exec("wkhtmltopdf {$http} {$root_url}");
总结:单页面或者长度在网页上一页的话适用于 pdf.js 或者 dompdf
页面数据较多或者表格数据大适用于 html2ps 或者 wkhtmltopdf
选择其实并没有一个固定的方法,适用自己并且灵活使用才是最好了
参考主方法:
public function wkhtmltopdf(){ //设置最大时间 set_time_limit(0); //参数 $uid= 1; //固定参数(需要装换的页面的地址:一定是不需要登录的页面,比如百度) $http = ""; //固定参数 $realname = ''; //pdf格式 $name = $uid.'_info.pdf'; //文件夹地址 $path = ''; //创建文件夹 if (!is_dir($path)){ mkdir($path, 0777, true); chmod($path,0777); } $root_url = $path .'/'.$name; //引用三方插件生成pdf(注意,大页面可能有加载时间,转换可能不完全,需要设置睡眠时间) exec("wkhtmltopdf {$http} {$root_url}"); $url = config_item('hos_base_url').'/upload/training/file/'.$uid.'/'.$name; $name = $realname.'-证件资料.pdf'; $_name = iconv("UTF-8", "GB2312//IGNORE", $name); $_name = urlencode($_name); //输出结果 var_dump(compact('url','name','root_url','_name')); }