如何为Laravel 5.6项目配置打印机实现PDF生成后自动打印?
嘿,这个需求我之前帮不少开发者搞定过,Laravel 5.6里实现PDF生成后自动打印,主要分两种场景——客户端浏览器自动触发打印(最常用,不用折腾服务器打印机)和服务器端直接打印(适合后台自动打印小票这类场景),我给你拆解下具体操作:
方案一:客户端浏览器自动打印(推荐)
这种方式无需在服务器配置打印机,依赖用户浏览器触发打印,灵活度高,适合大多数业务场景。
步骤:
- 用Laravel的PDF生成库(比如
barryvdh/laravel-dompdf或spatie/browsershot)生成PDF,返回允许浏览器在线预览的响应 - 通过前端JS在PDF加载完成后自动调用打印功能
控制器示例(以dompdf为例):
use Barryvdh\DomPDF\Facade as PDF; use Illuminate\Support\Facades\Response; public function generateAndTriggerPrint() { // 准备PDF模板数据 $data = [ 'invoice_number' => 'INV-2024-001', 'amount' => 199.99 ]; // 加载视图生成PDF $pdf = PDF::loadView('pdf.invoice', $data); // 返回PDF的inline响应,让浏览器直接打开而不是下载 return Response::make($pdf->output(), 200, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'inline; filename="invoice.pdf"' ]); }
前端触发打印的两种方式:
方式1:新窗口打开PDF并打印
给用户一个按钮,点击后打开PDF并触发打印(避免浏览器弹窗拦截):<button onclick="printPDF()">打印PDF</button> <script> function printPDF() { const printWindow = window.open('/generate-and-print', '_blank'); printWindow.onload = function() { // 等待PDF加载完成后调用打印 printWindow.print(); // 可选:打印后关闭窗口 setTimeout(() => printWindow.close(), 1000); }; } </script>方式2:iframe嵌入PDF并打印
适合在当前页面隐藏加载PDF并触发打印:<iframe id="pdfIframe" src="/generate-and-print" style="display: none;"></iframe> <script> document.getElementById('pdfIframe').onload = function() { this.contentWindow.print(); }; </script>
注意:部分浏览器会拦截自动打印请求,最好通过用户主动点击按钮触发,而不是页面加载时自动执行。
方案二:服务器端直接打印(适合后台自动打印)
如果需要生成PDF后直接打印到服务器连接的打印机(比如打印快递单、小票),需要先给服务器配置好打印机,再通过PHP执行系统命令触发打印。
步骤:
配置服务器打印机
- Linux系统:安装打印机驱动,添加打印机并设置为默认(或记住打印机名称),确保
www-data用户(PHP执行用户)有打印权限(可将用户加入lpadmin组) - Windows系统:安装打印机驱动,共享打印机,确保PHP执行用户(比如IIS_IUSRS)有打印权限
- Linux系统:安装打印机驱动,添加打印机并设置为默认(或记住打印机名称),确保
生成PDF并保存到服务器
$pdf = PDF::loadView('pdf.invoice', $data); $pdfPath = storage_path('app/temp/invoice.pdf'); // 确保目录存在 if (!file_exists(dirname($pdfPath))) { mkdir(dirname($pdfPath), 0755, true); } $pdf->save($pdfPath);执行系统命令打印PDF
根据服务器操作系统选择对应的命令:use Illuminate\Support\Facades\Log; $pdfPath = storage_path('app/temp/invoice.pdf'); $output = []; $returnCode = 0; // Linux系统:使用lp命令,替换为你的打印机名称 exec(sprintf('lp -d "office_printer" %s', escapeshellarg($pdfPath)), $output, $returnCode); // Windows系统:使用print命令,替换为你的打印机名称 // exec(sprintf('print /D:"HP_LaserJet_Pro" %s', escapeshellarg($pdfPath)), $output, $returnCode); // 检查打印是否成功 if ($returnCode !== 0) { Log::error("PDF打印失败:" . implode(', ', $output)); // 这里可以添加失败后的处理逻辑,比如通知管理员 } else { // 可选:打印完成后删除临时PDF unlink($pdfPath); }
注意:务必使用
escapeshellarg()处理文件路径,避免命令注入风险。
额外提示
- 不管用哪种PDF生成库,核心逻辑都是一致的:要么返回给前端触发打印,要么保存到服务器执行系统命令
- 客户端打印时,建议给用户显示“正在准备打印...”的提示,提升体验
- 服务器端打印要定期清理临时PDF文件,避免占用磁盘空间
内容的提问来源于stack exchange,提问作者SD_Kuma
相关产品推荐
相关产品推荐

