You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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打印服务管理所有打印机:

  1. 安装CUPS:apt install cups(Debian/Ubuntu)或yum install cups(CentOS/RockyLinux),通过CUPS管理后台添加IP/共享打印机,执行lpstat -p可查看所有可用打印机名称
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:39:03