diff options
Diffstat (limited to '')
-rw-r--r-- | share/extensions/barcode/Rm4scc.py | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/share/extensions/barcode/Rm4scc.py b/share/extensions/barcode/Rm4scc.py new file mode 100644 index 0000000..b4d52ba --- /dev/null +++ b/share/extensions/barcode/Rm4scc.py @@ -0,0 +1,139 @@ +# coding=utf-8 +# +# Copyright (C) 2007 Martin Owens +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +""" +Python barcode renderer for RM4CC barcodes. Designed for use with Inkscape. +""" + +from .Base import Barcode + +charmap = { + "(": "25", + ")": "3", + "0": "05053535", + "1": "05152535", + "2": "05153525", + "3": "15052535", + "4": "15053525", + "5": "15152525", + "6": "05251535", + "7": "05350535", + "8": "05351525", + "9": "15250535", + "A": "15251525", + "B": "15350525", + "C": "05253515", + "D": "05352515", + "E": "05353505", + "F": "15252515", + "G": "15253505", + "H": "15352505", + "I": "25051535", + "J": "25150535", + "K": "25151525", + "L": "35050535", + "M": "35051525", + "N": "35150525", + "O": "25053525", + "P": "25152515", + "Q": "25153505", + "R": "35052515", + "S": "35053505", + "T": "35152505", + "U": "25251515", + "V": "25350515", + "W": "25351505", + "X": "35250515", + "Y": "35251505", + "Z": "35350505", +} + +check = ["ZUVWXY", "501234", "B6789A", "HCDEFG", "NIJKLM", "TOPQRS"] +(BAR_TRACK, BAR_DOWN, BAR_UP, BAR_FULL, BAR_NONE, WHITE_SPACE) = range(6) + + +class Rm4scc(Barcode): + """Provice a Rm4scc barcode generator""" + + default_height = 18 + + def encode(self, text): + result = "" + + text = text.upper() + text.replace("(", "") + text.replace(")", "") + + text = "(" + text + Rm4scc.checksum(text) + ")" + + i = 0 + for char in text: + if char in charmap: + result = result + charmap[char] + i += 1 + + return result + + @staticmethod + def checksum(text): + """given a string of data, return the check character""" + total_lower = 0 + total_upper = 0 + for char in text: + if char in charmap: + bars = charmap[char][0:8:2] + lower = 0 + upper = 0 + + if int(bars[0]) & 1: + lower += 4 + if int(bars[1]) & 1: + lower += 2 + if int(bars[2]) & 1: + lower += 1 + if int(bars[0]) & 2: + upper += 4 + if int(bars[1]) & 2: + upper += 2 + if int(bars[2]) & 2: + upper += 1 + total_lower += lower % 6 + total_upper += upper % 6 + + total_lower = total_upper % 6 + total_upper %= 6 + + checkchar = check[total_upper][total_lower] + return checkchar + + def get_style(self, index): + """Royal Mail Barcodes use a completely different style""" + result = {"width": 2, "write": True, "top": 0} + if index == BAR_TRACK: # Track Bar + result["top"] = 6 + result["height"] = 5 + elif index == BAR_DOWN: # Decender Bar + result["top"] = 6 + result["height"] = 11 + elif index == BAR_UP: # Accender Bar + result["height"] = 11 + elif index == BAR_FULL: # Full Bar + result["height"] = 17 + elif index == WHITE_SPACE: # White Space + result["write"] = False + return result |