Настройка принтера этикеток XPrinter на Linux в VMware Workstation

Пример для настройки в CentOS без графической оболочки, по аналогии можно настроить на любой ОС Linux.

Решаю специфичную задачу, из php нужно печатать этикетки с произвольным текстом по шаблону. Поскольку на мероприятии нельзя рассчитывать на стабильный интернет, а большая часть задач по автоматизации пересекается с веб-сайтом, приняли решение работать с виртуальной машиной на VMware.

XPrinter подойдут и для задач маркировки, под windows устанавливаются значительно проще. Остановился на модели XP-460B с шириной этикетки до 108 мм.

kbnbgfyypq5nwyake2w2hg2wegi.jpeg


Поскольку настройкой Linux и подключением устройств к нему занимаюсь крайне редко, искал готовые мануалы по настройке, понял что самый простой способ подключить принтер через cups. У меня не получилось подключить принтер по USB, не помогли никакие манипуляции по советам в мануалах, только сломал виртуальную машину несколько раз.

  • Скачиваем драйвера с сайта производителя xprintertech.com, они идут одним архивом для Windows, Mac и Linux

    Драйвера размещены на сайте для серии устройств, в моём случае 4 inch Label Printer Drivers. Как оказалась, XP-460B уже снят с производства, понял к какой серии он относится по хлебным крошкам похожей модели XP-470B.

  • Устанавливаем принтер в windows, включаем общий доступ
    mq_xcj-xg_3khujjepoijh-9q-k.png
  • Для 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 и пароль)

    uqvodquq5zrhfxu0dqezx3ulmky.png
  • Есть 2 варианта, которые мне удалось настроить, по протоколу LPD и через samba.
    1. Для подключения по протоколу LPD, нужно включить службу в windows (Включение или отключение компонентов Windows), перезагрузить компьютер.
      yu2y417h1xccrcfpysa9jkpr4se.png

      В настройках cups вводим lpd://192.168.1.52/Xprinter_XP-460B, где 192.168.1.52 — IP компьютера, на котором установлен принтер, Xprinter_XP-460B — название принтера в настройках общего доступа windows
      lzaytk-6ywoldviksu9cyxaksfw.png

      Выбираем драйвер 4BARCODE => 4B-3064TA
      ifmligg_hdt17kwsmlrzildy_5a.png

      В параметрах ничего не выбираем и не сохраняем! Я пробовал настроить размер этикетки, но тогда принтер по какой-то причине не работает. Размер этикетки можно задать в задании на печать.
      dv7vud9j8yxo8a6g2guhswt_shw.png

      Пробуем распечатать пробную страницу — готово!
    2. Второй вариант. Нужно установить samba, запустить, перезапустить cups, тогда появится новый пункт подключения в cups, в настройках ввести строку вида smb://user: password@192.168.1.52/Xprinter_XP-460B. Где, user — пользователь в 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');


5wuylysbgybnsmuhf2hwg_vz54o.png


Готово. Убил на настройку 2 выходных, надеюсь, кому-то это будет полезно.

© Habrahabr.ru