# 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