четверг, 14 марта 2013 г.

Zebra Ununtu и проблемма с "прыгающими" принтерами

При открытии нового объекта возникла забавная проблема. На операторской машине стоит Ubuntu 12.04 и подключены 2 принтера по usb. В Ubunt'е при подключении принтеров по usb создаются каналы вида /dev/usb/lpxx , где xx - номер от 0 и дальше. Данная особенность позволяет печатать из программ которые про cups ничего не знают. К примеру cat 1.txt > /dev/usb/lp0 выведет файл 1.txt на печать. Данная особенность использовалась для печати на принетера Zebra из под wine. Ясно что это костыль но вот если печатать через cups то растеризатор делает очень забавные весчи с тем что на него отправили. Правда делает он, что попало при 203 dpi, если поставить 300 dpi то все нормально, но только возникают проблемы с тем что картинка получается в 300 dpi а принтер умеет 203 dpi и не все что можно было вывести на печать входит. Это была только присказка. 


Проблема выразилась в том что при старте машины ссылки принтеров на каналы МЕНЯЮТСЯ !!!! а в модуле вывода стоит жесткая ассоциация на, что печатать. Так как каждый раз при этой фигне менять ассоциацию в конфигурационном файле достаточно быстро надоело. Надо было автоматизировать решение данной проблемы учитывая, что в ближайшем будущем планируется поставить еще один принтер Zebra (широкоформатный) на эту же рабочую станцию. Итак задача найти как ассоциируются каналы в /dev/usb/ с принтерами в системе. Провидение направило в сторону /sys/class/  и о чудо !!! там обнаружилась директория usb где были директории lp0 и lp1 c кучей интересного. Дальнейшее было дело техники. Был сделан модуль на Python который собирал информацию как ассоциированы принтера и каналы.

#-*- coding: utf-8 -*-
import os

wrk_path='/sys/class/usb'

asprint={}

if os.access(wrk_path,os.F_OK): # проверяем если ли каталог
   prn=os.listdir(wrk_path)    # список каналов
   for l in prn:
              # а вот здесь мы читаем волшебный файл в котором
              # лежит описание принтера
     f=open(wrk_path+os.sep+l+os.sep+'device/ieee1284_id','r')
     xx=''
     for x in f:
       xx=xx+x
     print xx+'\n'
     asprint[l]=xx
     f.close()
    
   for l in asprint:
     if asprint[l].find('Zebra')!=-1:
        print 'Опа !!!'
        model=asprint[l][asprint[l].find('MODEL:'):asprint[l].find(';CLASS')]
        print model
 
else :
   print 'no printer local'

Комментариев нет:

Отправить комментарий