annotate zebra.py @ 17:a9dacd180597

Does not work in python 2.6 after all Tidy up
author Ben Croston <ben@croston.org>
date Mon, 15 Aug 2011 20:18:38 +0100
parents e6ea86e3d0e1
children 117c2aac83e5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
1 #!/usr/bin/env python
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
2
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
3 import subprocess
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
4 import os.path
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
5 import sys
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
6
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
7 if sys.platform.lower().startswith('win'):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
8 IS_WINDOWS = True
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
9 import win32print
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
10 else:
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
11 IS_WINDOWS = False
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
12
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
13 class zebra(object):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
14 """A class to communicate with (Zebra) label printers using EPL2"""
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
15
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
16 def __init__(self, queue=None):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
17 """queue - name of the printer queue (optional)"""
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
18 self.queue = queue
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
19
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
20 def _output_unix(self, commands):
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
21 if self.queue == 'zebra_python_unittest':
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
22 p = subprocess.Popen(['cat','-'], stdin=subprocess.PIPE)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
23 else:
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
24 p = subprocess.Popen(['lpr','-P%s'%self.queue], stdin=subprocess.PIPE)
17
a9dacd180597 Does not work in python 2.6 after all
Ben Croston <ben@croston.org>
parents: 14
diff changeset
25 p.communicate(commands)
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
26 p.stdin.close()
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
27
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
28 def _output_win(self, commands):
8
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
29 if self.queue == 'zebra_python_unittest':
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
30 print commands
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
31 return
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
32 hPrinter = win32print.OpenPrinter(self.queue)
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
33 try:
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
34 hJob = win32print.StartDocPrinter(hPrinter, 1, ('Label',None,'RAW'))
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
35 try:
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
36 win32print.StartPagePrinter(hPrinter)
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
37 win32print.WritePrinter(hPrinter, commands)
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
38 win32print.EndPagePrinter(hPrinter)
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
39 finally:
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
40 win32print.EndDocPrinter(hPrinter)
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
41 finally:
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
42 win32print.ClosePrinter(hPrinter)
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
43
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
44 def output(self, commands):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
45 """Output EPL2 commands to the label printer
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
46
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
47 commands - EPL2 commands to send to the printer
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
48 """
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
49 assert self.queue is not None
17
a9dacd180597 Does not work in python 2.6 after all
Ben Croston <ben@croston.org>
parents: 14
diff changeset
50 if sys.version_info[0] == 3:
a9dacd180597 Does not work in python 2.6 after all
Ben Croston <ben@croston.org>
parents: 14
diff changeset
51 if type(commands) != bytes:
a9dacd180597 Does not work in python 2.6 after all
Ben Croston <ben@croston.org>
parents: 14
diff changeset
52 commands = str(commands).encode()
a9dacd180597 Does not work in python 2.6 after all
Ben Croston <ben@croston.org>
parents: 14
diff changeset
53 else:
a9dacd180597 Does not work in python 2.6 after all
Ben Croston <ben@croston.org>
parents: 14
diff changeset
54 commands = str(commands).encode()
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
55 if IS_WINDOWS:
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
56 self._output_win(commands)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
57 else:
14
e6ea86e3d0e1 Fixed typo
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 10
diff changeset
58 self._output_unix(commands)
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
59
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
60 def _getqueues_unix(self):
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
61 queues = []
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
62 output = subprocess.check_output(['lpstat','-p'], universal_newlines=True)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
63 for line in output.split('\n'):
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
64 if line.startswith('printer'):
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
65 queues.append(line.split(' ')[1])
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
66 return queues
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
67
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
68 def _getqueues_win(self):
8
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
69 printers = []
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
70 for (a,b,name,d) in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL):
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
71 printers.append(name)
19fd067db7ca Added Windows support
Ben Croston
parents: 7
diff changeset
72 return printers
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
73
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
74 def getqueues(self):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
75 """Returns a list of printer queues on local machine"""
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
76 if IS_WINDOWS:
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
77 return self._getqueues_win()
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
78 else:
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
79 return self._getqueues_unix()
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
80
1
21c3229ed401 Tidy up
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 0
diff changeset
81 def setqueue(self, queue):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
82 """Set the printer queue"""
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
83 self.queue = queue
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
84
2
ad9d9bf61243 Change direct transfer to direct thermal
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 1
diff changeset
85 def setup(self, direct_thermal=None, label_height=None, label_width=None):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
86 """Set up the label printer. Parameters are not set if they are None.
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
87
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
88 direct_thermal - True if using direct thermal labels
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
89 label_height - tuple (label height, label gap) in dots
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
90 label_width - in dots
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
91 """
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
92 commands = '\n'
2
ad9d9bf61243 Change direct transfer to direct thermal
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 1
diff changeset
93 if direct_thermal:
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
94 commands += ('OD\n')
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
95 if label_height:
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
96 commands += ('Q%s,%s\n'%(label_height[0],label_height[1]))
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
97 if label_width:
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
98 commands += ('q%s\n'%label_width)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
99 self.output(commands)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
100
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
101 def store_graphic(self, name, filename):
10
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
102 """Store a .PCX file on the label printer
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
103
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
104 name - name to be used on printer
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
105 filename - local filename
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
106 """
6a1963ee4aff Added docstrings
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 8
diff changeset
107 assert filename.lower().endswith('.pcx')
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
108 commands = '\nGK"%s"\n'%name
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
109 commands += 'GK"%s"\n'%name
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
110 size = os.path.getsize(filename)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
111 commands += 'GM"%s"%s\n'%(name,size)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
112 self.output(commands)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
113 self.output(open(filename,'rb').read())
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
114
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
115 if __name__ == '__main__':
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
116 z = zebra()
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
117 print 'Printer queues found:',z.getqueues()
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
118 z.setqueue('zebra_python_unittest')
2
ad9d9bf61243 Change direct transfer to direct thermal
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 1
diff changeset
119 z.setup(direct_thermal=True, label_height=(406,32), label_width=609) # 3" x 2" direct thermal label
1
21c3229ed401 Tidy up
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 0
diff changeset
120 z.store_graphic('logo','logo.pcx')
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
121 label = """
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
122 N
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
123 GG419,40,"logo"
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
124 A40,80,0,4,1,1,N,"Tangerine Duck 4.4%"
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
125 A40,198,0,3,1,1,N,"Duty paid on 39.9l"
1
21c3229ed401 Tidy up
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents: 0
diff changeset
126 A40,240,0,3,1,1,N,"Gyle: 127 Best Before: 16/09/2011"
0
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
127 A40,320,0,4,1,1,N,"Pump & Truncheon"
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
128 P1
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
129 """
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
130 z.output(label)
5bd9ee5c0cae Initial version
Ben Croston <ben@fuzzyduckbrewery.co.uk>
parents:
diff changeset
131