柔晶美网络工作室

柔晶美网络工作室,倾心于web技术的博客站点

关注我 微信公众号

您现在的位置是: 首页 > 博客日记

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'); // 实现下载用此方法
    }

测试结果较为满意。


文章评论


需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!