Печать на принтер Zebra в php

Ищете правильный код для печати с веб-страницы php на IP-принтер zebra с использованием порта RAW 9100. Кто-нибудь знает, возможно ли это? Мне нужно отправить строку в формате ZPL прямо на принтер этикеток ZM400. Я искал высоко и низко, самое близкое, что я нашел, это: Печать напрямую на сетевой принтер с помощью php

Это кажется очень близким к тому, что мне нужно, но когда моя php-страница попадает в этот код, она ничего не делает. Вот код, который я использовал:

<?php 
     $handle = printer_open('\\\\192.168.2.206:9100\\'); 
     printer_set_option($handle, PRINTER_MODE, "RAW");
     printer_write($handle, "TEXT To print"); 
     printer_close($handle);
?>

person user2070092    schedule 13.02.2013    source источник


Ответы (5)


Если вы хотите отправить ZPL на принтер, вам не обязательно нужна специальная библиотека печати. Вам просто нужно открыть сокет для этого принтера и напрямую отправить ZPL. Это скорее общий вопрос о связи сокетов PHP, а не вопрос о конкретном принтере.

Если сервер, на котором размещено ваше веб-приложение, и принтеры находятся в одной сети, вы сможете открыть сокет и отправить ZPL. Однако если ваши принтеры и сервер веб-приложений находятся в разных сетях, вы не сможете печатать через сокеты на принтере этой модели без дополнительных подключаемых модулей или дополнений для браузера. Вообще говоря, доступ к удаленному принтеру (или любому устройству) через веб-сайт представляет собой угрозу безопасности.

person jason.zissman    schedule 14.02.2013
comment
Ну это было бы идеально! Есть ли ссылка, которую вы бы порекомендовали для печати сокетов в PHP? Это действительно все, что мне нужно. Все внутри, в одной сети. Я знаю, что мой Zebra ZM400 может печатать через сокеты. В настоящее время мы делаем что-то подобное из небольшого приложения Access для печати этикеток отчетов. Я просто не вижу хороших примеров реализации на PHP. Кажется, это выполнимо... - person user2070092; 14.02.2013
comment
Я нашел ссылку, которая объясняет программирование сокетов в PHP. Считаете ли вы, что это шаг в правильном направлении?: devshed.com/c/a/PHP/Socket-Programming-With-PHP - person user2070092; 14.02.2013
comment
Решено: binarytides.com/php-socket-programming-tutorial Скопировано и вставил код из раздела Отправка данных Отлично работает! Спасибо за указатель @jason.zissman - person user2070092; 15.02.2013
comment
Просто нужно открыть сокет для этого принтера. Верно... Я пробовал socket_create, stream_socket_client, fopen, pfsockopen, но ничего не работает. - person Dustin Graham; 21.10.2016

Я понимаю, что этот вопрос немного устарел, но недавно мне пришлось выполнить именно эту задачу, и вот как я это сделал. Главный сервер — это облачный PHP-сервер, который не находится в локальной сети. В локальной сети у нас есть еще одна машина, на которой просто работает WAMP и этот скрипт, сам принтер Zebra также находится в локальной сети с IP-адресом 192.168.1.201:

<?php
/*
 * File Allows printing from web interface, simply connects to the Zebra Printer and then pumps data
 * into it which gets printed out.
 */
$print_data = $_POST['zpl_data'];

// Open a telnet connection to the printer, then push all the data into it.
try
{
    $fp=pfsockopen("192.168.1.201",9100);
    fputs($fp,$print_data);
    fclose($fp);

    echo 'Successfully Printed';
}
catch (Exception $e) 
{
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Затем на веб-странице, сгенерированной облачным сервером, у нас есть некоторый код, который просто выполняет Ajax POST на сервер в локальной сети, публикуя zpl_data для печати.

Редактировать 2017

Теперь мы перенесли работу через PrintNode (https://www.printnode.com/). Мы обнаружили, что пока это действительно хорошо, и позволяет нам печатать все виды документов без необходимости использовать наши собственные прокси, а также предоставляет установщик с белой меткой, чтобы он выглядел как наш собственный продукт. Я не связан с PrintNode.

person user984976    schedule 22.05.2013
comment
Код протестирован на ZDesigner GK420D, подключенном к порту 9100 на сервере Win2016 — работает отлично. Единственное, что мне нужно было настроить, это вставить команду кодировки UTF8 в файл .zpl где-то в первых строках: ^CI28 - person Anse; 25.08.2017
comment
Сервер Wamp с этим кодом работает у меня на Zebra ZD420 в 2017 году. Спасибо, что избавили меня от множества разочарований! - person FascistDonut; 06.10.2017

printer_open() и связанные с ним функции не являются частью стандартного языка PHP; они являются частью расширения.

Если вы хотите их использовать, вам необходимо установить расширение: см. здесь для получения информации о расширении принтера.

Однако обратите внимание, что это расширение доступно только для PHP, работающего в Windows.

Если ваш сервер не Windows, вам потребуется использовать внешнюю программу для отправки данных на принтер. Пример может выглядеть так:

exec("lpr -P 'printer' -r 'filename.txt');

Эту информацию и многое другое можно найти в другом месте на SO, например здесь: печать по сети из приложения PHP

Надеюсь, это поможет.

person Spudley    schedule 13.02.2013
comment
Попался, я работаю на Ubuntu LAMP. Я взглянул на вторую ссылку, которую вы разместили ... по вашему мнению, что было бы лучше для простой веб-страницы php, той, которую вы разместили выше, или класса принтера LPR? По сути, я хотел бы иметь кнопку печати, которая печатала бы значение сохраненной переменной, которая представляет собой рассчитанную строку Zebra ZPL. - person user2070092; 14.02.2013
comment
Я не пробовал класс LPR, поэтому я не могу прокомментировать его. Использование exec() для вызова внешней программы lpr должно работать почти повсеместно, хотя и на платформе Linux. - person Spudley; 15.02.2013

После нескольких часов поисков я получаю решения:

После установки принтера на нужный IP:введите здесь описание изображения

exec('lp -d printer file');

В моем случае команда была:

exec('lp -d Epson-Cofetarie /home/clara/Desktop/txt.txt');

Где: принтер = Epson-Cofetarie

файл = /home/clara/Desktop/txt.txt

файлу нужен Абсолютный путь

person Florin    schedule 29.05.2015
comment
Разве это не запускало бы эти команды на сервере? что делать, если принтер подключен к клиентской машине? - person Sebastianb; 01.06.2016
comment
Серверная машина. Для запуска на клиентской машине вам нужно использовать ssh2. php.net/manual/ro/function.ssh2-exec.php - person Florin; 02.06.2016

Надеюсь, этот простой код решит проблему,

  1. Поместите свой код ZPL в файл, например, «barcode.zpl»
  2. Поделитесь своим принтером Zebra, чтобы к нему можно было получить доступ в проводнике Windows, набрав
    , например, «\192.168.1.113[ИМЯ ВАШЕГО ПРИНТЕРА]»;
  3. Создайте файл PHP и напишите код:

<?php $file="barcode.zpl"; copy($file, "//192.168.1.113/ZDesigner GK420t"); ?>

Спасибо

person Ary Parker    schedule 01.04.2019