直接从php打印到局域网打印机的最佳方法(在我的情况下是现有的pdf)是什么?到目前为止,我一直没有成功地工作,但我不确定进一步追求的方向。我在Windows SBS 2008,PHP 5.3.9上运行Apache。
到目前为止我所知道的方法:
看起来这应该是一个简单的任务,有一个广泛接受的方法,但到目前为止,我没有找到它。谢谢!
答案 0 :(得分:3)
这是一个难以破解的难题。我在Ruby的Windows打印中有过自己的冒险经历,并提出了一些可以通过调用外部命令来解决的潜在解决方案,这些命令在PHP-land system()
或exec()
(不要忘记) escapeshellcmd()
/ escapeshellarg()
- 他们倾向于使这些内容更容易,特别是在Windows上)。所有这些都假设Windows知道打印机,它可以通过名称引用。
您可以直接将文件重定向到联网打印机,例如:
copy /b \path\to\filename.pdf > \\Printer_Machine\Printer_Queue
/b
开关指定一个二进制文件,但我80%肯定它现在不严格,
在2012年。
您可以尝试print
命令:
print /d:\\Printer_Machine\Printer_Queue \path\to\filename.pdf
\d
代表“设备”。我实际上没有试过这个,我不确定是不是
使用PDF或仅由于其DOS来源,文本文件。
安装Adobe Reader并使用其命令行工具:
AcroRd32.exe /t \path\to\filename.pdf "Printer Name" "Driver Name" "Port Name"
我不确定您的服务器环境是否可以容纳Reader,但这是
我最成功的解决方案。你可以找到
documentation here
(PDF,第24页)。 Printer Name
和Driver Name
应完全匹配您在中看到的内容
控制面板中的打印机属性。我认为Port_Name
通常可以省略。
使用Ghostscript打印。我从来没有试过这个 Windows但是 documentation is here 而且有 more info here。该 命令是这样的:
gswin32.exe -sDEVICE=mswinpr2 -sOutputFile="%printer%Printer Name" \path\to\filename.pdf
mswinpr2
指的是Windows自己的打印驱动程序(参见上面的第二个链接),
“%printer%
”是字面值并且是必需的,而“Printer Name
”应该再次匹配
打印机的名称来自控制面板。 Ghostscript有很多很多选项
你可能不得不花一些时间来配置它们。
最后,一般提示:您可以使用net use
命令注册具有设备名称的网络打印机,例如:
C:\> net use LPT2 \\Printer_Machine\Printer_Queue /persistent:yes
允许您使用LPT2
或LPT2:
代替\\Printer_...
执行大多数命令。
我希望这有用!
答案 1 :(得分:1)
不确定这是否适用于所有打印机,但这可以完成将ZPL文件发送到Zebra标签打印机的工作:
<?php
if(($conn = fsockopen('192.168.10.112',9100,$errno,$errstr))===false){
echo 'Connection Failed' . $errno . $errstr;
}
$data = <<<HERE
^XA
^FT50,200
^A0N,200,200^FDTEST^FS
^FT50,500
^A0N,200,200^FDZebra Printer^FS
^XZ
HERE;
#send request
$fput = fputs($conn, $data, strlen($data));
#close the connection
fclose($conn);
?>