Merge pull request #98 from DavisGoglin/issue/85

Adding barcode function type B and additional barocdes.
This commit is contained in:
Patrick Kanzler 2016-03-08 19:28:07 +01:00
commit d96dcd8e7e
3 changed files with 101 additions and 32 deletions

View File

@ -36,7 +36,7 @@ barcode("code", "barcode\_type", width, height, "position", "font")
Prints a barcode.
* ``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-E
@ -45,7 +45,19 @@ Prints a barcode.
* CODE39
* ITF
* 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
* ``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:
@ -58,7 +70,14 @@ Prints a barcode.
* ``font`` is one of the 2 type of fonts, values could be:
* 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")
^^^^^^^^^^^^

View File

@ -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
# two "print bar code" commands:
# - "GS k <type as integer> <data> NUL"
# - "GS k <type as letter> <data length> <data>"
# - Type A: "GS k <type as integer> <data> NUL"
# - TYPE B: "GS k <type as letter> <data length> <data>"
# The latter command supports more barcode types
_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
BARCODE_EAN13 = _SET_BARCODE_TYPE('\x02') # Barcode type EAN13
BARCODE_EAN8 = _SET_BARCODE_TYPE('\x03') # Barcode type EAN8
BARCODE_CODE39 = _SET_BARCODE_TYPE('\x04') # Barcode type CODE39
BARCODE_ITF = _SET_BARCODE_TYPE('\x05') # Barcode type ITF
BARCODE_NW7 = _SET_BARCODE_TYPE('\x06') # Barcode type NW7
# Barcodes for printing function type A
BARCODE_TYPE_A = {
'UPC-A': _SET_BARCODE_TYPE(chr(0)),
'UPC-E': _SET_BARCODE_TYPE(chr(1)),
'EAN13': _SET_BARCODE_TYPE(chr(2)),
'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
# NOTE: _PRINT_RASTER_IMG is the obsolete ESC/POS "print raster bit image"

View File

@ -314,12 +314,13 @@ class Escpos(object):
else:
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
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
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
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.)
: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-E
@ -350,6 +351,17 @@ class Escpos(object):
* ITF
* 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`.
:param height: barcode height, has to be between 1 and 255
*default*: 64
@ -373,6 +385,10 @@ class Escpos(object):
issued.
: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`,
:py:exc:`~escpos.exceptions.BarcodeTypeError`,
:py:exc:`~escpos.exceptions.BarcodeCodeError`
@ -404,29 +420,29 @@ class Escpos(object):
self._raw(BARCODE_TXT_ABV)
else: # DEFAULT POSITION: BELOW
self._raw(BARCODE_TXT_BLW)
# Type
if bc.upper() == "UPC-A":
self._raw(BARCODE_UPC_A)
elif bc.upper() == "UPC-E":
self._raw(BARCODE_UPC_E)
elif bc.upper() == "EAN13":
self._raw(BARCODE_EAN13)
elif bc.upper() == "EAN8":
self._raw(BARCODE_EAN8)
elif bc.upper() == "CODE39":
self._raw(BARCODE_CODE39)
elif bc.upper() == "ITF":
self._raw(BARCODE_ITF)
elif bc.upper() in ("NW7", "CODABAR"):
self._raw(BARCODE_NW7)
else:
raise BarcodeTypeError(bc)
bc_types = BARCODE_TYPES[function_type.upper()]
if bc.upper() not in bc_types.keys():
# TODO: Raise a better error, or fix the message of this error type
raise BarcodeTypeError("Barcode type {bc} not valid for barcode function type {function_type}".format(
bc=bc,
function_type=function_type,
))
self._raw(bc_types[bc.upper()])
if function_type.upper() == "B":
self._raw(chr(len(code)))
# Print Code
if code:
self._raw(code)
else:
raise BarcodeCodeError()
if function_type.upper() == "A":
self._raw("\x00")
def text(self, txt):
""" Print alpha-numeric text