从PHP打印到网络打印机

时间:2012-05-21 20:36:59

标签: php printing

直接从php打印到局域网打印机的最佳方法(在我的情况下是现有的pdf)是什么?到目前为止,我一直没有成功地工作,但我不确定进一步追求的方向。我在Windows SBS 2008,PHP 5.3.9上运行Apache。

到目前为止我所知道的方法:

  • 了shell_exec()
  • phpprintipp - 如果能让它发挥作用,这对我来说似乎是最好的方法
  • php_printer.dll - 没有当前 dll存在

看起来这应该是一个简单的任务,有一个广泛接受的方法,但到目前为止,我没有找到它。谢谢!

2 个答案:

答案 0 :(得分:3)

这是一个难以破解的难题。我在Ruby的Windows打印中有过自己的冒险经历,并提出了一些可以通过调用外部命令来解决的潜在解决方案,这些命令在PHP-land system()exec()(不要忘记) escapeshellcmd() / escapeshellarg() - 他们倾向于使这些内容更容易,特别是在Windows上)。所有这些都假设Windows知道打印机,它可以通过名称引用。

  1. 您可以直接将文件重定向到联网打印机,例如:

    copy /b \path\to\filename.pdf > \\Printer_Machine\Printer_Queue
    

    /b开关指定一个二进制文件,但我80%肯定它现在不严格, 在2012年。

  2. 您可以尝试print命令:

    print /d:\\Printer_Machine\Printer_Queue \path\to\filename.pdf
    

    \d代表“设备”。我实际上没有试过这个,我不确定是不是 使用PDF或仅由于其DOS来源,文本文件。

  3. 安装Adobe Reader并使用其命令行工具:

    AcroRd32.exe /t \path\to\filename.pdf "Printer Name" "Driver Name" "Port Name"
    

    我不确定您的服务器环境是否可以容纳Reader,但这是 我最成功的解决方案。你可以找到 documentation here (PDF,第24页)。 Printer NameDriver Name应完全匹配您在中看到的内容 控制面板中的打印机属性。我认为Port_Name通常可以省略。

  4. 使用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有很多很多选项 你可能不得不花一些时间来配置它们。

  5. 最后,一般提示:您可以使用net use命令注册具有设备名称的网络打印机,例如:

    C:\> net use LPT2 \\Printer_Machine\Printer_Queue /persistent:yes
    

    允许您使用LPT2LPT2:代替\\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);
?>