Я хочу напечатать штрих-код на ярлыке с помощью принтера этикеток с зеброй. Модель принтеров на принтере – Zebra GK420d. Площадь печати наклейки составляет 5 см на 10 см. Я хочу сделать это с помощью php-скрипта. В googling я нашел несколько примеров и реализован таким образом
$barcode = "sometext"; $labelcode =<<<AAA ^XA ^FO100,75 ^BCN, 100,Y, N, ^FD$barcode^FS ^XZ AAA; file_put_contents('/dev/lpt1',$labelcode);
Будет ли это работать, когда я подключу принтер и протестирую? Каковы настройки, которые я должен применять для этого принтера зебры, чтобы печатать. Я не знаю настроек зебра принтеров. И также file_put_contents копирует код на принтер, используя port.how, чтобы найти порт принтера, который подключен к системе. Если он usb, то какую информацию нам нужно передать в file_put_contents. Пожалуйста, предложите процесс печати зебры
Хотя вы могли гипотетически отправить необработанные команды ZPL / EPL на устройство принтера, вам может быть лучше не делать этого, если вы еще не знаете ZPL / EPL, и если вы уже можете создавать изображения в своей среде.
Ваш код означает, что вы используете Unix-подобную систему. Если вы используете недавнюю Unix-подобную систему, то печать должна контролироваться CUPS . Zebra опубликовала неподдерживаемые, но в основном функциональные файлы поддержки CUPS .
Настройте принтер в CUPS, затем выведите оболочку в /usr/bin/lp
с флагом -d
установленным на имя принтера, и значением -o ppi=...
чтобы установить DPI принтера и, возможно, другие вещи для принудительного выравнивания или портретного / ландшафтного режима. Этот GK420s является 203 DPI-принтером, поэтому вам нужно -o ppi=203
как минимум.
Затем вы можете распечатать что-либо на этом принтере, который может понять CUPS, включая изображения и документы PDF. Это позволяет вам комбинировать все, что угодно, с PHP-стороной, а не ограничивать вас языком команд, который понимает принтер. Например, мы используем wkhtmltoimage для создания меток доставки, в то время как мы используем доисторический Image_Barcode GD и PEAR для создания небольших штрих-кодов. Кстати, есть лучшие варианты.
Кроме того, вы можете настроить виртуальный принтер «Generic Raw» в CUPS. Затем вы можете распечатывать текстовые файлы языка команд непосредственно через этот принтер. Вероятно, вы должны сделать это именно так, если вам удобнее и знакомы с EPL или ZPL.
Следующий код – это сокращенный раздел реального, живого кода, который мы используем для печати на всех наших принтерах, включая Zebras. Просто вызовите функцию ниже с данными, которые вы хотите напечатать (например, содержимое изображения, текст или что-то еще) в качестве первого аргумента.
function print_example($data) { // You'll need to change these according to your local names and options. $server = 'printserver.companyname.com'; $printer_name = 'Zebra_ZP_500_KB'; // That's effectively the same thing as your GK420d $options_flag = '-o position=bottom-left,ppi=203,landscape'; $process_name = 'LC_ALL=en_US.UTF-8 /usr/bin/lp -h %s -d %s %s'; $command = sprintf($process_name, $server, $printer_name, (string)$options_flag); $pipes = array(); $process = proc_open($command, $handles, $pipes); // Couldn't open the pipe -- shouldn't happen if (!is_resource($process)) trigger_error('Printing failed, proc_open() did not return a valid resource handle', E_USER_FATAL); // $pipes now looks like this: // 0 => writeable handle connected to child stdin // As we've been given data to write directly, let's kinda like do that. fwrite($pipes[0], $data); fclose($pipes[0]); // 1 => readable handle connected to child stdout $stdout = fgets($pipes[1]); fclose($pipes[1]); // 2 => readable handle connected to child stderr $stderr = fgets($pipes[2]); fclose($pipes[2]); // It is important that you close any pipes before calling // proc_close in order to avoid a deadlock $return_value = proc_close($process); // We've asked lp not to be quiet about submitting jobs so we can make // sure that the print job was submitted. $request_match = array(); if (!preg_match('/request id is\b(.+)/', $stdout, $request_match)) { add_warning("Print to '$printer' failed. Please check the printer status."); return false; } add_notice("Print to '$printer' succeeded. Job $request_match[1]."); return true; }
Функции add_warning
и add_notice
реализованы в нашем коде, вам нужно будет заменить их соответствующим образом тем, что вы на самом деле печатаете.