龙空技术网

php实现生成pdf的三种方法

生活点滴没有如果 77

前言:

今天大家对“php文档pdf”可能比较注重,姐妹们都想要学习一些“php文档pdf”的相关资讯。那么小编同时在网上搜集了一些有关“php文档pdf””的相关文章,希望兄弟们能喜欢,小伙伴们一起来了解一下吧!

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

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

1.安装wkhtmtopdf

32位系统:$ composer require h4cc / wkhtmltopdf-i386 0.12.x$ composer require h4cc / wkhtmltoimage-i386 0.12.x64位系统:$ composer require h4cc/wkhtmltopdf-amd64 0.12.x$ composer require h4cc/wkhtmltoimage-amd64 0.12.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:50">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',96);  $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' => 1000, 'ury' =>400),  );        $pdf->AddPage('L', $page_format, false, false);  $pdf->writeHTMLCell(600,0,20,50,$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的方案。选择不同方案的理由也很简单:

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

标签: #php文档pdf