amantecayolt, se traduce del nahuatl como ciencias de la tecnología ó tecnología http://www.espanolsinfronteras.com/Diccionarios/EspdeMx-DiccEspanolNahuatl-T.htm

martes, 15 de abril de 2008

Script de Python para generar un codigo de barra 128

Este es un script que hice para mi aplicacion de Zope en la que imprimo unas credenciales con codigo de barras en codigo 128. Se copia en la carpeta de Extensions y se crea en mi instancia de zope un objeto tipo External Metod con
  • id: ean_128
  • module name: ean_128
  • function name: convierteA128
La mando llamar con el siguiente codigo

<dtml-let codigo="'%06d-%05d'">
<div class="nomostrar" id="codigo_barra"><dtml-var expr="ean_128((codigo)%(taller, credencial), False)"></div>
<div class="nomostrar" id="taller_credencial"><dtml-var expr="(codigo)%(taller, credencial)"></div>
</dtml-let>

El <dtml-let codigo="'%06d-%05d'">permite dar formato: si le mando taller 15 y credencial 148 me regresa 000015-00148 y convierto la cadena a codificacion 128.

Se debe tener instalado el tipo de letra Code128bWin. Tambien es importante tener en codificacion de salida en zope.conf, opcion default-zpublisher-encoding como iso-8859-1

script ean_128.py [RS] [MU]:


validoB=' !"#$%&\'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
validoC='0123456789'
startB = 154
startC = 155
cambioC= 149
cambioB= 150
stop   = 156

def convierteA128(s, TipoC=True):
"""Convierte una cadena a su representacion ASCII de codigo de barra"""
   lista = formaLista(s, TipoC)
   verificador= digito_verificador(lista)
   lista.append(verificador)
   lista.append(chr(stop))
   cadena=""
   for c in lista:
      cadena=cadena + c
   return cadena

def digito_verificador(lista):
"""Saca el digito verificador de la lista de Codigo de Barra Codificada"""
   import string
   l2=[]
   i=suma=l=0
   j=len(lista)
   if ord(lista[0])==startB:
    suma=startB-50
   elif ord(lista[0])==startC:
   suma=startC-50
   for i in range(1,j):
    if len(lista[i])==2:
        l=string.atoi(lista[i])
    elif ord(lista[i])==cambioC:
        l=cambioC-50
    elif ord(lista[i])==cambioB:
        l=cambioB-50
    else:
        l=ord(lista[i])-32
    l=l*i
    suma=suma+l
   i,residuo= divmod(suma,103)
   return regresa(residuo)

def formaLista(s,TipoC):
"""Recorre la cadena para formar una lista con el Codigo de Barra Codificado"""
   l=[]
   esC=False
   cambio=False
   c=s[0]
   c2=' '
   if c in validoB:
    l.append(chr(startB))
   else:
    c=s[1]
    if c in validoB or TipoC==False:
        l.append(chr(startB))
    else:
        l.append(chr(startC))
        cambio=True

   for c in s:
    if (c in validoB or TipoC==False):
        esC=False
        if cambio==True:
            l.append(chr(cambioC))
            cambio=False
        if c2<>' ':
            l.append(c2)
            c2=' '
        l.append(c)
    elif (c in validoC):
        if (esC==False):
            c2=c
            esC=True
        else:
            if c2 <> ' ':
                if cambio==False:
                    cambio=True
                    l.append(chr(cambioB))
                num=c2 + c
                c2=' '
                l.append(num)
            else:
                c2=c

   if c2<>' ':
    if cambio==True:
        l.append(chr(cambioC))
    l.append(c2)

   return l

def regresa(i):
"""Convierte el digito verificador a su representacion ASCII"""
   if i==0:
    return chr(128)
   if i >= 95:
    return chr(i+50)
   elif i>0 and i<95: br=""> return chr(i+32)

No hay comentarios: