Laravel 使用 laravel-snappy 包 实现 HTML 转 PDF 和 PNG

由于公司要开发一个新的工具叫做云合同,可以预设好几套固定的合同模板(html 页面),使用参数填充方式将合同内的数据灵活变化,然后生成 PDF 和 PNG

查阅一番我们发现了 laravel-snappy 这个包,底层使用的是 wkhtmltopdf,wkhtmltopdf 是构建于 QT Webkit 之上,而 QT Webkit 又是基于 Webkit 的,跟我们的浏览器一样的渲染引擎。


Centos7 安装 wkhtmltopdf

1、先查看系统是 32 位的还是 64 位的


uname -a

2、通过 composer 安装 wkhtmltopdf


32位:

$ composer require h4cc / wkhtmltopdf-i386 0.12.x

$ composer require h4cc / wkhtmltoimage-i386 0.12.x

64位:

$ composer require h4cc/wkhtmltopdf-amd64 0.12.x

$ composer require h4cc/wkhtmltoimage-amd64 0.12.x

3、接下来将安装好的 wkhtmltopdf 复制到 Linux 系统可执行命令的目录中


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

Centos8 安装 wkhtmltopdf

1、官网地址


https://wkhtmltopdf.org/downloads.html

2、下载


wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos8.x86_64.rpm

3、安装


[root@blog source]# rpm -ivh wkhtmltox-0.12.5-1.centos8.x86_64.rpm

error: Failed dependencies:

        xorg-x11-fonts-75dpi is needed by wkhtmltox-1:0.12.5-1.centos8.x86_64

        xorg-x11-fonts-Type1 is needed by wkhtmltox-1:0.12.5-1.centos8.x86_64

报错了,先把有依赖的两个包安装好


[root@blog source]# dnf install xorg-x11-fonts-75dpi

[root@blog source]# dnf install xorg-x11-fonts-Type1

//若 dnf 安装时最后报错 Error: GPG check FAILED 

dnf install xorg-x11-fonts-75dpi  --nogpgcheck 

dnf install xorg-x11-fonts-Type1  --nogpgcheck

再次安装就 OK 了


[root@blog source]# rpm -ivh wkhtmltox-0.12.5-1.centos8.x86_64.rpm

Verifying...                          ################################# [100%]

Preparing...                          ################################# [100%]

Updating / installing...

   1:wkhtmltox-1:0.12.5-1.centos8     ################################# [100%]

Laravel 安装 snappy

composer require barryvdh/laravel-snappy

配置

1、将 ServiceProvider 添加到 config/app.php 中的 providers 数组中


Barryvdh\Snappy\ServiceProvider::class,

2、将 Facades 添加到 config/app.php 中的 aliases 数组中


'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,

'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,

3、生成配置文件


php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

注意:config 文件夹中的 snappy.php 就是其配置文件,binary 指向的就是上面安装的 wkhtml 相关路径.


使用

PDF

//一、下载

$pdf = \PDF::loadView('welcome', $data);

return $pdf->download('welcome.pdf');


//二、渲染页面,在浏览器中显示

$html = '<html><head><meta charset="utf-8"></head><h1>订单id</h1><h2>12346546</h2></html>';

$pdf = \PDF::loadHTML($html);

return $pdf->inline();


//三、渲染页面,在浏览器中显示,并且保存到本地

$html = '<html><head><meta charset="utf-8"></head><h1>订单id</h1><h2>12346546</h2></html>';

return \PDF::loadHTML($html)->save("wkhtmltopdf.pdf")->inline("wkhtmltopdf.pdf");

Image

//一、下载

$img = \SnappyImage::loadView('welcome', $data);

return $img->download('welcome.png');


//二、渲染页面,在浏览器中显示

$html = '<html><head><meta charset="utf-8"></head><h1>订单id</h1><h2>12346546</h2></html>';

$img = \SnappyImage::loadHTML($html);

return $img->inline();


//三、渲染页面,在浏览器中显示,并且保存到本地

$html = '<html><head><meta charset="utf-8"></head><h1>订单id</h1><h2>12346546</h2></html>';

return \SnappyImage::loadHTML($html)->save("wkhtmltoimage.png")->inline("wkhtmltoimage.png");

更换字体

我们生成的 html 如果要更换字体,首先要保证服务器中有该字体,参照下方的踩坑记录中安装字体一节,然后在 html 中用 css 写入 font-family 样式


font-family 的值就是字体的英文名字


生成 pdf 及 image 时可选的 option 参数

这些参数在网上找不到最全的讲解,但是源码中肯定是最全的,在 knplabs/knp-snappy 包中有 image 和 pdf 更详细的参数讲解



使用 wkhtmltoimage 时,默认生成的图片都很模糊,如何调整图片的清晰度

引用该博文


wkhtmltoimage

    --disable-smart-width \

    --zoom 3.125 \

    --width 3125 \

    <input-url> \

    <output-file>

踩坑记录

一、当执行生成时若提示 libXrender 或 libssl 库不存在需要安装相对应库


//apt-get 安装方法

apt-get install libXrender*

apt-get install libssl*


//yum 安装方法

yum install libXrender*

yum install libssl*


//若 yum 安装时最后报错 Error: GPG check FAILED

yum install libXrender* --nogpgcheck

yum install libssl* --nogpgcheck


如果报这个错


apt-get install fontconfig



apt-get install libXext*

二、中文显示乱码问题,这个问题需要在 Linux 中安装中文字体即可解决

三、Centos7.6 的安装方式可以直接通过 composer,而 Centos8 需要 0.12.5 版本的 wkhtmltopdf,并且安装方式为 rpm,这个需要注意下


博客:PDF 扩展包使用

博客:Laravel HTML 导出 PDF 方案 ----- wkhtmltopdf Laravel-snappy

使用 wkhtmltopdf 生成出来乱码,是因为服务器中没装中文字体

www.cnblogs.com/huangyanqi/p/10609...

在公司测试服务器的 lnmp_php 容器中使用 yum install 安装包报错 Error: GPG heck FAILED

blog.csdn.net/qq_41919792/article/...

安装之后,执行操作,若提示 “wkhtmltopdf: cannot connect to X server” 错误

www.023dns.com/server_ECS/2190.html

无法解析 SSLv3_client_method / SSLv3_server_method

问答:Laravel-snappy 在服务器执行的时候报如下错误,本地正常,求解?

github.com/wkhtmltopdf/wkhtmltopdf...

Centos8 使用 wkhtmltopdf

www.cnblogs.com/architectforest/p/...


讨论 dompdf 和 wkhtmltopdf

问答:关于 DomPDF 导出中文乱码问题


————————————————

原文作者:邢闯洋

转自链接:https://learnku.com/articles/50557

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。


有话要说