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