如何在PHP开发的Web应用中使用多台网络共享或IP打印机
基于PHP的Web应用接入打印机实现方案
方案选型
根据业务场景可以选择两种实现路径:
- 前端触发打印:适合打印操作由用户主动发起的轻量场景,无需服务端对接打印机硬件
- 后端发起打印:适合无人值守、系统自动触发打印的场景,需要服务端可访问目标打印机
前端触发打印实现
只要用户终端已经提前配置好对应的IP打印机/局域网共享打印机,直接调用浏览器原生打印能力即可,无需适配打印机类型:
- 实现逻辑:将待打印内容(订单、报表等)渲染为标准DOM或者生成PDF文件,调用浏览器打印API唤起打印弹窗,用户自行选择目标打印机完成打印
- 示例代码:
// 打印指定DOM区域 function printArea(domId) { const printDom = document.getElementById(domId); const iframe = document.createElement('iframe'); iframe.style.position = 'absolute'; iframe.style.width = '0'; iframe.style.height = '0'; iframe.style.left = '-9999px'; document.body.appendChild(iframe); const iframeDoc = iframe.contentWindow.document; iframeDoc.write(printDom.innerHTML); iframeDoc.close(); iframe.contentWindow.focus(); iframe.contentWindow.print(); document.body.removeChild(iframe); }
如果是打印后端生成的PDF,直接将PDF流加载到iframe后触发打印即可。
后端发起打印实现
前置配置(服务端)
需要先在PHP部署的服务器上完成所有目标打印机的配置,确保服务器本身可正常发送打印任务:
- IP打印机:输入打印机的IP、端口,安装对应型号的驱动完成添加
- 局域网共享打印机:确保服务器和共享打印机所在主机在同一网段,通过SMB协议访问共享路径(Windows格式为
\\主机IP\共享打印机名,Linux格式为smb://主机IP/共享打印机名)完成添加,同时配置权限确保PHP运行进程用户(如www-data、apache、IIS应用池用户)有打印机访问权限
不同环境的代码实现
Windows服务器环境
可直接调用系统print命令发起打印:
<?php // 服务器配置的打印机名称,共享打印机直接填共享名即可 $printer = 'HP_LaserJet_M426dw'; // 待打印文件绝对路径,可先用TCPDF/MPDF等库生成动态PDF $printFile = 'D:\print_temp\order_001.pdf'; $command = sprintf('print /D:"%s" "%s"', $printer, $printFile); exec($command, $output, $returnCode); if ($returnCode === 0) { echo "打印任务已提交"; } else { echo "打印提交失败,错误码:" . $returnCode; } ?>
Linux服务器环境
需先安装CUPS打印服务管理所有打印机:
- 安装CUPS:
apt install cups(Debian/Ubuntu)或yum install cups(CentOS/RockyLinux),通过CUPS管理后台添加IP/共享打印机,执行lpstat -p可查看所有可用打印机名称 - PHP调用
lp命令发起打印:
<?php // CUPS中配置的打印机名称 $printer = 'HP_LaserJet_M426dw'; // 待打印文件绝对路径 $printFile = '/data/print_temp/order_001.pdf'; $command = sprintf('lp -d %s %s', escapeshellarg($printer), escapeshellarg($printFile)); exec($command, $output, $returnCode); if ($returnCode === 0) { echo "打印任务已提交"; } else { echo "打印提交失败,错误信息:" . implode(',', $output); } ?>
注意事项
- 后端打印场景下建议新增打印任务队列,比如用Redis存储待打印任务,单独起消费进程处理打印请求,避免并发打印导致任务丢失,同时可记录每个任务的打印状态
- 需严格校验待打印文件的来源和权限,避免未授权的打印请求消耗资源
- PHP禁用了exec、shell_exec等函数的话,需要先在php.ini中解除相关函数的禁用
内容的提问来源于stack exchange,提问作者alam_drupal
相关产品推荐
相关产品推荐

