在日常开发中,经常需要将网页内容、订单信息或报表数据导出为PDF格式。比如电商后台要生成发货单,学校系统要打印成绩单,这些场景下用PHP脚本生成PDF就成了一个刚需。
为什么选择PHP来生成PDF
PHP作为Web开发的老牌语言,生态成熟,配合HTML模板可以快速构建结构化的文档内容。虽然它本身不支持直接输出PDF,但借助第三方库,能轻松实现从字符串、数据库数据到完整排版PDF的转换。
常用的PDF生成库有哪些
目前最流行的两个库是TCPDF和DomPDF。前者纯PHP编写,无需依赖外部环境,适合基础需求;后者能解析CSS样式,更贴近现代前端习惯。
比如用DomPDF,安装只需要一条Composer命令:
composer require dompdf/dompdf然后就可以在脚本里调用:
<?php
require_once 'vendor/autoload.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$html = '<h1>订单详情</h1><p>客户:张三</p><p>金额:¥299</p>';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("order.pdf", ["Attachment" => true]);
?>这段代码会把简单的HTML内容转成一张A4纸大小的PDF,并让浏览器自动下载。
处理中文乱码问题
很多人第一次跑的时候发现中文变成方块,这是因为默认字体不支持。解决方法是引入支持中文的字体,比如微软雅黑或思源黑体。可以在CSS里指定:
<style>
body { font-family: SimSun, serif; }
</style>同时确保服务器上有对应字体文件,或者使用DomPDF内置的字体子集功能打包进文档。
提升生成效率的小技巧
如果要批量生成发票,每次都重新渲染页面会很慢。可以先把HTML模板缓存起来,只替换动态数据部分。另外避免在PDF里加载远程图片,容易因网络延迟导致超时,最好先下载到本地再嵌入。
对于复杂布局,比如表格跨页断行错乱,建议用table标签而不是div+float,DomPDF对传统表格的支持更稳定。
有些项目要求更高的性能和控制力,会选择调用外部工具,比如wkhtmltopdf。它是基于WebKit的命令行工具,能把HTML精准转成PDF。PHP只需执行exec()触发即可:
exec('wkhtmltopdf http://localhost/report.html report.pdf');这种方式速度快,样式还原度高,适合对排版要求严格的场景。
当然也要注意安全,不能让用户随意传入URL执行,否则会有命令注入风险。参数必须严格过滤。