Merge pull request #98 from DavisGoglin/issue/85
Adding barcode function type B and additional barocdes.
This commit is contained in:
commit
d96dcd8e7e
|
@ -36,7 +36,7 @@ barcode("code", "barcode\_type", width, height, "position", "font")
|
||||||
Prints a barcode.
|
Prints a barcode.
|
||||||
|
|
||||||
* ``code`` is an alphanumeric code to be printed as bar code
|
* ``code`` is an alphanumeric code to be printed as bar code
|
||||||
* ``barcode_type`` must be one of the following type of codes:
|
* ``barcode_type`` must be one of the following type of codes for function type A:
|
||||||
|
|
||||||
* UPC-A
|
* UPC-A
|
||||||
* UPC-E
|
* UPC-E
|
||||||
|
@ -46,6 +46,18 @@ Prints a barcode.
|
||||||
* ITF
|
* ITF
|
||||||
* NW7
|
* NW7
|
||||||
|
|
||||||
|
And for function type B:
|
||||||
|
|
||||||
|
* Any type above
|
||||||
|
* CODE93
|
||||||
|
* CODE128
|
||||||
|
* GS1-128
|
||||||
|
* GS1 DataBar Omnidirectional
|
||||||
|
* GS1 DataBar Truncated
|
||||||
|
* GS1 DataBar Limited
|
||||||
|
* GS1 DataBar Expanded
|
||||||
|
|
||||||
|
|
||||||
* ``width`` is a numeric value in the range between (1,255) *Default:* 64
|
* ``width`` is a numeric value in the range between (1,255) *Default:* 64
|
||||||
* ``height`` is a numeric value in the range between (2,6) *Default:* 3
|
* ``height`` is a numeric value in the range between (2,6) *Default:* 3
|
||||||
* ``position`` is where to place the code around the bars, could be one of the following values:
|
* ``position`` is where to place the code around the bars, could be one of the following values:
|
||||||
|
@ -58,7 +70,14 @@ Prints a barcode.
|
||||||
* ``font`` is one of the 2 type of fonts, values could be:
|
* ``font`` is one of the 2 type of fonts, values could be:
|
||||||
|
|
||||||
* A
|
* A
|
||||||
* B > *Default:* A Raises ``BarcodeTypeError``, ``BarcodeSizeError``, ``BarcodeCodeError`` exceptions.
|
* B > *Default:* A
|
||||||
|
|
||||||
|
* ``fuction_type`` chooses between ESCPOS function type A or B. A is default, B has more barcode options. Choose which one based upon your printer support and require barcode.
|
||||||
|
|
||||||
|
* A
|
||||||
|
* B > *Default* A
|
||||||
|
|
||||||
|
* Raises ``BarcodeTypeError``, ``BarcodeSizeError``, ``BarcodeCodeError`` exceptions.
|
||||||
|
|
||||||
text("text")
|
text("text")
|
||||||
^^^^^^^^^^^^
|
^^^^^^^^^^^^
|
||||||
|
|
|
@ -126,17 +126,51 @@ BARCODE_WIDTH = GS + 'w' # Barcode Width [2-6]
|
||||||
|
|
||||||
#NOTE: This isn't actually an ESC/POS command. It's the common prefix to the
|
#NOTE: This isn't actually an ESC/POS command. It's the common prefix to the
|
||||||
# two "print bar code" commands:
|
# two "print bar code" commands:
|
||||||
# - "GS k <type as integer> <data> NUL"
|
# - Type A: "GS k <type as integer> <data> NUL"
|
||||||
# - "GS k <type as letter> <data length> <data>"
|
# - TYPE B: "GS k <type as letter> <data length> <data>"
|
||||||
# The latter command supports more barcode types
|
# The latter command supports more barcode types
|
||||||
_SET_BARCODE_TYPE = lambda m: GS + 'k' + m
|
_SET_BARCODE_TYPE = lambda m: GS + 'k' + m
|
||||||
BARCODE_UPC_A = _SET_BARCODE_TYPE('\x00') # Barcode type UPC-A
|
|
||||||
BARCODE_UPC_E = _SET_BARCODE_TYPE('\x01') # Barcode type UPC-E
|
# Barcodes for printing function type A
|
||||||
BARCODE_EAN13 = _SET_BARCODE_TYPE('\x02') # Barcode type EAN13
|
BARCODE_TYPE_A = {
|
||||||
BARCODE_EAN8 = _SET_BARCODE_TYPE('\x03') # Barcode type EAN8
|
'UPC-A': _SET_BARCODE_TYPE(chr(0)),
|
||||||
BARCODE_CODE39 = _SET_BARCODE_TYPE('\x04') # Barcode type CODE39
|
'UPC-E': _SET_BARCODE_TYPE(chr(1)),
|
||||||
BARCODE_ITF = _SET_BARCODE_TYPE('\x05') # Barcode type ITF
|
'EAN13': _SET_BARCODE_TYPE(chr(2)),
|
||||||
BARCODE_NW7 = _SET_BARCODE_TYPE('\x06') # Barcode type NW7
|
'EAN8': _SET_BARCODE_TYPE(chr(3)),
|
||||||
|
'CODE39': _SET_BARCODE_TYPE(chr(4)),
|
||||||
|
'ITF': _SET_BARCODE_TYPE(chr(5)),
|
||||||
|
'NW7': _SET_BARCODE_TYPE(chr(6)),
|
||||||
|
'CODABAR': _SET_BARCODE_TYPE(chr(6)), # Same as NW7
|
||||||
|
}
|
||||||
|
|
||||||
|
# Barcodes for printing function type B
|
||||||
|
# The first 8 are the same barcodes as type A
|
||||||
|
BARCODE_TYPE_B = {
|
||||||
|
'UPC-A': _SET_BARCODE_TYPE(chr(65)),
|
||||||
|
'UPC-E': _SET_BARCODE_TYPE(chr(66)),
|
||||||
|
'EAN13': _SET_BARCODE_TYPE(chr(67)),
|
||||||
|
'EAN8': _SET_BARCODE_TYPE(chr(68)),
|
||||||
|
'CODE39': _SET_BARCODE_TYPE(chr(69)),
|
||||||
|
'ITF': _SET_BARCODE_TYPE(chr(70)),
|
||||||
|
'NW7': _SET_BARCODE_TYPE(chr(71)),
|
||||||
|
'CODABAR': _SET_BARCODE_TYPE(chr(71)), # Same as NW7
|
||||||
|
'CODE93': _SET_BARCODE_TYPE(chr(72)),
|
||||||
|
# These are all the same barcode, but using different charcter sets
|
||||||
|
'CODE128A': _SET_BARCODE_TYPE(chr(73) + '{A'), # CODE128 character set A
|
||||||
|
'CODE128B': _SET_BARCODE_TYPE(chr(73) + '{B'), # CODE128 character set B
|
||||||
|
'CODE128C': _SET_BARCODE_TYPE(chr(73) + '{C'), # CODE128 character set C
|
||||||
|
'GS1-128': _SET_BARCODE_TYPE(chr(74)),
|
||||||
|
'GS1 DATABAR OMNIDIRECTIONAL': _SET_BARCODE_TYPE(chr(75)),
|
||||||
|
'GS1 DATABAR TRUNCATED': _SET_BARCODE_TYPE(chr(76)),
|
||||||
|
'GS1 DATABAR LIMITED': _SET_BARCODE_TYPE(chr(77)),
|
||||||
|
'GS1 DATABAR EXPANDED': _SET_BARCODE_TYPE(chr(78)),
|
||||||
|
}
|
||||||
|
|
||||||
|
BARCODE_TYPES = {
|
||||||
|
'A': BARCODE_TYPE_A,
|
||||||
|
'B': BARCODE_TYPE_B,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Image format
|
# Image format
|
||||||
# NOTE: _PRINT_RASTER_IMG is the obsolete ESC/POS "print raster bit image"
|
# NOTE: _PRINT_RASTER_IMG is the obsolete ESC/POS "print raster bit image"
|
||||||
|
|
|
@ -314,12 +314,13 @@ class Escpos(object):
|
||||||
else:
|
else:
|
||||||
raise CharCodeError()
|
raise CharCodeError()
|
||||||
|
|
||||||
def barcode(self, code, bc, height=64, width=3, pos="BELOW", font="A", align_ct=True):
|
def barcode(self, code, bc, height=64, width=3, pos="BELOW", font="A", align_ct=True, function_type="A"):
|
||||||
""" Print Barcode
|
""" Print Barcode
|
||||||
|
|
||||||
This method allows to print barcodes. The rendering of the barcode is done by the printer and therefore has to
|
This method allows to print barcodes. The rendering of the barcode is done by the printer and therefore has to
|
||||||
be supported by the unit. Currently you have to check manually whether your barcode text is correct. Uncorrect
|
be supported by the unit. Currently you have to check manually whether your barcode text is correct. Uncorrect
|
||||||
barcodes may lead to unexpected printer behaviour.
|
barcodes may lead to unexpected printer behaviour. There are two forms of the barcode function. Type A is
|
||||||
|
default but has fewer barcodes, while type B has some more to choose from.
|
||||||
|
|
||||||
.. todo:: Add a method to check barcode codes. Alternatively or as an addition write explanations about each
|
.. todo:: Add a method to check barcode codes. Alternatively or as an addition write explanations about each
|
||||||
barcode-type. Research whether the check digits can be computed autmatically.
|
barcode-type. Research whether the check digits can be computed autmatically.
|
||||||
|
@ -340,7 +341,7 @@ class Escpos(object):
|
||||||
be of help if the printer does not support types that others do.)
|
be of help if the printer does not support types that others do.)
|
||||||
|
|
||||||
:param code: alphanumeric data to be printed as bar code
|
:param code: alphanumeric data to be printed as bar code
|
||||||
:param bc: barcode format, possible values are:
|
:param bc: barcode format, possible values are for type A are:
|
||||||
|
|
||||||
* UPC-A
|
* UPC-A
|
||||||
* UPC-E
|
* UPC-E
|
||||||
|
@ -350,6 +351,17 @@ class Escpos(object):
|
||||||
* ITF
|
* ITF
|
||||||
* NW7
|
* NW7
|
||||||
|
|
||||||
|
Possible values for type B:
|
||||||
|
|
||||||
|
* All types from function type A
|
||||||
|
* CODE93
|
||||||
|
* CODE128
|
||||||
|
* GS1-128
|
||||||
|
* GS1 DataBar Omnidirectional
|
||||||
|
* GS1 DataBar Truncated
|
||||||
|
* GS1 DataBar Limited
|
||||||
|
* GS1 DataBar Expanded
|
||||||
|
|
||||||
If none is specified, the method raises :py:exc:`~escpos.exceptions.BarcodeTypeError`.
|
If none is specified, the method raises :py:exc:`~escpos.exceptions.BarcodeTypeError`.
|
||||||
:param height: barcode height, has to be between 1 and 255
|
:param height: barcode height, has to be between 1 and 255
|
||||||
*default*: 64
|
*default*: 64
|
||||||
|
@ -373,6 +385,10 @@ class Escpos(object):
|
||||||
issued.
|
issued.
|
||||||
:type align_ct: bool
|
:type align_ct: bool
|
||||||
|
|
||||||
|
:param function_type: Choose between ESCPOS function type A or B, depending on printer support and desired
|
||||||
|
barcode.
|
||||||
|
*default*: A
|
||||||
|
|
||||||
:raises: :py:exc:`~escpos.exceptions.BarcodeSizeError`,
|
:raises: :py:exc:`~escpos.exceptions.BarcodeSizeError`,
|
||||||
:py:exc:`~escpos.exceptions.BarcodeTypeError`,
|
:py:exc:`~escpos.exceptions.BarcodeTypeError`,
|
||||||
:py:exc:`~escpos.exceptions.BarcodeCodeError`
|
:py:exc:`~escpos.exceptions.BarcodeCodeError`
|
||||||
|
@ -404,29 +420,29 @@ class Escpos(object):
|
||||||
self._raw(BARCODE_TXT_ABV)
|
self._raw(BARCODE_TXT_ABV)
|
||||||
else: # DEFAULT POSITION: BELOW
|
else: # DEFAULT POSITION: BELOW
|
||||||
self._raw(BARCODE_TXT_BLW)
|
self._raw(BARCODE_TXT_BLW)
|
||||||
# Type
|
|
||||||
if bc.upper() == "UPC-A":
|
bc_types = BARCODE_TYPES[function_type.upper()]
|
||||||
self._raw(BARCODE_UPC_A)
|
if bc.upper() not in bc_types.keys():
|
||||||
elif bc.upper() == "UPC-E":
|
# TODO: Raise a better error, or fix the message of this error type
|
||||||
self._raw(BARCODE_UPC_E)
|
raise BarcodeTypeError("Barcode type {bc} not valid for barcode function type {function_type}".format(
|
||||||
elif bc.upper() == "EAN13":
|
bc=bc,
|
||||||
self._raw(BARCODE_EAN13)
|
function_type=function_type,
|
||||||
elif bc.upper() == "EAN8":
|
))
|
||||||
self._raw(BARCODE_EAN8)
|
|
||||||
elif bc.upper() == "CODE39":
|
self._raw(bc_types[bc.upper()])
|
||||||
self._raw(BARCODE_CODE39)
|
|
||||||
elif bc.upper() == "ITF":
|
if function_type.upper() == "B":
|
||||||
self._raw(BARCODE_ITF)
|
self._raw(chr(len(code)))
|
||||||
elif bc.upper() in ("NW7", "CODABAR"):
|
|
||||||
self._raw(BARCODE_NW7)
|
|
||||||
else:
|
|
||||||
raise BarcodeTypeError(bc)
|
|
||||||
# Print Code
|
# Print Code
|
||||||
if code:
|
if code:
|
||||||
self._raw(code)
|
self._raw(code)
|
||||||
else:
|
else:
|
||||||
raise BarcodeCodeError()
|
raise BarcodeCodeError()
|
||||||
|
|
||||||
|
if function_type.upper() == "A":
|
||||||
|
self._raw("\x00")
|
||||||
|
|
||||||
def text(self, txt):
|
def text(self, txt):
|
||||||
""" Print alpha-numeric text
|
""" Print alpha-numeric text
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue