139 lines
3.8 KiB
Python
139 lines
3.8 KiB
Python
# 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
|