【问题标题】:PHP to Zebra PrinterPHP 到斑马打印机
【发布时间】:2011-04-15 12:56:11
【问题描述】:

我将这台 Zebra ZM400 打印机连接到网络 (192.168.1.50)。我正在尝试直接从 PHP 将内容推送到这台打印机。

这就是想法,我只是被卡住了,没有任何方法可以做到这一点。我尝试了file_put_contents('192.168.1.50', $content),但没有成功。

如果有人能帮我解决这个问题,我将不胜感激。谢谢你:-)

.................................................. ..................................................... ....................

解决方案:

我使用 LPR 协议打印。无需安装驱动程序或任何东西。 PHP 5 的 LPR 打印类可以从这里下载:

http://www.phpclasses.org/package/2540-PHP-Abstraction-for-printing-documents.html

【问题讨论】:

  • 可能是因为现在使用 Zebra 打印机打印标签的人并不多……
  • @webdestroya - 该打印机用于工业条形码解决方案,我认为我们没有更好的批量打印选择。
  • @Mitch 他们用什么?在我看来,斑马实际上仍然有很多用途。

标签: php zebra-printers network-printers


【解决方案1】:

我很确定仅仅通过套接字推送文本内容根本行不通。

我猜你需要在 lpr 上打印。安装像 CUPS 这样的打印服务器,您可以使用它发送它...

【讨论】:

  • 打印机有一个内部打印服务器。这是否意味着可以发送内容?谢谢。
  • @Nirmal - 打印服务器允许您使用打印驱动程序进行通信。做file_put_contents 永远不会奏效。
  • 我没有安装 Linux 和 CUPS 的机器。刚刚发现内部打印服务器通过 FTP 接受文件。但问题是它只允许主动连接,而 PHP 试图启动被动连接。我将就此提出一个单独的问题并在此处发布链接。感谢您的宝贵时间!
  • 最后我使用了打印机支持的LPR打印协议。 PHP 的 LPR 打印类可以在这里找到:phpclasses.org/package/…
  • 这是一个老问题,但对于以后阅读此文章的任何人来说,只要打印机在网络上,您绝对可以通过套接字将内容直接推送到打印机。您只需要知道打印机的 IP 地址及其端口(对于 Zebra 打印机,通常为 9100)。 Zebra 的支持门户km.zebra.com 提供了此类示例。在这种情况下,您可能希望使用 PHP 的套接字库来实现通信。如果您已经拥有设备的本地语言,通常不需要额外的库(LPR 等)!
【解决方案2】:

看看这些PHP printer functions

注意

这些功能仅在 Windows 9.x、ME、NT4 和 2000 下可用。

【讨论】:

  • 你必须安装一个PECL包。
  • 我在 PHP 5.3 上尝试了 php_printer.dll,它造成了“内存不足”错误的噩梦。你可以在这里阅读整个主题:spinics.net/lists/winphp/msg08651.html
【解决方案3】:

稍后?...

如果您可以访问串行端口:

Linux:

$fpi = fopen('/dev/ttyS0', 'r+'); $comando = " ñ Q70 A40,20,0,2,1,0,N,\"xxx\" B40,40,0,1,2,6,100,N,\"$don\" A40,145,0,3,1,0,N,\"N.- $don \" A40,165,0,2,1,0,N,\"ccc\" A0,198,7,1,1,0,N,\"$fecha\" A19,198,7,1,1,0,N,\"fasdfas\" 磷 "; fwrite($fpi, $comando); fclose($fpi);
  • 这个工作正常

【讨论】:

  • 谢谢!什么都为时已晚。这是完美的,这正是我在后期所做的。一直工作,没有太多花哨的编码。
  • 我利用这个原理,结合 .prn 模板文件上的 str_replace(必须使用打印机字体)并使用 shell_exec(或反引号运算符)运行“lp -d 打印机文件”
【解决方案4】:

我用斑马语言创建了一个文件,过去曾多次使用 FTP 发送该文件。只需保存文件,然后创建与打印机的 ftp 连接,然后使用 put 命令发送 .txt 文件。打印机将完成剩下的工作

【讨论】:

    【解决方案5】:

    我看到您已经获得了使用 LPR 和 FTP 的解决方案,但我几乎可以肯定 Zebra 打印机将接受端口 9100 上的原始 ZPL 文本。

    【讨论】:

      【解决方案6】:

      有关于如何将 ZPL 直接发送到 Zebra 打印机的示例代码:

      https://km.zebra.com/kb/index?page=content&channel=SAMPLE_CODE&cat=ZISV_PL_ZPL

      我在 PHP 中没有看到任何内容,但有一个使用 VB 通过端口 9100 直接与打印机对话的示例。

      【讨论】:

        【解决方案7】:

        我有一个类似的问题,我使用 java 程序在没有打印驱动程序的情况下打印到斑马打印机,并想使用 PHP 重新创建它。找不到答案让我很烦恼。通过Wireshark的一些抓包对比两者,我觉得是可以的。我终于偶然发现了解决方案(至少对我而言)。这将直接从 PHP 页面将标签打印到联网的 Zebra 打印机,无需驱动程序。

        <?php
        error_reporting(E_ALL);
        
        /* Get the port for the service. */
        $port = "9100";
        
        /* Get the IP address for the target host. */
        $host = "172.17.144.89";
        
        /* construct the label */
        $mrn = "123456";
        $registration_date = "03/13/2013";
        $dob = "06/06/1976";
        $gender = "M";
        $nursing_station = "ED";
        $room = "ED01";
        $bed = "07";
        $lastname = "Lastname";
        $firstname = "Firstname";
        $visit_id = "12345678";
        
        $label = "q424\nN\n";
        $label .= "A10,16,0,3,1,1,N,\"MR# " . $mrn . " ";
        $label .= $registration_date . "\"\n";
        $label .= "B10,43,0,3,2,4,50,N,\"" . $mrn . "\"\n";
        $label .= "A235,63,0,3,1,1,N,\" ";
        $label .= $dob . " ";
        $label .= $gender . "\"\n";
        $label .= "A265,85,0,3,1,1,N,\" ";
        $label .= $nursing_station . " ";
        $label .= $room . "-";
        $label .= $bed . "\"\n";
        $label .= "A10,108,0,3,1,1,N,\"";
        $label .= $lastname . ",";
        $label .= $firstname;
        $label .= "\"\n";
        $label .= "A10,135,0,3,1,1,N,\" #" . $visit_id . "\"\n";
        $label .= "B10,162,0,3,2,4,50,N,\"" . $visit_id . "\"\n";
        $label .= "P1\n";
        
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($socket === false) {
            echo "socket_create() failed: reason: " . socket_strerror(socket_last_error    ()) . "\n";
        } else {
            echo "OK.\n";
        }
        
        echo "Attempting to connect to '$host' on port '$port'...";
        $result = socket_connect($socket, $host, $port);
        if ($result === false) {
            echo "socket_connect() failed.\nReason: ($result) " . socket_strerror    (socket_last_error($socket)) . "\n";
        } else {
            echo "OK.\n";
        }
        
        socket_write($socket, $label, strlen($label));
        socket_close($socket);
        
        ?>
        

        【讨论】:

        • 不同的语言(EPL 而不是 ZPL),但正是最初提出问题时原始发帖人可能需要看到的内容。
        • +1 谢谢,埃德温。这就是我最终做的,但在接受原始答案很久之后。感谢您的意见!
        • 这个解决方案帮助我进行了类似的设置。谢谢!
        【解决方案8】:

        这是在连接到网络的 Zebra 打印机上打印的方法: 假设您的打印机位于 IP:192.168.1.50 和标准端口:9100

        <?php 
        if(($conn = fsockopen('192.168.1.50',9100,$errno,$errstr))===false){ 
            echo 'Connection Failed' . $errno . $errstr; 
        } 
        
        $data = ' 
            ^XA 
            ^FT50,200 
            ^A0N,200,200^FDTEST^FS 
            ^FT50,500 
            ^A0N,200,200^FDZebra Printer^FS 
            ^XZ'; 
        
        #send request 
        $fput = fputs($conn, $data, strlen($data)); 
        
        #close the connection 
        fclose($conn); 
        ?> 
        

        这在任何 ZPL 兼容打印机上都能 100% 工作,不仅是 Zebra。 在这个例子中,我们打印一个标签,里面有一个大的 TEST ZEBRA PRINTER

        【讨论】:

          【解决方案9】:

          就我而言(Windows + USB 打印机),我所做的是共享 Zebra 打印机并通过 shell exec 将 LPT1 分配给共享打印机,然后也通过 shell exec 打印一个临时文件。

              $text = "XA^LH30,30^FO20,0^BY3^B2,60^FD00000060^FS^XZ"; //your text to be printed
              $tmpfname = tempnam(sys_get_temp_dir(), 'PRN'); 
              file_put_contents ($tmpfname,$text);
              shell_exec ("NET USE LPT1: \\\\127.0.0.1\\Zebra"); //replace Zebra with your share name
              shell_exec ( "print  /D:LPT1 ".$tmpfname );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多