作为程序员一定要保持良好的睡眠,才能好编程

基于laravel-snappy pdf微服务 html转pdf html转图片

发布时间:2020-04-28


一、通过composer下载laravel框架


composer create-project --prefer-dist laravel/laravel laravel-pdf


cd laravel-pdf


安装依赖

yum install libXrender* 
yum install libssl*
yum install libXext*
yum  install libfontconfig*



二、新增barryvdh/laravel-snappy  、h4cc/wkhtmltoimage-amd64、h4cc/wkhtmltopdf-amd64 包文件


"barryvdh/laravel-snappy": "^0.4.6",
"h4cc/wkhtmltoimage-amd64": "0.12.x",
"h4cc/wkhtmltopdf-amd64": "0.12.x",


image.png


执行composer update


三、配置laravel-snappy 扩展包

          打开config/app.php  将  Barryvdh\Snappy\ServiceProvider::class,  添加到 provider数组中

         image.png


         添加facade到config / app.php中的aliases数组中 


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

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


          image.png

        

四、通过pushlish 发布pdf配置


php artisan vendor:publish

image.png


打开 /config/snappy.php 修改成如下配置:


image.png


     'pdf' => [
        'enabled' => true,        
        'binary' => base_path('vendor' . DIRECTORY_SEPARATOR . 'h4cc' . DIRECTORY_SEPARATOR . 'wkhtmltopdf-amd64' 
        . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'wkhtmltopdf-amd64'),
        'timeout' => false,
        'options' => [],
        'env'     => [],
    ],
    
    'image' => [
        'enabled' => true,        
        'binary' => base_path('vendor' . DIRECTORY_SEPARATOR . 'h4cc' . DIRECTORY_SEPARATOR . 'wkhtmltoimage-amd64' 
        . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'wkhtmltoimage-amd64'),
        'timeout' => false,
        'options' => [],
        'env'     => [],
    ],



五、生成pdf 


为了方便,使用功能测试进行pdf文件生成:


1、首先创建PdfTest测试类

      [root@iz25vpndgurz laravel-pdf]# php artisan make:test PdfTest

      Test created successfully.

      image.png


2、创建pdfCreate方法


public function testPdfCreate(){

$htmlContent=<<<TOT

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <style>
    h1{ 
        color:red;
    }   
    .hh{
        color: aqua;
        font-weight: bold;
    }   
    </style>
</head>
<body>
    <h1>title h1</h1>
    <p class="hh">this is content</p>
   <h2>hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh</h2>
</body>
</html>
TOT;
             
         $pdf = app('snappy.pdf.wrapper')->loadHTML($htmlContent)->setOption('dpi', 300)->setOption('margin-bottom','10')
             ->setOption('margin-left','0')->setOption('margin-right','0')->setOption('margin-top','10')
             ->setOption('page-offset','1')->setOption('page-height','100');
         $res = $pdf->save('aa.pdf',true);
         $this->assertIsBool(true);
 }




执行 PdfTest 中的 testPdfCreate方法

./vendor/bin/phpunit tests/Feature/PdfTest --filter testPdfCreate


image.png



image.png



sz  aa.pdf 下载到本地


image.png


支持中文:

将字体文件上传至 /usr/share/fonts



./vendor/bin/phpunit tests/Feature/PdfTest --filter testPdfCreate

image.png

效果如图:





六、生成图片

public function testImgCreate(){

$htmlContent=<<<TOT

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <style>
    h1{
        color:red;
    }
    .hh{
        color: aqua;
        font-weight: bold;
    }
    </style>
</head>
<body>
    <h1>title h1 我是标题   这是生成的图片</h1>
    <p class="hh">this is content</p>
   <h2>hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh图片图片hhhhhhhhhhh</h2>
</body>
</html>
TOT;

         $pdf = app('snappy.image.wrapper')->loadHTML($htmlContent);
         $res = $pdf->save('aa.jpg',true);
         $this->assertIsBool(true);

    }



./vendor/bin/phpunit tests/Feature/PdfTest --filter testImgCreate

image.png



 image.png





七、编写方法通过url形式生成pdf文件


使用接口的方式访问,返回生成对应pdf文件的路径


针对目录下的文件,开启脚本,对文件进行隔天删除,否则占用空间。



文件查找 推荐一个包: symfony/finder



我的博客另一篇文章:

安装 laravel-snappy 扩展包 生成pdf、图片文件 

踩坑经验- 中文字体支持

http://www.xiaosongit.com/index/detail/id/865.html






pdf其他属性:


/**
 * -options: array:132 [
 * "collate" => null
 * "no-collate" => null
 * "cookie-jar" => null
 * "copies" => null
 * "dpi" => null
 * "extended-help" => null
 * "grayscale" => null
 * "help" => null
 * "htmldoc" => null
 * "ignore-load-errors" => null
 * "image-dpi" => null
 * "image-quality" => null
 * "license" => null
 * "log-level" => null
 * "lowquality" => true
 * "manpage" => null
 * "margin-bottom" => null
 * "margin-left" => null
 * "margin-right" => null
 * "margin-top" => null
 * "orientation" => null
 * "page-height" => null
 * "page-size" => null
 * "page-width" => null
 * "no-pdf-compression" => null
 * "quiet" => null
 * "read-args-from-stdin" => null
 * "readme" => null
 * "title" => null
 * "use-xserver" => null
 * "version" => null
 * "dump-default-toc-xsl" => null
 * "dump-outline" => null
 * "outline" => null
 * "no-outline" => null
 * "outline-depth" => null
 * "output-format" => null
 * "allow" => null
 * "background" => null
 * "no-background" => null
 * "bypass-proxy-for" => null
 * "cache-dir" => null
 * "checkbox-checked-svg" => null
 * "checkbox-svg" => null
 * "cookie" => null
 * "custom-header" => null
 * "custom-header-propagation" => null
 * "no-custom-header-propagation" => null
 * "debug-javascript" => null
 * "no-debug-javascript" => null
 * "default-header" => null
 * "encoding" => null
 * "disable-external-links" => null
 * "enable-external-links" => null
 * "disable-forms" => null
 * "enable-forms" => null
 * "images" => null
 * "no-images" => null
 * "disable-internal-links" => null
 * "enable-internal-links" => null
 * "disable-javascript" => null
 * "enable-javascript" => null
 * "javascript-delay" => null
 * "keep-relative-links" => null
 * "load-error-handling" => null
 * "load-media-error-handling" => null
 * "disable-local-file-access" => null
 * "enable-local-file-access" => null
 * "minimum-font-size" => null
 * "exclude-from-outline" => null
 * "include-in-outline" => null
 * "page-offset" => null
 * "password" => null
 * "disable-plugins" => null
 * "enable-plugins" => null
 * "post" => null
 * "post-file" => null
 * "print-media-type" => null
 * "no-print-media-type" => null
 * "proxy" => null
 * "proxy-hostname-lookup" => null
 * "radiobutton-checked-svg" => null
 * "radiobutton-svg" => null
 * "redirect-delay" => null
 * "resolve-relative-links" => null
 * "run-script" => null
 * "disable-smart-shrinking" => null
 * "enable-smart-shrinking" => null
 * "ssl-crt-path" => null
 * "ssl-key-password" => null
 * "ssl-key-path" => null
 * "stop-slow-scripts" => null
 * "no-stop-slow-scripts" => null
 * "disable-toc-back-links" => null
 * "enable-toc-back-links" => null
 * "user-style-sheet" => null
 * "username" => null
 * "viewport-size" => null
 * "window-status" => null
 * "zoom" => null
 * "footer-center" => null
 * "footer-font-name" => null
 * "footer-font-size" => null
 * "footer-html" => null
 * "footer-left" => null
 * "footer-line" => null
 * "no-footer-line" => null
 * "footer-right" => null
 * "footer-spacing" => null
 * "header-center" => null
 * "header-font-name" => null
 * "header-font-size" => null
 * "header-html" => null
 * "header-left" => null
 * "header-line" => null
 * "no-header-line" => null
 * "header-right" => null
 * "header-spacing" => null
 * "replace" => null
 * "cover" => null
 * "toc" => null
 * "disable-dotted-lines" => null
 * "toc-depth" => null
 * "toc-font-name" => null
 * "toc-l1-font-size" => null
 * "toc-header-text" => null
 * "toc-header-font-name" => null
 * "toc-header-font-size" => null
 * "toc-level-indentation" => null
 * "disable-toc-links" => null
 * "toc-text-size-shrink" => null
 * "xsl-style-sheet" => null
 */