Laravel 5.4 完全开发手册

php实现生成pdf的三种方法

方案一:laravel框架下安装laravel-snappy 直接使用html页面生成PDF 。

静态页面样式容易控制,扩展包底层使用wkhtmltopdf可完美生成pdf 。

1.安装wkhtmtopdf

位系统:
$ composer require h4cc / wkhtmltopdf-i386 .x
$ composer require h4cc / wkhtmltoimage-i386 .x
位系统:
$ composer require h4cc/wkhtmltopdf-amd64 .x
$ composer require h4cc/wkhtmltoimage-amd64 .x

2.复制文件到系统的可执行目录中,并赋予可执行权限

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

3.安装laravel-snappy。安装过程可参考GitHub - barryvdh/laravel-snappy: Laravel Snappy PDF。或者参考扩展包目录下的readme.md文件

composer require barryvdh/laravel-snappy

4.给系统安装中文字体,生成PDF时才不会产生乱码。


function pdf(){
  $unitWidth = &#;1000px&#;;
  $unitHeight = &#;500px&#;;   
  $html = &#;<div style=&#;font-size:&#;>wkhtmltopdf生成PDF</div>&#;;
  $pdf = app()->make(&#;snappy.pdf.wrapper&#;);    
  $pdf->setOption(&#;no-header-line&#;,true);
  $pdf->setOption(&#;no-footer-line&#;,true);   
  $pdf->setOption(&#;disable-smart-shrinking&#;,true);           
  $pdf->setOption(&#;page-width&#;,$unitWidth);
  $pdf->setOption(&#;page-height&#;,$unitHeight);
  $pdf->setOption(&#;orientation&#;,&#;Portrait&#;);    //Landscape | Portrait
  $pdf->setOption(&#;encoding&#;,&#;utf-8&#;); 
  $pdf->setOption(&#;margin-top&#;,&#;0&#;);
  $pdf->setOption(&#;margin-bottom&#;,&#;0&#;);
  $pdf->setOption(&#;margin-left&#;,&#;0&#;);
  $pdf->setOption(&#;margin-right&#;,&#;0&#;);
  $pdf->setOption(&#;dpi&#;,);
  $pdf->loadHtml($html);

  return $pdf->stream(&#;preview&#;);
}

方案二:使用tcpdf扩展生成PDF

composer require tecnickcom/tcpdf

为了能正常显示中文字体,我们可以安装自己需要的字体。

下载SourceHanSansCN-Normal.ttf字体,拷贝到扩展目录vendor\tecnickcom\tcpdf\tools中

php ./tcpdf_addfont.php -t TrueTypeUnicode -i SourceHanSansCN-Normal.ttf


function pdf(){
  $html = &#;<div style=&#;font-size:50px&#;>TCPDF生成PDF</div>&#;;
  require_once app_path(&#;Libs/Tecnickcom/tcpdf/tcpdf.php&#;);

  $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, &#;px&#;, PDF_PAGE_FORMAT, true, &#;UTF-8&#;, true);
  $pdf->setFontSubsetting(false);

  $pdf->setAutoPageBreak(&#;off&#;);
  $pdf->setMargins(0,0,0,true);
 //自定义PDF页面尺寸大小。同一个PDF文件里可以有不同尺寸的页面。
  $page_format = array(
    &#;MediaBox&#; => array (&#;llx&#; => 0, &#;lly&#; => 0, &#;urx&#; => , &#;ury&#; =>),
  );      
  $pdf->AddPage(&#;L&#;, $page_format, false, false);
  $pdf->writeHTMLCell,0,,,$html,1,1,0,true,&#;center&#;);
  echo $pdf->Output(&#;preview.pdf&#;, &#;I&#;);
}

注:字体安装建议使用ttf格式字体。

方案三:使用dompdf生成PDF文件

使用dompdf相对比较简单了。这里也是直接用html页面生成PDF

function pdf()
{
    $filename = &#;test.pdf&#;;    
    $html = view(&#;users.order_download&#;, compact(&#;info&#;));
    $dompdf = new \Dompdf\Dompdf();
    $dompdf->setOptions((new \Dompdf\Options([&#;enable_remote&#; => true, &#;font_dir&#; => storage_path(&#;app/public&#;)])));
    $dompdf->loadHtml($html);
    $dompdf->setPaper(&#;A4&#;, &#;portrait&#;);
    $dompdf->render();
  //将PDF保存到服务器文件
    @file_put_contents(public_path($path), $dompdf->output());   
    return $dompdf->stream($filename, [&#;Attachment&#; => 1]); // 0输出到浏览器  1输出下载响应
}

dompdf如果需要中文字体可以在html文件中使用 css的font-face定义

@font-face {
        font-family: &#;SourceHanSansCN&#;;
        font-style: normal;
        font-weight: normal;
       /*这里需要使用完整的url地址*/
        src: url(&#;{{config(&#;app.url&#;).&#;/fonts/SourceHanSansCN-Normal.ttf&#;}}&#;) format(&#;truetype&#;);
    }

以上就是我在php项目开发中使用的三种生成PDF的方案。选择不同方案的理由也很简单:

  1. 借着项目开发每个方案都试试
  2. wkhtmltopdf真的是样式稳定好控制。
  3. tcpdf完全就是冲着可以有不同尺寸的页面去的,解决中文字体走了好多弯路。
  4. dompdf直接安装就能用,中文字体引入就可以,主要为了试试它对html支持度如何。结论是还不错,生成个产品参数手册很好用。
原文链接:,转发请注明来源!