PHP Laravel跨设备打印求助:如何向其他机器的打印机输出?
部署服务器后无法跨机器打印条码的解决方案
问题背景
本地环境下使用mike42/escpos-php包的以下代码可正常打印条码:
use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Mike42\Escpos\PrintConnectors\WindowsPrintConnector; use Mike42\Escpos\Printer; class PrintBarCodeController extends Controller { public function printBarcode(Request $request) { try { // Initialize the WindowsPrintConnector with the COM port and baud rate $connector = new WindowsPrintConnector("COM1"); // Create a new Printer object and assign the connector to it $printer = new Printer($connector); $zplCode = "90809283048"; $printer->textRaw($zplCode); // Cut the paper $printer->cut(); // Close the connection to the printer $printer->close(); return response()->json( ['message' => 'ZPL code printed successfully', ], 200); } catch (\Exception $e) { // Handle any exceptions that may occur during the printing process return response()->json(['message' => 'Error printing ZPL code: ' . $e->getMessage()]); } } }
但将项目部署到本地服务器后,无法向连接在其他机器上的打印机打印。已安装Zebra Printer驱动,并使用EPSON Virtual Port Assignment Tool将打印机的USB005端口映射为COM1,问题仍未解决。
排查与解决步骤
1. 确认打印机的网络共享状态
- 连接打印机的客户端机器必须将打印机设置为共享状态:
- 打开「控制面板」→「设备和打印机」
- 右键目标打印机,选择「打印机属性」→「共享」选项卡
- 勾选「共享这台打印机」,设置共享名称(例如
Zebra_Label_Printer)
- 在服务器的「运行」中输入
\\客户端IP\共享打印机名称,测试是否能正常打开打印机队列,确认网络连通性。
2. 替换WindowsPrintConnector的连接字符串
本地用COM端口是因为打印机直连本地,但服务器要访问客户端的共享打印机,不能用COM端口,需改用共享打印机路径:
// 替换原有的COM1连接,改为共享打印机路径 $connector = new WindowsPrintConnector("\\\\客户端IP\\共享打印机名称"); // 示例:$connector = new WindowsPrintConnector("\\\\192.168.1.100\\Zebra_Label_Printer");
3. 配置跨机器访问权限
- 服务器运行PHP的进程(如IIS应用池账户、Apache服务账户)必须拥有访问客户端共享打印机的权限:
- 在客户端机器的共享打印机权限设置中,添加服务器的服务账户,并赋予「打印」权限
- 确保服务器和客户端在同一局域网,且双方防火墙开启「文件和打印机共享」规则
4. 修正ZPL指令格式
当前代码中textRaw传入的纯数字不是有效的ZPL指令,Zebra打印机需要完整的ZPL格式才能生成条码,示例:
$zplCode = "^XA^FO50,50^BY3^BCN,100,Y,N^FD90809283048^FS^XZ"; $printer->textRaw($zplCode);
该指令会生成内容为90809283048的CODE-128条码。
5. 纠正端口映射的误区
你在客户端机器做的COM1端口映射仅对客户端本地有效,服务器无法直接访问客户端的COM端口,必须通过网络共享方式访问打印机。
内容的提问来源于stack exchange,提问作者JInx
相关产品推荐
相关产品推荐

