3 de marzo de 2006

Códigos de barra 128 con lectura humana

En este artículo vamos a presentar unas funciones para imprimir códigos de barras del tipo 128 con diversas fuentes TrueType que nos permitirán lograr distintas alturas de códigos de barras y también la impresión de la cadena para lectura humana.

Los códigos 128

Como ya vimos en el artículo "Códigos de barras en reportes de Visual FoxPro", los códigos de barras 128 se dividen en 3 subconjutos:
  • El subconjunto A incluye: los dígitos, las letras mayúsculas, y los códigos de control.
  • El subconjunto B incluye: los dígitos, las letras mayúsculas y minúsculas, y los códigos de control.
  • El subconjunto C incluye: solo los dígitos y comprime dos dígitos numéricos en cada carácter, proporcionando una muy buena densidad de impresión.
Los códigos 128 se forman de la siguiente manera:
CaracterInicial + CadenaTexto + DigitoControl + CaracterFinal 
Las funciones descritas al final del artículo calculan el dígito de control y añaden los caracteres de inicio y final de cada tipo de código de barra 128, a la cadena de texto.

Las fuentes TrueType

Las siguientes son una descripción de las fuentes disponibles en este artículo:
  • Code 128AB (Bc128ab.ttf): Código 128 A y B Normal
  • Code 128AB Short (Bc128abs.ttf): Código 128 A y B Bajo
  • Code 128AB Tall (Bc128abt.ttf): Código 128 A y B Alto
  • Code 128AB HR (Bh128ab.ttf): Código 128 A y B Normal con Lectura Humana
  • Code 128AB Short HR (Bh128abs.ttf): Código 128 A y B Bajo con Lectura Humana
  • Code 128AB Tall HR (Bh128ab.ttf): Código 128 A y B Alto con Lectura Humana
  • Code 128C (Bc128c.ttf): Código 128 C Normal
  • Code 128C Short (Bc128cs.ttf): Código 128 C Bajo
  • Code 128C Tall (Bc128ct.ttf): Código 128 C Alto
  • Code 128C HR (Bh128c.ttf): Código 128 C Normal con Lectura Humana
  • Code 128C HR Short (Bh128cs.ttf): Código 128 C Bajo con Lectura Humana
  • Code 128C HR Tall (Bh128ct.ttf): Código 128 C Alto con Lectura Humana
  • Codigo de barras CyT (codigo_barras_cyt.ttf): Código 128 A y B Alto
Estas fuentes TrueType se corresponden adecuadamente al tamaño de fuente mínimo recomendado por Correos de España que es 24 y de un ancho máximo de 105 mm.

Los requisitos para los envíos a Correos de España son:
  • Código 128 A
  • Densidad entre 0,38 mm. y 0,63 mm.
  • Composición del código:
    • Tipo de producto en 2 posiciones: Consultar con Correos los tipos admitidos
    • Código de cliente en 8 posiciones: Solicitar el código a Correos
    • Número de envío en 13 posiciones: No puede repetirse antes de 5 años. Puede incluir el año como las 4 primeras posiciones
La fuente que mejor se adapta a estos requisitos es la "Code 128AB Tall HR" con un tamaño de 28 puntos.

Independientemente de lo expresado anteriormente, estas fuentes TrueType se pueden adaptar a cualquier necesidad de impresión de códigos de barras 128, por las diversas combinaciones posibles entre tipo, tamaño e impresión de la cadena para la lectura humana.

Las funciones en VFP

Las funciones en Visual FoxPro para cada uno de los tres tipo de código de barra 128 son las siguientes:
FUNCTION Codigo128A
  LPARAMETERS m.cadena
  *** Convierte una cadena para ser impresa en un
  *** código de barras de tipo 128 A
  *** Fuentes True Type válidas:
  *** "Code 128AB", "Code 128AB HR",
  *** "Code 128AB Short", "Code 128AB Short HR",
  *** "Code 128AB Tall", "Code 128AB Tall HR"  y
  *** "Codigo de barras CyT"
  IF PCOUNT() = 0
    RETURN ""
  ENDIF
  IF TYPE("m.cadena") = "N"
    m.cadena = TRANSFORM(m.cadena)
  ENDIF
  IF TYPE("m.cadena") != "C"
    RETURN ""
  ENDIF
  m.cadena = ALLTRIM(m.cadena)
  LOCAL m.vuelta, m.suma, m.caracterinicial, m.co, m.letra, ;
    m.valorascii, m.checksum, m.caracterfinal
  m.suma = 103
  m.caracterinicial = CHR(123)
  m.vuelta = m.caracterinicial
  m.caracterfinal = CHR(126)
  FOR m.co = 1 TO LEN(m.cadena)
    m.letra = SUBSTR(m.cadena, m.co, 1)
    m.valorascii = ASC(m.letra)
    m.valorascii = m.valorascii - IIF(m.valorascii < 123, 32, 70)
    m.suma = m.suma + (m.valorascii * m.co)
    m.vuelta = m.vuelta + IIF(m.letra = " ", CHR(174), m.letra)
  NEXT m.co
  m.checksum = MAX(MOD(m.suma, 103), 0)
  m.checksum = m.checksum + IIF(m.checksum > 90, 70, IIF(m.checksum = 0, 174, 32))
  m.checksum = CHR(m.checksum)
  m.vuelta = m.vuelta + m.checksum + m.caracterfinal
  RETURN m.vuelta
ENDFUNC
FUNCTION Codigo128B
  LPARAMETERS m.cadena
  *** Convierte una cadena para ser impresa en un
  *** código de barras de tipo 128 B
  *** Fuentes True Type válidas:
  *** "Code 128AB", "Code 128AB HR",
  *** "Code 128AB Short", "Code 128AB Short HR",
  *** "Code 128AB Tall", "Code 128AB Tall HR"  y
  *** "Codigo de barras CyT"
  IF PCOUNT() = 0
    RETURN ""
  ENDIF
  IF TYPE("m.cadena") = "N"
    m.cadena = TRANSFORM(m.cadena)
  ENDIF
  IF TYPE("m.cadena") != "C"
    RETURN ""
  ENDIF
  m.cadena = ALLTRIM(m.cadena)
  LOCAL m.vuelta, m.suma, m.caracterinicial, m.co, m.letra, m.valorascii, ;
    m.checksum, m.caracterfinal
  m.suma = 104
  m.caracterinicial = CHR(124)
  m.vuelta = m.caracterinicial
  m.caracterfinal = CHR(126)
  FOR m.co = 1 TO LEN(m.cadena)
    m.letra = SUBSTR(m.cadena, m.co, 1)
    m.valorascii = ASC(m.letra)
    m.valorascii = m.valorascii - IIF(m.valorascii < 123, 32, 70)
    m.suma = m.suma + (m.valorascii * m.co)
    m.vuelta = m.vuelta + IIF(m.letra = " ", CHR(174), m.letra)
  NEXT m.co
  m.checksum = MAX(MOD(m.suma, 103), 0)
  m.checksum = m.checksum + IIF(m.checksum > 90, 70, IIF(m.checksum = 0, 174, 32))
  m.checksum = CHR(m.checksum)
  m.vuelta = m.vuelta + m.checksum + m.caracterfinal
  RETURN m.vuelta
ENDFUNC
FUNCTION Codigo128C
  LPARAMETERS m.cadena
  *** Convierte una cadena para ser impresa en un
  *** código de barras de tipo 128 C
  *** Fuentes True Type válidas:
  *** "Code 128C", "Code 128C HR",
  *** "Code 128C Short", "Code 128C HR Short",
  *** "Code 128C Tall", "Code 128C HR Tall"
  IF PCOUNT() = 0
    RETURN ""
  ENDIF
  IF TYPE("m.cadena") = "N"
    m.cadena = TRANSFORM(m.cadena)
  ENDIF
  IF TYPE("m.cadena") != "C"
    RETURN ""
  ENDIF
  m.cadena = ALLTRIM(m.cadena)
  LOCAL m.vuelta, m.suma, m.caracterinicial, m.co, m.letra, ;
    m.valorascii, m.valorreal, m.checksum, m.caracterfinal
  m.suma = 105
  m.caracterinicial = CHR(125)
  m.vuelta = m.caracterinicial
  m.caracterfinal = CHR(126)
  IF LEN(m.cadena) % 2 # 0
    m.cadena = "0" + m.Cadena
  ENDIF
  FOR m.co = 1 TO LEN(m.cadena) STEP 2
    m.letra = SUBSTR(m.cadena, m.co, 2)
    m.valorreal = VAL(m.letra)
    m.valorascii = m.valorreal + IIF(m.valorreal < 90, 33, 71)
    m.suma = m.suma + (m.valorreal * CEILING(m.co/2))
    m.vuelta = m.vuelta + CHR(m.valorascii)
  NEXT m.co
  m.checksum = MAX(MOD(m.suma, 103), 0)
  m.checksum = m.checksum + IIF(m.checksum < 90, 33, 71)
  m.checksum = CHR(m.checksum)
  *-- Reemplazo CheckSum
  m.checksum = CHRTRAN(m.checksum, ;
    CHR(171)+CHR(172)+CHR(173), CHR(176)+CHR(177)+CHR(178))
  m.vuelta = m.vuelta + m.checksum + m.caracterfinal
  RETURN m.vuelta
ENDFUNC

Nota importante: Estas funciones solo se corresponden con las fuentes TrueType de este artículo. Las funciones de los artículos "Códigos de barras en reportes de Visual FoxPro" y "Resolución General 1702 de la AFIP (Argentina)" se corresponden a las fuentes disponibles para descarga de cada artículo. Cada fuente tiene su función asociada para la correcta generación de los distintas simbologías de códigos de barras.

Ejemplos

Para utilizar las funciones se debe pasar como parámetro la cadena a codificar:
lc128A = Codigo128A("CODIGO128A")
lc128B = Codigo128B("codigo128b")
lc128C = Codigo128C("16886271")
Para la impresión se debe seleccionar la fuente correspondiente a cada función:
CLEAR
? Codigo128A("CODIGO128A") FONT "Code 128AB Short HR",36
? Codigo128B("codigo128b") FONT "Code 128AB Tall HR",36
? Codigo128C("16886271") FONT "Code 128C HR",60
?
? Codigo128A("PortalFox") FONT "Codigo de barras CyT",48



Descargas

Estos son los enlaces para las descargas disponibles de este artículo:
  • Para descargar un proyecto de ejemplo haga clic aquí. (ejemplo128.zip 6,6 KB)
  • Hasta la próxima.

    Carlos Yohn Zubiria (España) y Luis María Guayán (Argentina)


    1 comentario :

    1. Este las fuentes y las funciones, puede servir para codigo de barra Ean128 asi:
      (415)7701234567897(8020)8000473260(3900)355000(96)19980728
      Donde el identificador 8020 y 3900 son variables, hay que usar un separador entre campos, cuando en un símbolo se concatenan varios campos de longitud variable

      ResponderBorrar

    Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.