Windows环境下PHP-Apache如何向网络共享打印机发送PDF文件?
问题:SYSTEM账户下Apache/PHP无法访问网络共享打印机
基础信息
- 网络共享打印机路径:
\\192.168.0.100\Gprinter GP-3120TL - 运行环境:Apache 2.4、Windows(IP:192.168.0.99)、PHP 8.3
- 手动验证:通过WIN+R打开
\\192.168.0.100,输入账号密码后双击打印机可自动下载并安装驱动,正常使用
已尝试的优化与代码
- 解决PHP执行命令阻塞问题:替换
shell_exec()/exec()为后台执行方式:pclose(popen("start /B ". $commands, "r")); - 解决打印工具GUI残留问题:选用无界面的SumatraPDF.exe,放置于PHP脚本目录
- 最终打印代码:
$printerPath = '\\\\192.168.0.100\\Gprinter GP-3120TL'; $fileToPrint = $_SERVER['DOCUMENT_ROOT'] . "1.pdf"; $commands = "SumatraPDF.exe -print-to \"$printerPath\" -print-settings landscape \"$fileToPrint\" > C:/SumatraPDFlog.txt 2>&1"; pclose(popen("start /B ". $commands, "r"));
异常现象
- 把PHP输出的
$commands内容复制到本地CMD执行,可正常完成打印 - PHP脚本执行时失败,查看日志
C:/SumatraPDFlog.txt显示:No printer found - 打印机列表差异:
- PHP中执行
wmic printer get name仅返回本地虚拟打印机:Name Microsoft XPS Document Writer Microsoft Print to PDF Fax - 本地CMD中执行同一条命令,能正常列出网络共享打印机:
Name Microsoft XPS Document Writer Microsoft Print to PDF Fax \\192.168.0.100\Gprinter GP-3120TL
- PHP中执行
已测试无效的操作
- 在打印机属性的安全选项卡中添加SYSTEM账户权限
- 通过
printmanagement.msc添加网络打印机 - 通过
gpedit.msc配置添加打印机规则
临时有效方案
将Apache 2.4服务的登录账户从默认SYSTEM改为本地管理员账户后,PHP脚本可正常执行打印操作
疑问
- 之前的操作存在哪些错误?
- 为何SYSTEM账户无法访问该网络共享打印机?
内容的提问来源于stack exchange,提问作者ioripalm
相关产品推荐
相关产品推荐

