PHP to Zebra Printer
Asked Answered
C

9

12

I have this Zebra ZM400 Printer connected to the network (192.168.1.50). And I am trying to push a content to this printer directly from PHP.

This is the idea and I am just stuck without any way to do this. I tried the file_put_contents('192.168.1.50', $content) but with no success.

Would appreciate if anyone could please help me in sorting out this. Thank you :-)

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

Solution:

I printed using the LPR Protocol. No need to install driver or anything. The LPR Printing Class for PHP 5 can be downloaded from here:

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

Cangue answered 22/9, 2010 at 4:8 Comment(3)
Probably because not many people still use Zebra printers to print labels...Stephanotis
@webdestroya - The printer is for an industrial barcoding solution and I think we are left with no better option for mass printing.Cangue
@Mitch What do they use? It seems to me that Zebras actually still have a great deal of usage.Keverne
S
1

I'm pretty sure just pushing text content over a socket will not work at all.

You will need to print over lpr is my guess. Install a print server like CUPS and you can send it using that...

Stephanotis answered 22/9, 2010 at 4:11 Comment(6)
The printer has an internal print server. Does that mean sending the content is possible? Thanks.Cangue
@Cangue - A print server allows you to communicate using a print driver. Doing file_put_contents will never work.Stephanotis
I don't have a machine to install Linux and CUPS. Just found that the internal Print Server accepts files over FTP. But the trouble is that it only allows active connections while PHP is trying to initiate a passive connection. I shall put up a separate question regarding that and post the link here. Thanks for your time!Cangue
At last I used the LPR printing protocol supported by the printer. The LPR Printing class for PHP can be found here: phpclasses.org/package/…Cangue
This is an old question, but for anyone reading this in the future, you can absolutely push content directly to the printer over sockets as long as the printer is on the network. All you need to know is the printer's IP address and its port (usually 9100 with Zebra printers). Zebra's support portal km.zebra.com has samples of this. In this case, you would likely want to use PHP's socket library to achieve the communication. Generally shouldn't be a need for extra libraries (LPR etc.) if you already have the device's native language!Gael
This is exactly what I do since I print to a barcode printer remotely and there's no VPN setup. Instead the company opened ports on their router and forwarded my connection to the barcode printers they use. To test you can simply telnet to the barcode printer's IP and port then issue the commands directly.Sharp
M
17

I had a similar issue where I was using a java program to print to a zebra printer without a print driver, and wanted to recreate this using PHP. It was bugging me that I couldn't find the answer. Through some packet capturing with Wireshark comparing the two, I felt that it was possible. I finally stumbled into the solution (at least for me). This will print a label to a networked Zebra printer directly from a PHP page without the need for a driver.

<?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);

?>
Morehead answered 11/4, 2013 at 19:5 Comment(4)
Different language (EPL instead of ZPL) but exactly what the original poster likely needed to see when the question was first asked.Gael
+1 Thanks, Edwin. That was what I ended up doing, but long after accepting the original answer. Thanks for the input though!Cangue
This solution helped me with a similar setup. Thanks!Draggle
Thanks so much for this code. Any idea how i can also send a barcode as image or just the data to the printer?Concupiscence
N
5

This is how to print on a Zebra Printer connected to the network: Assuming your printer is at IP: 192.168.1.50 and standard port : 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); 
?> 

This is working 100% on any ZPL compatible printer, not only Zebra. In this Example we print a label with a big TEST ZEBRA PRINTER in it

Needs answered 25/2, 2019 at 10:50 Comment(0)
S
3

I see you've gotten solutions using LPR and FTP, but I'm almost certain the Zebra printers will accept raw ZPL text on port 9100.

Sanjay answered 18/5, 2012 at 20:56 Comment(0)
T
2

Later?...

If you have access to the serial port:

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);


  • THIS WORK FINE
Telepathist answered 11/5, 2012 at 19:4 Comment(2)
Thanks! Nothing is too late. This is perfect and is exactly what I did at a later stage. Works all the time and no too much fancy coding.Cangue
I utilise this principal, in combination with str_replace on .prn template files (must use printer font) and use the shell_exec (or backtick operator) to run the 'lp -d printer file'Timer
S
1

I'm pretty sure just pushing text content over a socket will not work at all.

You will need to print over lpr is my guess. Install a print server like CUPS and you can send it using that...

Stephanotis answered 22/9, 2010 at 4:11 Comment(6)
The printer has an internal print server. Does that mean sending the content is possible? Thanks.Cangue
@Cangue - A print server allows you to communicate using a print driver. Doing file_put_contents will never work.Stephanotis
I don't have a machine to install Linux and CUPS. Just found that the internal Print Server accepts files over FTP. But the trouble is that it only allows active connections while PHP is trying to initiate a passive connection. I shall put up a separate question regarding that and post the link here. Thanks for your time!Cangue
At last I used the LPR printing protocol supported by the printer. The LPR Printing class for PHP can be found here: phpclasses.org/package/…Cangue
This is an old question, but for anyone reading this in the future, you can absolutely push content directly to the printer over sockets as long as the printer is on the network. All you need to know is the printer's IP address and its port (usually 9100 with Zebra printers). Zebra's support portal km.zebra.com has samples of this. In this case, you would likely want to use PHP's socket library to achieve the communication. Generally shouldn't be a need for extra libraries (LPR etc.) if you already have the device's native language!Gael
This is exactly what I do since I print to a barcode printer remotely and there's no VPN setup. Instead the company opened ports on their router and forwarded my connection to the barcode printers they use. To test you can simply telnet to the barcode printer's IP and port then issue the commands directly.Sharp
Y
1

I have created a file in zebra language and used FTP to send the file many times in the past. just save the file and then create an ftp connection to the printer then use the put command to send the .txt file. the printer will do the rest

Yamamoto answered 18/5, 2012 at 20:47 Comment(0)
C
0

There is sample code on how to send ZPL directly to Zebra printers at:

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

I didn't see any in PHP, but there is an example of talking directly to the printer via port 9100 using VB.

Chat answered 31/1, 2013 at 0:22 Comment(0)
A
0

In my case (Windows + USB Printer), what I did was to share the Zebra printer and assign LPT1 to the shared printer via shell exec and then print a temporary file also via shel 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 );
Assembled answered 26/5, 2021 at 23:35 Comment(0)
B
-2

Take a look at these PHP printer functions

Note that

These functions are only available under Windows 9.x, ME, NT4 and 2000.

Balefire answered 22/9, 2010 at 4:16 Comment(2)
And you have to install a PECL package.Progression
I tried the php_printer.dll on PHP 5.3 and it creates a nightmare of 'Out of Memory' errors. You can read the whole thread here: spinics.net/lists/winphp/msg08651.htmlCangue

© 2022 - 2024 — McMap. All rights reserved.