写在前面:最近项目中要使用到导出把网页导出到图表的问题,本来以为随便找一个第三方的东西就可以搞定,不过因为网页中有一些图表,所有遇到了很多的坑,最后决定使用wkhtmltopdf,因为它是用Qt WebKit 引擎做渲染虽然也有一些坑,但是可以满足需求了,下面就是一些记录。
安装wkhtmltopdf
wkhtmltopdf是一个可以执行的二进制文件,使用php调用系统的命令来执行。php用composer可以很容易的安装,也可以在网站上面直接下载然后安装,传送门
// 用到的composer包
https://packagist.org/packages/knplabs/knp-snappy
https://github.com/KnpLabs/snappy
// 项目是用yii1.0开发
https://packagist.org/packages/dmitrivereshchagin/yii-snappy
https://github.com/dmitrivereshchagin/yii-snappy
// 具体的版本
composer require symfony/process 2.8.32
composer require knplabs/knp-snappy 0.4.2
composer require h4cc/wkhtmltopdf-amd64 0.12.x
目前并没有深入的研究很多的用法,先来简单的记录一下,用php的knp-snappy来操作wkhtmltopdf的过程以及遇到的坑。
简单的使用
class CPDF
{
public static function getPdf()
{
Yii::import('application.vendor.autoload', true);
$binaryPath = Yii::app()->params['pdfBinaryPath'];
$pdf = new KnpSnappyPdf($binaryPath);
$pdf->setOption('page-size', 'A3');
$pdf->setOption('no-background', true);
return $pdf;
}
public static function export($fileName, $html)
{
$pdf = self::getPdf();
$pdf = $pdf->getOutputFromHtml($html);
Yii::app()->request->sendFile($fileName, $pdf);
}
}
可能会遇到的坑
1、导出的pdf中没有中文字体,这个是因为需要在系统安装一个字体,现在用的linux,默认的字体路径是/usr/share/fonts,字体文件可以从windows系统中的字体拷贝。
2、导出半截失败,可能是因为网页中包含了相对地址的资源。
3、需要执行的权限,没有权限白扯
4、使用hcharts有一个动画效果,直接导出会出现图表是半个的情况,需要关掉动画的效果。
5、分页标识
<div style="page-break-after:always"></div>
最后附上一个比较详细的说明吧,传送门