from PIL import Image from PIL import ImageDraw # ''' Berechnung und Ausdruck eines Barcodes fuer die Tassimo-Kaffeemaschine Eingabe: Barcode als String in Dezimalform mit Pruefziffer z.B. '29761-5' fuer Jacobs Kroenung XL ''' # # -------------------------------------------------------- # # BCODE beschreibt den verwendeten "2 for 5 Interlaced Barcode" # class BCODE(): def __init__(self): # Codetabelle fuer den 2 for 5 Interlaced Barcode # '0' steht fuer das schmale Symbol (schwarze oder weisse Linie) # '1' steht fuer das breite Symbol = 2 * schmales Symbol # self.ctab=[[0,0,1,1,0],\ [1,0,0,0,1],\ [0,1,0,0,1],\ [1,1,0,0,0],\ [0,0,1,0,1],\ [1,0,1,0,0],\ [0,1,1,0,0],\ [0,0,0,1,1],\ [1,0,0,1,0],\ [0,1,0,1,0]] self.s_code='xxxxx-x' # Platzhalter fuer den Code self.dez_code=[] self.dez_vek=[] self.pz=-1 # def set(self,s): # Test auf gültige Eingabe und check=True # Umwandeln in Dezimalzahl und x=[] # Vektor der Ziffern + Pruefzahl if len(s) !=7: check = False print('Falsche Laenge des Codes') return check if s[5] !='-': check = False print('Kein Bindestrich vor der Pruefzahl') return check for i in range(5): if s[i] in '0123456789': x.append(int(s[i])) else: check=False print('Unzulaessiges Zeichen im Code') if s[6] in ('0123456789'): self.pz=int(s[6]) else: check=False print('Unzulaessiges Zeichen anstelle der Pruefzahl') if check: u=3*int(s[0])+int(s[1])+3*int(s[2])+int(s[3])+3*int(s[4]) r=10-divmod(u,10)[1] if r >= 10: r=0 check=(self.pz==r) if not check: print('Falsche Pruefzahl') self.s_code=s self.dez_code=x[4]+10*x[3]+100*x[2]+1000*x[1]+10000*x[0] self.dez_vek=x return check else: print('Fehlerhafter Code') return check # def make_codec(self): b1=[];b2=[];x=self.dez_vek;x.append(self.pz) b1.append(0);b1.append(0) b2.append(0);b2.append(0) for i in range(0,len(x)-1,2): for j in range(5): b1.append(self.ctab[int(x[i])][j]) b2.append(self.ctab[int(x[i+1])][j]) b1.append(1);b1.append(0) b2.append(0) self.b1=b1 self.b2=b2 # def bin_code(self,x): self.b=[] for i in range(16) : r=divmod(x,2) self.b.append(r[1]) x=r[0] return self.b # class pixel(): def __init__(self,x,y): self.x=int(x) self.y=int(y) self.pix=[(self.x,self.y)] # class BCODE_Image(pixel): # def __init__(self): self.breite=130 # mm self.hoehe=90 # mm self.dpi=300 # dots per inch self.bpix=int(self.breite/25.4*self.dpi) self.hpix=int(self.hoehe/25.4*self.dpi) self.im=Image.new('RGB',(self.bpix,self.hpix),'white') self.dots=self.im.load() # def strich(self,x0,y0,dx,dy,f): for i in range(x0,int(x0+dx)): for j in range(y0,int(y0+dy)): self.dots[i,j]=(f,f,f) # def make_barcode_Image(self,b1,b2,title): xsum=0 for i in range(len(b1)): xsum+=(b1[i]+1) for i in range(len(b2)): xsum+=(b2[i]+1) db=int(18/25.4*self.dpi) dh=0.5*db dp1=int(db/xsum) dp2=2*dp1 y0=60 # k=0 for l in range(6): x0=100 for k in range(6): for i in range(len(b1)): if b1[i] == 0: self.strich(x0,y0,dp1,dh,0) x0+=dp1 elif b1[i]==1: self.strich(x0,y0,dp2,dh,0) x0+=dp2 if i <= len(b2)-1: if b2[i] ==0: self.strich(x0,y0,dp1,dh,255) x0+=dp1 elif b2[i]==1: self.strich(x0,y0,dp2,dh,255) x0+=dp2 x0+=40 y0+=int(dh*1.5) draw=ImageDraw.Draw(self.im) draw.text((50,y0),title,(0,0,0)) self.im.save(title+'.jpg') self.im.show() self.im.close() # def main(): title=input('Bezeichnung eingeben: ') dezcode=input('Dezimalcode als xxxxx-x eingeben:') # bc=BCODE() if bc.set(dezcode): s='%35.35s'%title+'%12.12s '%dezcode f=bc.bin_code(bc.dez_code) for z in f: s+='%1.1s '%z print(s) # continue bc.make_codec() bi=BCODE_Image() bi.make_barcode_Image(bc.b1,bc.b2,title) else: print('Error') # if __name__ == '__main__': main()