Ir al contenido


Foto

Impresión de códigos de barra


  • Por favor identifícate para responder
18 respuestas en este tema

#1 r1d2m3

r1d2m3

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 09 marzo 2011 - 09:50

Hola amigos, quería plantearles el siguiente problema: necesito imprimir un código de barras, un ean 128 porque el código debe ser alfanumérico. El código a imprimir es un número GUID generado con delphi, el mismo, como ustedes saben, tiene 38 caracteres, al momento de comprar el lector, me llevo impreso un par de códigos de barra para probar el lector en el comercio y, ahi surgió el problema, no me los lee. La pregunta al foro es: ¿son demasiados caracteres para la lectora?, estoy utilizando una de esas fuentes de descarga gratuita y también podría ser este el problema, que el código no se haya generado correctamente. ¿Alguien ya trabajó imprimiendo y leyendo estos códigos?, si es así, por favor, les agradecería cualquier comentario que me ayude a resolver este inconveniente.

Saludos y quedo a la espera de vuestros comentarios.
  • 0

#2 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 09 marzo 2011 - 10:07

Yo tengo entendido que el lector ingresa el código, como si fuera una entrada por teclado pero completa. Lo más probable es que no tengas instalados los drivers correspondientes y por ende no te funciona,trata de revisar eso.
  • 0

#3 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 marzo 2011 - 10:11

Hola y bienvenido al foro  (y) :

Cuando dices que no te lee los códigos, ¿es porque no emite ningún sonido el lector? ¿o porque tu programa no reacciona a la señal del lector y no te muestra nada? En este segundo caso convendría que nos pusieras cómo estás capturando la señal del lector.

Saludos
  • 0

#4 r1d2m3

r1d2m3

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 09 marzo 2011 - 10:15

Gracias por la pronta respuesta, el lector no emite ningún pitido. Probé otros código que tenía el vendedor en su local y si los leyó, emitió el clásico pitido y tomó el código, pero sobre el mio no hizo nada, ningún pitido y ninguna transmisión a la pantalla. Lo diferente de mi código y el del comercio era simplemente la cantidad de caracteres de uno y de otro, el mio tenía 38 caracteres y el del comercio 14 o 15, no mas.

  • 0

#5 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 09 marzo 2011 - 10:20

Q tal r1d2m3, mmm extraño, pero de casualidad las especificados de tu lector y modelo especifican poder leer el tipo de código que deseas?, desconozco si el formato que utilizas es estandar o al menos para el lector que tienes.


Saludos.
  • 0

#6 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 marzo 2011 - 10:29

Como dice fredycc, deberías verificar en las especificaciones del lector que has comprado si es capaz de capturar esos 38 dígitos. Otra pregunta es si esos códigos con que has hecho la prueba los has generado tú con la impresora a partir de los números GUID, a ver si no están correctamente generados, o si los has tomado de algún sitio creyendo que te servían.


Saludos

  • 0

#7 r1d2m3

r1d2m3

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 09 marzo 2011 - 10:33

si, el lector es de última generación, probé los dos tipos, uno laser y otro del tipo led y no me leyo con ninguno de ellos. ¿ustedes hay trabajado ya con códigos de barra?. Por las dudas tenga importancia, estoy usando una fuente del tipo truetype que descargué de la web, y tal vez esté por allí el problema. Para imprimir el código de barras lo que hago es usar el objeto printer, y definir su Canvas.Font.Name esta letra que descargué de la web, esto sale sin inconvenientes y se imprime un código de barras, ahora bien, tal vez este código no esté bien construido con dicha fuente. Si alguien usa este método u otro, agradezco sus comentarios.

El código está generado con CreateGuid que me genera una estructura alfanumérica normal, la que necesito codificar con un ean-128 (por ser alfanumérico). Por suerte, aún no lo compré, fuí al comercio con mi código impreso, lo probé, no me funcionó y aquí estamos.

  • 0

#8 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 marzo 2011 - 10:48

Hola r1d2m3:

Mi experiencia con códigos de barras se remonta a hace unos cuantos años, llegué a trabajar con códigos code 39 y para imprimirlos encontré unos componentes que por un lado mostraban el código de barras en pantalla (en tu caso supongo que utilizas un TLabel con la fuente truetype) , y por otro tenían su versión QR (para QuickReports) por lo que me fue muy fácil insertarlos en un informe y así imprimirlos sobre papel de etiquetas, sin necesidad de acceder directamente al Canvas. Me temo que si dibujas sobre el Canvas, aunque utilices dicha fuente, tendrás que calibrarla para que te imprima en el tamaño adecuado, si te pasas por pequeña o por grande posiblemente el lector no te lo reconozca.

Los componentes en cuestión se llaman TBarcode y TQRBarcode (venían con sus hermanitos dataware TDBBarcode y TDBQRBarcode) quizás una búsqueda en la web te permita encontrarlos o algunos parecidos y espero que ya soporten el protocolo ean 128. Yo te los puedo enviar pero la versión que tengo sólo soporta code39  :( .

Saludos
  • 0

#9 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 marzo 2011 - 10:59

Una posible prueba que podrías hacer es mediante esa misma fuente truetype que estás utilizando, hacer mútliples impresiones aumentando cada vez su tamaño en 1, a ver si algún código te lo reconoce el lector.

Saludos
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 marzo 2011 - 01:55

Yo también he usado TBarcode sin problemas: http://www.han-soft.com/index.php


Saludos.
  • 0

#11 r1d2m3

r1d2m3

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 09 marzo 2011 - 02:43

Muchas gracias a todos por sus respuestas, creo que mi problema pasa por como construyo el código de barras, pensé que solo era cuestión de descargar las fuentes y mandar a imprimir con dichas fuentes, pero, leyendo e investigando un poco mas, el code128 requiere usar un dígito de verificación, es decir, debo construir la etiqueta anexando el dígito verificador al final, ademas de indicar el tipo de code 128 que uso, ya sea A, B o C. Si alguien tiene algún link donde se discuta como generar este código de verificación, les agradeceré el aporte.

Saludos.
  • 0

#12 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 10 marzo 2011 - 01:35

otra cosa: ¿has mirado si el escaner está configurado? Yo he probado con algunos y en ciertos casos había que habilitar los códigos que va a interpretar configurando el escaner.

De todas formas, el algoritmo del 128C (que es sólo numérico, no como el 128A o el 128B) creo que es el siguiente:
  El conjunto de caracteres 128C sólo tiene códigos numéricos y siempre es un número par; El valor de barras inicial, que indica que se trata de un 128C es 105 
Se toman todos los dígitos por pares; cada par se multiplica por su peso (posición) y se suman; Al total se le suma el código de inicio 105; El total resultante se divide por 103, tomándose el resto como dígito de control.
  Ejemplo: 
  Código: 10123450012345  Se toman los pares de números y se multiplian por su peso:
  10 * 1 = 10

  12 * 2 = 24
  34 * 3 = 102
  50 * 4 = 200
  01 * 5 = 5
  23 * 6 = 138
  45 * 7 = 315
  ---
794
  + 105
  ---
  899
  899 / 103 = 8 (Resto 75): Por tanto el caracter de control es 75
  Espero que esto disipe vuestras dudas.  Un saludo
  • 0

#13 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 10 marzo 2011 - 04:44

Hola R2D2 (perdón por la broma, pero el nombre de usuario me lo recordo), creo que el problema es que con una fuente de caracteres puedes imprimir codigos de barras de la longitud que tu quieras, pero para que sean validos, han de tener una estructura especifica, no vale cualquier texto convertido a barras con un font.

Por ejemplo, es de esperar que tengas que limitarte a códigos de no mas de N caracteres (ese N depende del formato), que además, si tiene menos de N lo tengas que rellenar con ceros, espacios o lo que diga el estandar elegido, y que finalmente haya de ir acompañado por 2 o 3 caracteres adicionales -normalmente a mitad del texto- que son un checksum de los "codigos reales". Si tu string no cumple esto ANTES de convertrilo a codigo de barras, lo que obtienes NO es un codigo de barras en tal o cual formato, es una foto de una cebra sin mas.

Yo cuando prepare mi programa para imprimir códigos de barras (ojo, para leerlos no se necesita nada ya que la pistola ES un teclado, solo tienes que configurarla para que "teclee" o no los digitos de control y añada o no un salto de linea al final, solo eso) me hice un tutorial para que mis clientes supiesen como configurar la pistola y esas cosas, ademas, añadi al final un "como hacerse un codigo de barras en casa con un boli y paciencia", donde explica paso a paso como se calculan esos digitos de control y como se convierte todo eso a rayas (yo no uso fonts, lo dibujo "a pelo" sobre el canvas, pero eso fue por pura necesidad), asi que te recomiendo que te leas por encima el principio (configurar la pistola) y el final (como funciona el codigo de barras), aunque en mi caso no era para el mismo formato que el tuyo (EAN/UPC-A).

http://www.hcsoft.ne...cer&hoja=barras

Aparte de esta aportación "personal", tengo aun almacenados los links que en su dia encontre sobre los detalles de cada formato de codigo de barras, es informacion muy dificil de localizar por alguna razón, asi que te puede venir bien (busca en ellos tu formato a ver que te dicen de el).

Este primero lista los estandares existentes, con una imagen de ejemplo, y te da informacion basica como largo del codigo y si lleva o no digitos de control: http://www.inliteres..._standards.html

Este es un software de pago con version free que te permite generar el codigo de barras correctamente, y asi poder compararlo con el que genera tu programa, de forma que hasta que no te coincida, algo va mal (no recuerdo bien, pero creo que la ayuda que trae el programa tambien me sirvio de algo): http://www.barcodema...demagic/windows

Mas cosas interesantes: Tengo un documento (.DOC) con el estandard ISO de los formatos EAN/UPC, es muy tecnico, y ademas veo que es del 2000 y que NO incluye los alfanumericos... pero sirve para aclarar cualquier duda sobre los codigos numericos. El documento viene "etiquetado" como ISO/IEC FDIS 15420:2000(E) así que supongo que en google se podrá localizar....  vaya, si que lo encontre, a solo 136 euros el PDF! (use PM, Luke!)

Tambien tengo guardado un rpmdbarcode.pas (TRpBarcode printable component de un tal toni@pala.com) que SI que incluye el EAN 128c, dice estar basado en BarCode (The component is based in Barcode component Version 1.3), asi que si lo necesitas, te puedo enviar la unidad.

Bueno, y finalmente tengo mi propio codigo para crear strings usables en UPC-A (11 digitos), que os pongo por si os es de utilidad a alguien.



delphi
  1. // *******************************
  2. // ** Codigos de barras "UPC A" **
  3. // *******************************
  4. //
  5. // Funciona en 3 fases:
  6. // -El numero se completa/recorta a 11 digitos con ceros a la derecha.
  7. // -Se calcula el digito de control y se añade como el digito 12
  8. // -Se convierte a una secuencia de 1,2 y 3 que son los grosores de las barras.
  9.  
  10. //A partir de una lista de numeros, los ajusta a 11 de largo y le añade el digito de control
  11. function BarrasAddDC(var Cod: string): string;
  12. var i, Num, CheckSum: integer;
  13. begin
  14.   //Solo se admiten digitos...
  15.   if not IsInteger(Cod) then begin
  16.     result:= Cod;
  17.     exit;
  18.   end;
  19.   //No se pueden impimir mas de 11 digitos...
  20.   if length(Cod)>11 then
  21.     raise EHCException.create('Intenta generar un codigo de barras de mas de 11 digitos ('+NT(Cod) +
  22.                               '), pero solo se admiten 11.');
  23.   //Añado ceros al principio...
  24.   Cod:= Copy(Cod,1,11);
  25.   while length(Cod)<11 do Cod:= '0'+Cod;
  26.   //Calculo el digito 12 (el checksum)
  27.   CheckSum:= 0;
  28.   for i:= 1 to length(Cod) do begin
  29.     Num:= StrToInt(copy(Cod,i,1));
  30.     Checksum:= CheckSum + Num * iif((i mod 2)=1, 3, 1);
  31.   end;
  32.   CheckSum:= 10 - (CheckSum mod 10);
  33.   if (CheckSum=10) then CheckSum:= 0;
  34.   //Sumo este digito extra al final
  35.   result:= Cod + IntToStr(CheckSum);
  36. end;
  37.  
  38. //Convierto 12 digitos en una lista de barras de grosor 1,2 o 3, la primera
  39. //barra se pinta negra, la siguiente blanca, etc. (Formato "UPC A")
  40. function Txt2Barras(Cod: string): string;
  41. var i, Num: integer;
  42. const
  43.   Codes: array [0..9] of string = ('3211', '2221', '2122', '1411', '1132',
  44.       '1231', '1114', '1312', '1213', '3112');
  45.   IniCode: string = '111';  //Se pinta al principio y al final
  46.   MedCode: string = '11111'; //En medio de los 12 numeros
  47. begin
  48.   result:= '';
  49.   //Aqui me tiene que llegar un texto con 12 digitos
  50.   if not IsInteger(Cod) then
  51.     raise Exception.create('Intenta generar un código de barras con letras ('+NT(Cod)+
  52.                           '), pero solo se admiten números.');
  53.   if length(Cod)<>12 then
  54.     Cod:= BarrasAddDC(Cod); //Compatibilidad para atras
  55.     //raise Exception.create('Intenta generar un codigo de barras que no es de 12 digitos ('+Cod+'), pero solo se admiten 12.');
  56.   //Codigo de barras en formato "UPC A"
  57.   //
  58.   //Este sistema imprime solo numeros, maximo 11, en la forma 1+5+5+1 = 12
  59.   //numeros, tu le pasas X, el añade ceros al principio hasta tener 11, y
  60.   //el ultimo es un digito de control.
  61.   //
  62.   //Ademas, se generan 6 digitos a barras, se añaden 5 lineas finas (cinco unos)
  63.   //y luego se añaden los otros 6 digitos, que salen en negativo porque hemos
  64.   //añadido un numero impar de barras en medio.
  65.   //
  66.   //Construyo la lista de barras a dibujar.
  67.   //Cada digito es una barra, la primera negra, luego blanca, etc, y cada
  68.   //digito es un grosor (1=fino, 2=medio, 3=gorda).
  69.   //
  70.   //Se empieza con 3 unos...
  71.   result:= IniCode;
  72.   //Luego vienen los 6 primeros digitos, 11111 y luego los ultimos 6
  73.   for i:= 1 to 12 do begin
  74.     Num:= StrToInt(copy(Cod,i,1));
  75.     result:= result + Codes[Num];
  76.     //Lineas finas de la mitad...
  77.     if (i=6) then
  78.       result:= result + MedCode;
  79.   end;
  80.   result:= result+IniCode;
  81. end;


  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 10 marzo 2011 - 11:11

Para que no te enrrolles con los digitos de verificacion y la estructura del codigo imprime directamente en CODE39 y no vas a tener ningun tipo de problema
  • 0

#15 r1d2m3

r1d2m3

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 10 marzo 2011 - 11:58

El problema es que debo codificar una cadena alfanumérica de 38 caracteres, por eso es que no puedo usar un CODE39. Para ser mas explícito, lo que deseo codificar es un GUID, que tiene la siguiente apariencia = {035C9595-1BF8-4A53-A44A-61FB7771D286}, a lo sumo, puedo quitar las llaves de apertura y de cierre ya que las mismas no son parte del guid, es decir, siempre estarán ahí.
  • 0

#16 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 10 marzo 2011 - 12:31

La verdad es que un GUID es enorme así que no sé si podrás comprimirlo en un código de barras de tamaño razonable (desde luego el Code 39 no es viable).

¿ Has probado con algún componente específico de códigos de barras ?. A mi los códigos de barras incorporados en reports Fast-Report nunca me han dado ningún problema (aunque nunca he probado códigos tan largos).

http://www.fast-repo...streport-4.html

Saludos
  • 0

#17 r1d2m3

r1d2m3

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 11 marzo 2011 - 09:31

Hola a todos nuevamente, sigo enfrascado en el tema Códigos de Barra, avanzando con las pruebas, abandoné la idea de codificar un número guid, la voy a sustituir por un número generado de forma secuencial que tendrá cierta construcción tal como año+provincia+juzgado+secuencia numérica tomando 4 dígitos para el año, 2 para provincia, 3 para juzgado y 7 para secuencia numérica. Por su largo, sigo necesitando codificar un code128, mi problema es el siguiente: ¿alquien tiene el código del algoritmo del dígito verificador para el code128c que es el que debería usar para codificar solo números? y por último, ¿que fuentes utilizan ustedes?, yo me bajé unas pero no me resultan de confianza, revisando que valores están codificados, veo que le faltan algunos caracteres.

Desde ya, muchas gracias y quedo a la espera de vuestros comentarios.

  • 0

#18 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 11 marzo 2011 - 01:46

Hola,

No puedo ayudarte con ese código code128, aunque bibliografía sobre el tema debe haber bastante en la web. Tampoco he usado fuentes para esto, sino los componentes que te recomendé y de los que escafandra te puso un enlace. Por lo que he mirado, ahora son de pago (shareware) también tienen una utilidad gratuita en su web que permite generar e imprimir  en varios códigos diferentes, entre los que está el de 128, sería bueno si lo probaras generando esa secuencia que te interesa y por lo menos cerciorarte de que el lector te reconoce las barras que te genere el programa.

Saludos
  • 0

#19 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 14 marzo 2011 - 04:12

Hola r1d2m3, como ya comenté, tengo una unidad .pas que sirve para varios tipos de códigos de barras incluido el 128C, te copio aquí todo el código.

NOTA: Parece que no puedo postear tanto código... se ve a medio en el foro... buscaré otra forma... lo teneis aqui: http://www.hcsoft.ne...rpmdbarcode.pas



delphi
  1. {*******************************************************}
  2. {                                                      }
  3. {      Report Manager                                  }
  4. {                                                      }
  5. {      rpmdbarcode                                    }
  6. {      TRpBarcode printable component                  }
  7. {      Barcode implementation                          }
  8. {                                                      }
  9. {      Copyright © 1994-2002 Toni Martir            }
  10. {      toni@pala.com                                  }
  11. {                                                      }
  12. {      This file is under the MPL license              }
  13. {      If you enhace this file you must provide        }
  14. {      source code                                    }
  15. {                                                      }
  16. {      The component is based in Barcode component    }
  17. {      Barcode Component                              }
  18. {      Version 1.3                                    }
  19. {      Copyright 1998-99 Andreas Schmidt and friends  }
  20. {      mailto:shmia@bizerba.de or                      }
  21. {      a_j_schmidt@rocketmail.com                      }
  22. {      Lisenced as Freeware                            }
  23. {                                                      }
  24. {      It has been revised added properties and        }
  25. {      implementation for 128C optimized codebar      }
  26. {                                                      }
  27. {      September 2004 Added PDF417 2D barcode support  }
  28. {      based on Turbo Power Systools codebase          }
  29. {                                                      }
  30. {                                                      }
  31. {*******************************************************}
  32.  
  33. unit rpmdbarcode;
  34.  
  35. ...lo pongo como fichero descargable...


  • 0




IP.Board spam blocked by CleanTalk.