Настройка принтера этикеток XPrinter на Linux в VMware Workstation
Пример для настройки в CentOS без графической оболочки, по аналогии можно настроить на любой ОС Linux.
Решаю специфичную задачу, из php нужно печатать этикетки с произвольным текстом по шаблону. Поскольку на мероприятии нельзя рассчитывать на стабильный интернет, а большая часть задач по автоматизации пересекается с веб-сайтом, приняли решение работать с виртуальной машиной на VMware.
XPrinter подойдут и для задач маркировки, под windows устанавливаются значительно проще. Остановился на модели XP-460B с шириной этикетки до 108 мм.
Поскольку настройкой Linux и подключением устройств к нему занимаюсь крайне редко, искал готовые мануалы по настройке, понял что самый простой способ подключить принтер через cups. У меня не получилось подключить принтер по USB, не помогли никакие манипуляции по советам в мануалах, только сломал виртуальную машину несколько раз.
- Скачиваем драйвера с сайта производителя xprintertech.com, они идут одним архивом для Windows, Mac и Linux
Драйвера размещены на сайте для серии устройств, в моём случае 4 inch Label Printer Drivers. Как оказалась, XP-460B уже снят с производства, понял к какой серии он относится по хлебным крошкам похожей модели XP-470B.
- Устанавливаем принтер в windows, включаем общий доступ
- Для Linux в архиве 1 файл 4BARCODE. Это »2 в 1» файл, bash сценарий с tar архивом, который сам себя распаковывает и копирует драйвера в cups. В моём случае для распаковки нужен bzip2 (для серии 80 мм используется другой архиватор)
yum install cups yum install bzip2 chmod 744 ./4BARCODE sh ./4BARCODE service cups start
- Далее нужно открыть localhost:361 в браузере, для удобства делаю настройку, чтобы открыть из браузера в windows. Редактируем /etc/cups/cupsd.conf:
Listen localhost:631 меняем на Listen *:631
Order allow,deny Allow localhost Allow 192.168.1.* Order allow,deny Allow localhost Allow 192.168.1.*
Добавляем 631 порт в firewall (или в iptables):firewall-cmd --zone=public --add-port=631/tcp --permanent firewall-cmd --reload
- Открываем ссылку в браузере по IP виртуальной машины, в моём случае 192.168.1.5:631/admin
Добавляем принтер (нужно ввести root и пароль)
- Есть 2 варианта, которые мне удалось настроить, по протоколу LPD и через samba.
- Для подключения по протоколу LPD, нужно включить службу в windows (Включение или отключение компонентов Windows), перезагрузить компьютер.
В настройках cups вводим lpd://192.168.1.52/Xprinter_XP-460B, где 192.168.1.52 — IP компьютера, на котором установлен принтер, Xprinter_XP-460B — название принтера в настройках общего доступа windows
Выбираем драйвер 4BARCODE => 4B-3064TA
В параметрах ничего не выбираем и не сохраняем! Я пробовал настроить размер этикетки, но тогда принтер по какой-то причине не работает. Размер этикетки можно задать в задании на печать.
Пробуем распечатать пробную страницу — готово! - Второй вариант. Нужно установить samba, запустить, перезапустить cups, тогда появится новый пункт подключения в cups, в настройках ввести строку вида smb://user: password@192.168.1.52/Xprinter_XP-460B. Где, user — пользователь в windows, у пользователя обязательно должен быть задан пароль, с пустым авторизация не проходит.
- Для подключения по протоколу LPD, нужно включить службу в windows (Включение или отключение компонентов Windows), перезагрузить компьютер.
Когда всё получилось и принтер распечатал пробную страницу, задания можно отправлять через консоль:
lpr -P Xprinter_XP-460B -o media=Custom.100x102mm test.txt
В данном примере этикетка имеет размеры 100×100 мм, 2 мм подобраны экспериментально. Расстояние между этикетками 3 мм, но если выставить высоту 103 мм, происходит сдвиг ленты, неудобно отрывать этикетку. Недостаток протокола LPD — задания отправляются как на обычный принтер, формат ESC/P0S не отправляется на печать, сенсор не калибрует этикетки.
Дальше можно работать с принтером через php. Есть библиотеки для работы с cups, мне проще отправить команду в консоль через exec ();
Поскольку ESC/P0S не работает, я решил сделать шаблоны в pdf через библиотеку tFPDF
require_once($_SERVER["DOCUMENT_ROOT"] . "/tfpdf/tfpdf.php");
$w = 100;
$h = 100;
$number = 59;
$pdf = new tFPDF('P', 'mm', [$w, $h]);
$pdf->SetTitle('Information');
$pdf->AddFont('Font', 'B', $_SERVER["DOCUMENT_ROOT"] . '/fonts/opensans-bold.ttf', true);
$pdf->SetTextColor(0,0,0);
$pdf->SetDrawColor(0,0,0);
$pdf->AddPage('P');
$pdf->SetDisplayMode('real','default');
$pdf->Image($_SERVER["DOCUMENT_ROOT"]. '/images/logo_site.png',$w - 4 - 28,$h - 13,28.1,9.6,'');
$pdf->SetFontSize(140);
$pdf->SetXY(0,24);
$pdf->Cell($w,$h - 45, $number,0,0,'C',0);
$pdf->SetFontSize(1);
$pdf->SetTextColor(255,255,255);
$pdf->Write(0, $number);
$pdf->Output('example.pdf','I');
exec('php label.php | lpr -P Xprinter_XP-460B -o media=Custom.100x102mm');
Готово. Убил на настройку 2 выходных, надеюсь, кому-то это будет полезно.