将PHP代码发送到斑马打印机

12
我有一台连接在网络上的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

可能是因为现在很少有人使用斑马打印机来打印标签了... - Mitch Dempsey
1
@Webdestroya - 这台打印机是用于工业条码解决方案的,我认为我们没有更好的选择来进行大规模打印。 - Nirmal
2
@Mitch 他们用什么?在我看来,斑马实际上仍然有很多用途。 - pbreitenbach
9个回答

17

我遇到了类似的问题,当时我在使用Java程序向Zebra打印机打印而没有驱动程序,并希望使用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);

?>

1
不同的语言(EPL而不是ZPL),但这正是原帖发布者在最初提问时可能需要看到的。 - jason.zissman
2
+1 感谢,Edwin。那就是我最终采取的方法,但是在接受原始答案之后很长一段时间。不过还是感谢你的建议! - Nirmal
这个解决方案帮助我解决了类似的设置问题。谢谢! - Cole Busby
非常感谢您提供的代码。您有什么想法,我如何将条形码作为图像或仅将数据发送到打印机? - codeninja

4
这是如何在连接到网络的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打印机。 在这个示例中,我们打印一个标签,上面有一个大大的测试ZEBRA打印机字样。


3

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


2

稍后?...

如果您可以访问串口:

LINUX:

 $fpi = fopen('/dev/ttyS0', 'r+');
$comando = " N 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\" P "; fwrite($fpi, $comando);
fclose($fpi);
  • 这个很好用

1
谢谢!没有太晚的时候。这很完美,正是我后来所做的。一直都有效,并且不需要太多花哨的编码。 - Nirmal
我结合使用这个原则和对 .prn 模板文件的 str_replace(必须使用打印机字体),并使用 shell_exec(或反引号运算符)来运行“lp -d printer file”。 - elzaer

2

我相信仅通过套接字传输文本内容是行不通的。

我的猜测是你需要使用lpr进行打印。安装一个像CUPS这样的打印服务器,你就可以通过它来发送打印任务了...


打印机有内部打印服务器。这是否意味着可以发送内容?谢谢。 - Nirmal
@Nirmal - 打印服务器允许您使用打印驱动程序进行通信。使用 file_put_contents 永远不会起作用。 - Mitch Dempsey
我没有机器来安装Linux和CUPS。刚刚发现内部打印服务器接受通过FTP传输的文件。但问题是它只允许主动连接,而PHP正在尝试建立被动连接。我将提出一个单独的问题,并在此处发布链接。感谢您的时间! - Nirmal
最后我使用了打印机支持的LPR打印协议。PHP的LPR打印类可以在这里找到:http://www.phpclasses.org/package/2540-PHP-Abstraction-for-printing-documents.html - Nirmal
5
这是一个老问题,但是对于未来阅读此内容的任何人来说,只要打印机接入了网络,就可以通过套接字直接推送内容到打印机。您需要知道的只是打印机的IP地址和端口(Zebra打印机通常为9100)。Zebra的支持门户网站http://km.zebra.com提供了相关示例。在这种情况下,您可能想使用PHP的套接字库来实现通信。如果您已经知道设备的本地语言,则通常不需要额外的库(如LPR等)! - jason.zissman
这正是我所做的,因为我远程打印到条形码打印机,而且没有设置VPN。相反,公司在他们的路由器上开放了端口,并将我的连接转发到他们使用的条形码打印机。要进行测试,您只需telnet到条形码打印机的IP和端口,然后直接发出命令即可。 - Darryl

1

我曾经使用Zebra语言创建过一个文件,并多次使用FTP发送该文件。只需保存文件,然后创建到打印机的FTP连接,再使用put命令发送.txt文件即可。剩下的工作就交给打印机了。


0
在我的情况下(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 );

0

-2

看一下这些 PHP 打印函数

请注意

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


你需要安装一个PECL包。 - NullUserException
我在 PHP 5.3 上尝试使用 php_printer.dll,结果出现了一系列“内存不足”的错误,简直是噩梦。你可以在这里阅读整个讨论线程:http://www.spinics.net/lists/winphp/msg08651.html - Nirmal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接