# convert an EAN-13 number to barcode # Wolfgang.Urban@schule.at import string # part 1, even parity A = ["0001101","0011001","0010011","0111101","0100011", "0110001","0101111","0111011","0110111","0001011"] # part 1, odd parity (reversed and 0<->1) B = ["0100111","0110011","0011011","0100001","0011101", "0111001","0000101","0010001","0001001","0010111"] # part 2, (0<->1) C = ["1110010","1100110","1101100","1000010","1011100", "1001110","1010000","1000100","1001000","1110100"] # coding of part 1 depending on first digit (#13 from back) CODE13 = ["AAAAAA","AABABB","AABBAB","AABBBA","ABAABB", "ABBAAB","ABBBAA","ABABAB","ABABBA","ABBABA"] SPACER = "01010" DELIMITER = "101" # find EAN checksum def ean_checksum(n=401456178012): # should give 3 weight = 3 check = 0 while n != 0: n,r = divmod(n,10) check += r*weight weight = 4-weight # 3,1,3,1,... check = (10-check%10)%10 return check # find ISBN checksum def isbn_checksum(n=351902520): # should give 5 weight = 1 check = 0 while n != 0: n,r = divmod(n,10) check += r*weight weight += 1 # 1,2,3,4... check = (10-check%10)%10 return check # build string of barcode bits def ean(n=4014561780123): s = string.zfill(str(n),13) code = "" # build part 1 coding13 = CODE13[int(s[0])] for x in range(6): cc = coding13[x] if cc=="A": code += A[int(s[x+1])] else: code += B[int(s[x+1])] code += SPACER # append part 2 for x in s[7:13]: code += C[int(x)] return DELIMITER+code+DELIMITER from Tkinter import * # plot EAN code using small bars (1 pixel width) def show_ean(n=9012345003154): root = Tk() root.title("EAN-13") cv = Canvas(root,width=105,height=60) cv.pack() c = ean(n) for i in range(len(c)): b = 45 if i in (0,1,2,94,93,92,46,47,48,49): b += 5 if c[i]=="1": cv.create_line(5+i,5,5+i,b) # double size bars including number def show_ean2(n=9012345003154): root = Tk() root.title("EAN-13") cv = Canvas(root,width=215,height=120) cv.pack() c = ean(n) for i in range(len(c)): b = 90 if i in (0,1,2,94,93,92,46,47,48,49): b += 14 if c[i]=="1": cv.create_line((5+i)*2+7,10,(5+i)*2+7,b) cv.create_line((5+i)*2+7+1,10,(5+i)*2+7+1,b) s = string.zfill(str(n),13) cv.create_text(8,104,text=s[0],font=("Courier",13)) cv.create_text(66,104,text=s[1:7],font=("Courier",13)) cv.create_text(158,104,text=s[7:13],font=("Courier",13))