writer and reader added
This commit is contained in:
@@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
models = [
|
||||||
|
'QL-500',
|
||||||
|
'QL-550',
|
||||||
|
'QL-560',
|
||||||
|
'QL-570',
|
||||||
|
'QL-580N',
|
||||||
|
'QL-650TD'
|
||||||
|
'QL-700',
|
||||||
|
'QL-710W',
|
||||||
|
'QL-720NW',
|
||||||
|
'QL-1050',
|
||||||
|
'QL-1060N',
|
||||||
|
]
|
||||||
|
|
||||||
|
min_max_length_dots = {
|
||||||
|
'default': (295, 11811),
|
||||||
|
|
||||||
|
# 'QL-500', 'QL-550', 'QL-560', and 'QL-650TD'
|
||||||
|
# they all use the default.
|
||||||
|
|
||||||
|
'QL-1050': (295, 35433),
|
||||||
|
'QL-1060N': (295, 35433),
|
||||||
|
|
||||||
|
'QL-570': (150, 11811),
|
||||||
|
'QL-580N': (150, 11811),
|
||||||
|
'QL-700': (150, 11811),
|
||||||
|
'QL-710W': (150, 11811),
|
||||||
|
'QL-720NW': (150, 11811),
|
||||||
|
}
|
||||||
|
|
||||||
|
min_max_feed = {
|
||||||
|
'default': (35, 1500),
|
||||||
|
}
|
||||||
|
|
||||||
|
paper_dimensions = {
|
||||||
|
# the dimensions are given as (width, length)
|
||||||
|
# tape with length > 0: rectangular die-cut labels
|
||||||
|
# tape with length == 0: continuous length tape
|
||||||
|
# tape with length == -1: round die-cut labels
|
||||||
|
#ID: ( tape_size_mm, size_dots, printable size dots, right_margin_dots, restrict_printers)
|
||||||
|
257: ((12, 0), (142, 0), (106, 0), 29, []),
|
||||||
|
258: ((29, 0), (342, 0), (306, 0), 6, []),
|
||||||
|
264: ((38, 0), (449, 0), (413, 0), 12, []),
|
||||||
|
262: ((50, 0), (590, 0), (554, 0), 12, []),
|
||||||
|
261: ((54, 0), (636, 0), (590, 0), 0, []),
|
||||||
|
259: ((62, 0), (732, 0), (696, 0), 12, []),
|
||||||
|
260: ((102, 0), (1200, 0), (1164, 0), 12, ['QL-1060N', 'QL-1050']),
|
||||||
|
|
||||||
|
269: ((17, 54), (201, 636), (165, 566), 0, []),
|
||||||
|
270: ((17, 87), (201, 1026), (165, 956), 0, []),
|
||||||
|
370: ((23, 23), (272, 272), (202, 202), 42, []),
|
||||||
|
358: ((29, 42), (342, 495), (306, 425), 6, []),
|
||||||
|
271: ((29, 90), (342, 1061), (306, 991), 6, []),
|
||||||
|
272: ((38, 90), (449, 1061), (413, 991), 12, []),
|
||||||
|
367: ((39, 48), (461, 565), (425, 495), 6, []),
|
||||||
|
374: ((52, 29), (614, 341), (578, 271), 0, []),
|
||||||
|
274: ((62, 29), (732, 341), (696, 271), 12, []),
|
||||||
|
275: ((62, 100), (732, 1179), (696, 1109), 12, []),
|
||||||
|
365: ((102, 51), (1200, 596), (1164, 526), 12, ['QL-1060N', 'QL-1050']),
|
||||||
|
366: ((102, 152), (1200, 1804), (1164, 1660), 12, ['QL-1060N', 'QL-1050']),
|
||||||
|
362: ((12, -1), (142, 142), ( 94, 94), 113, []),
|
||||||
|
363: ((24, -1), (284, 284), (236, 236), 42, []),
|
||||||
|
273: ((58, -1), (688, 688), (618, 618), 51, []),
|
||||||
|
}
|
||||||
|
|
||||||
|
number_bytes_per_row = {
|
||||||
|
'default': 90,
|
||||||
|
'QL-1050': 162,
|
||||||
|
'QL-1060N': 162,
|
||||||
|
}
|
||||||
|
|
||||||
|
right_margin_addition = {
|
||||||
|
'default': 0,
|
||||||
|
'QL-1050': 44,
|
||||||
|
'QL-1060N': 44,
|
||||||
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
|
||||||
|
import struct
|
||||||
|
|
||||||
|
import packbits
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from devicedependent import models, \
|
||||||
|
min_max_feed, \
|
||||||
|
min_max_length_dots, \
|
||||||
|
paper_dimensions, \
|
||||||
|
number_bytes_per_row, \
|
||||||
|
right_margin_addition
|
||||||
|
|
||||||
|
class QLRaster(object):
|
||||||
|
|
||||||
|
def __init__(self, model='QL-500'):
|
||||||
|
if model not in models:
|
||||||
|
raise QLRasterUnknownModel()
|
||||||
|
self.model = model
|
||||||
|
self.data = b''
|
||||||
|
self._pquality = 1
|
||||||
|
self.page_number = 0
|
||||||
|
self.cut_at_end = True
|
||||||
|
self.dpi_600 = False
|
||||||
|
self.compression = True
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
self.page_number = 0
|
||||||
|
self.data += b'\x1B\x69\x61\x01' # mode setting (raster mode)
|
||||||
|
self.data += b'\x00' * 200
|
||||||
|
self.data += b'\x1B\x40' # init
|
||||||
|
self.data += b'\x1B\x69\x61\x01' # mode setting (raster mode)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mtype(self): return self._mtype
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mwidth(self): return self._mwidth
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mlength(self): return self._mlength
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pquality(self): return self._pquality
|
||||||
|
|
||||||
|
@mtype.setter
|
||||||
|
def mtype(self, value):
|
||||||
|
self._mtype = bytes([value & 0xFF])
|
||||||
|
|
||||||
|
@mwidth.setter
|
||||||
|
def mwidth(self, value):
|
||||||
|
self._mwidth = bytes([value & 0xFF])
|
||||||
|
|
||||||
|
@mlength.setter
|
||||||
|
def mlength(self, value):
|
||||||
|
self._mlength = bytes([value & 0xFF])
|
||||||
|
|
||||||
|
@pquality.setter
|
||||||
|
def pquality(self, value):
|
||||||
|
self._pquality = bytes([value & 0x01])
|
||||||
|
|
||||||
|
def set_media_and_quality(self, rnumber):
|
||||||
|
self.data += b'\x1B\x69\x7A'
|
||||||
|
valid_flags = 0x80
|
||||||
|
valid_flags |= (self._mtype is not None) << 1
|
||||||
|
valid_flags |= (self._mwidth is not None) << 2
|
||||||
|
valid_flags |= (self._mlength is not None) << 3
|
||||||
|
valid_flags |= self._pquality << 6
|
||||||
|
self.data += bytes([valid_flags])
|
||||||
|
vals = [self._mtype, self._mwidth, self._mlength]
|
||||||
|
self.data += b''.join(b'\x00' if val is None else val for val in vals)
|
||||||
|
self.data += struct.pack('<L', rnumber)
|
||||||
|
self.data += bytes([self.page_number == 0])
|
||||||
|
self.data += b'\x00'
|
||||||
|
# INFO: media/quality (1B 69 7A) --> found! (payload: 8E 0A 3E 00 D2 00 00 00 00 00)
|
||||||
|
|
||||||
|
def set_autocut(self, autocut = False):
|
||||||
|
self.data += b'\x1B\x69\x4D'
|
||||||
|
self.data += bytes([autocut << 6])
|
||||||
|
|
||||||
|
def set_cut_every(self, n=1):
|
||||||
|
self.data += b'\x1B\x69\x41'
|
||||||
|
self.data += bytes([n & 0xFF])
|
||||||
|
|
||||||
|
def set_expanded_mode(self):
|
||||||
|
self.data += b'\x1B\x69\x4B'
|
||||||
|
flags = 0x00
|
||||||
|
flags |= self.cut_at_end << 3
|
||||||
|
flags |= self.dpi_600 << 6
|
||||||
|
self.data += bytes([flags])
|
||||||
|
|
||||||
|
def set_margins(self, dots=0x23):
|
||||||
|
self.data += b'\x1B\x69\x64'
|
||||||
|
self.data += struct.pack('<H', dots)
|
||||||
|
|
||||||
|
def set_compression(self, compression=True):
|
||||||
|
self.compression = compression
|
||||||
|
self.data += b'\x4D'
|
||||||
|
self.data += bytes([compression << 1])
|
||||||
|
|
||||||
|
def set_raster_data(self, np_array):
|
||||||
|
""" np_array: numpy array of 1-bit values """
|
||||||
|
np_array = np.fliplr(np_array)
|
||||||
|
for row in np_array:
|
||||||
|
self.data += b'\x67\x00'
|
||||||
|
row = bytes(np.packbits(row))
|
||||||
|
if self.compression:
|
||||||
|
row = packbits.encode(row)
|
||||||
|
self.data += bytes([len(row)])
|
||||||
|
self.data += row
|
||||||
|
|
||||||
|
def print(self, last_page=True):
|
||||||
|
if last_page:
|
||||||
|
self.data += b'\x1A'
|
||||||
|
else:
|
||||||
|
self.data += b'\x0C'
|
||||||
|
|
||||||
|
class QLRasterError(Exception): pass
|
||||||
|
class QLRasterUnknownModel(QLRasterError): pass
|
||||||
|
|
||||||
Reference in New Issue
Block a user