centos7+laravel使用laravel-snappy将html转换为pdf的方法
2021-08-11 admin laravel linux 1152
目前遇到的需求,在富文本编辑器的,用户输入的内容,需要合并后转换为pdf供用户查看和下载。laravel中最常用的tcpdf,功能强大,但在使用中发现解析html和css功能很弱,经常出现???这种符号。
// 设置文档信息
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
$pdf->SetCreator('Hello world');
$pdf->SetAuthor('dyk');
$pdf->SetTitle($data->title.'导学案');
$pdf->SetSubject($data->title.'导学案');
$pdf->SetKeywords('导学案, PDF');
// 设置页眉信息
$pdf->SetHeaderData('tcpdf_logo.jpg', 30, '《'.$data->title.'》导学案', '', [0, 64, 255],'');
// 设置页眉字体
$pdf->setHeaderFont(['stsongstdlight', '', '19']);
// 设置默认等宽字体
$pdf->SetDefaultMonospacedFont('courier');
// 设置间距
$pdf->SetMargins(15, 15, 15);//页面间隔
$pdf->SetHeaderMargin(5);//页眉top间隔
$pdf->SetFooterMargin(10);//页脚bottom间隔
// 设置分页
$pdf->SetAutoPageBreak(true, 25);
// 设置自动换页
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// 设置图像比例因子
$pdf->setImageScale(1.25);
// 设置默认字体构造子集模式
$pdf->setFontSubsetting(true);
// 设置字体 stsongstdlight支持中文
$pdf->SetFont('stsongstdlight', '', 14);
// 添加一页
$pdf->AddPage();
$pdf->Ln(5);//换行符
$pdf->writeHTML($html, true, false, true, false, '');
//I输出、D下载,F:在服务器生成pdf
ob_clean();
$pdf->Output(public_path($data->title.'导学案.pdf'), 'F');
后来测试了laravel-dompd,因当时未想到html编码问题,导致一样出现乱码,于是换成了安装较复杂的laravel-snappy,测试成功。现将过程记录下来:
安装库
yum install libXrender*
yum install libfontconfig*
安装扩展
composer require h4cc/wkhtmltopdf-amd64 0.12.x
composer require h4cc/wkhtmltoimage-amd64 0.12.x
cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/
cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/
chmod +x /usr/local/bin/wkhtmltoimage-amd64
chmod +x /usr/local/bin/wkhtmltopdf-amd64
安装laravel-snappy扩展包
composer require barryvdh/laravel-snappy
生成配置文件
php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
文件内容如下:
return [
'pdf' => [
'enabled' => true,
'binary' => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf-amd64'), // linux 配置路径
// 'binary' => env('WKHTML_PDF_BINARY', 'G:\wk\wkhtmltopdf\bin\wkhtmltopdf\wkhtmltopdf-amd64'), // windows 配置路径
'timeout' => false,
'options' => [],
'env' => [],
],
'image' => [
'enabled' => true,
'binary' => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage-amd64'), // linux 配置路径
// 'binary' => env('WKHTML_IMG_BINARY', 'G:\wk\wkhtmltopdf\bin\wkhtmltopdf\wkhtmltoimage-amd64'), // windows 配置路径
'timeout' => false,
'options' => [],
'env' => [],
],
];
在.env中添加路径:
WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64
安装中文字体:
yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
使用方法:
use PDF;
use SnappyImage;
$file = public_path('aa.pdf');
if(file_exists($file))unlink($file);
ob_clean();
PDF::loadHTML($html)->setOption('encoding', 'utf-8')->setPaper('a4')->save($file);
return $this->response()->download(url('aa.pdf'));
注意关键点:html中的meta必须使用utf-8,否则会出现中文乱码。
另外,还可以直接读取网页,进行 inline 的预览:
PDF::loadFile('https://www.baidu.com/')->inline('github.pdf');
或使用 blade 模板引擎,生成 pdf 文件
public function pdf3()
{
$pdf = PDF::loadView('v2.pdf.view_test', array(
'h1' => 'English Test',
'h2' => 'Test Number123456',
'h3' => '测试中文',
));
$pdf->setOption('encoding', 'utf-8');
return $pdf->download('invoice.pdf');
}
生成图片也行:
/**
* 图片生成
*
* 利用 blade 模板,生成文件
*/
public function img1()
{
$pdf = SnappyImage::loadView('v2.pdf.view_test', array(
'h1' => 'English Test',
'h2' => 'Test Number123456',
'h3' => '测试中文,和标点符号',
));
$pdf->setOption('encoding', 'utf-8');
return $pdf->stream('image.jpg'); // 实现预览用此方法
// return $pdf->download('invoice.image.jpg'); // 实现下载用此方法
}
测试结果较为满意。