美文网首页
Laravel Html 导出 PDF 方案 ----- wk

Laravel Html 导出 PDF 方案 ----- wk

作者: 叶柏寿 | 来源:发表于2018-11-29 17:50 被阅读0次

    Ubuntu 16.04

    需求:将复杂的展示页(包含大量echarts)转换成 PDF 供客户下载

    一、下载 wkhtmltopdf

    网址 https://wkhtmltopdf.org/
    这里注意选择和自己服务器版本匹配的包
    我的服务器是 ubunutu 16.04 64位 getconf LONG_BIT #查看位数
    所以下载 Ubuntu 16.04 (xenial) amd64

    执行代码下载包
    wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox_0.12.5-1.xenial_amd64.deb

    安装.deb格式包
    dpkg -i wkhtmltox_0.12.5-1.xenial_amd64.deb
    如果提示缺少库的话,安装对应的库
    apt-get install libXrender*
    apt-get install libssl*

    二、安装 laravel-snappy 扩展包

    composer require barryvdh/laravel-snappy

    将ServiceProvider添加到config / app.php中的providers数组
    Barryvdh\Snappy\ServiceProvider::class,

    添加facade到config / app.php中的aliases数组中
    'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
    'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,

    生成配置文件
    php artisan vendor:publish"
    具体配置如下

    <?php
    return array(
        'pdf' => array(
            'enabled' => true,
            'binary'  => '/usr/local/bin/wkhtmltopdf',    
            'timeout' => false,
            'options' => array(),
            'env'     => array(),
        ),
        'image' => array(
            'enabled' => true,
            'binary'  => '/usr/local/bin/wkhtmltoimage',
            'binary'  => 'G:\wk\wkhtmltopdf\bin\wkhtmltoimage',
            'timeout' => false,
            'options' => array(),
            'env'     => array(),
        ),
    ); 
    

    三、使用

    # 下载
    $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();
    

    四、踩坑

    中文字体问题
    如果 windows 里的字体文件有 C:\Windows\Fonts\simsun.ttc ,直接上传到服务器里的 /usr/share/fonts
    如果没有 simsun.ttc 这个字体文件,下载一个上传

    关于 Js 不生效问题
    我需要转成 pdf 的页面有大量的 echarts 图表, 有大量的 js 控制,开始一个图表都没有显示,然后断点测试法,发现我 js 里有一段代码是用的 let 声明的变量,改成 var 就好了。
    所以,wkhtmltopdf 不支持 ecs6

    PDF 分页问题
    使用 css 的 page-break-after:always;page-break-inside:aovid;

    相关文章

      网友评论

          本文标题:Laravel Html 导出 PDF 方案 ----- wk

          本文链接:https://www.haomeiwen.com/subject/dcnfcqtx.html