
Impresión de códigos de barra
#1
Posted 09 March 2011 - 09:50 AM
Saludos y quedo a la espera de vuestros comentarios.
#2
Posted 09 March 2011 - 10:07 AM
#3
Posted 09 March 2011 - 10:11 AM

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
#4
Posted 09 March 2011 - 10:15 AM
#5
Posted 09 March 2011 - 10:20 AM
Saludos.
#6
Posted 09 March 2011 - 10:29 AM
Saludos
#7
Posted 09 March 2011 - 10:33 AM
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.
#8
Posted 09 March 2011 - 10:48 AM
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
#9
Posted 09 March 2011 - 10:59 AM
Saludos
#10
Posted 09 March 2011 - 01:55 PM
#11
Posted 09 March 2011 - 02:43 PM
Saludos.
#12
Posted 10 March 2011 - 01:35 AM
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
#13
Posted 10 March 2011 - 04:44 AM
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.
// ******************************* // ** Codigos de barras "UPC A" ** // ******************************* // // Funciona en 3 fases: // -El numero se completa/recorta a 11 digitos con ceros a la derecha. // -Se calcula el digito de control y se añade como el digito 12 // -Se convierte a una secuencia de 1,2 y 3 que son los grosores de las barras. //A partir de una lista de numeros, los ajusta a 11 de largo y le añade el digito de control function BarrasAddDC(var Cod: string): string; var i, Num, CheckSum: integer; begin //Solo se admiten digitos... if not IsInteger(Cod) then begin result:= Cod; exit; end; //No se pueden impimir mas de 11 digitos... if length(Cod)>11 then raise EHCException.create('Intenta generar un codigo de barras de mas de 11 digitos ('+NT(Cod) + '), pero solo se admiten 11.'); //Añado ceros al principio... Cod:= Copy(Cod,1,11); while length(Cod)<11 do Cod:= '0'+Cod; //Calculo el digito 12 (el checksum) CheckSum:= 0; for i:= 1 to length(Cod) do begin Num:= StrToInt(copy(Cod,i,1)); Checksum:= CheckSum + Num * iif((i mod 2)=1, 3, 1); end; CheckSum:= 10 - (CheckSum mod 10); if (CheckSum=10) then CheckSum:= 0; //Sumo este digito extra al final result:= Cod + IntToStr(CheckSum); end; //Convierto 12 digitos en una lista de barras de grosor 1,2 o 3, la primera //barra se pinta negra, la siguiente blanca, etc. (Formato "UPC A") function Txt2Barras(Cod: string): string; var i, Num: integer; const Codes: array [0..9] of string = ('3211', '2221', '2122', '1411', '1132', '1231', '1114', '1312', '1213', '3112'); IniCode: string = '111'; //Se pinta al principio y al final MedCode: string = '11111'; //En medio de los 12 numeros begin result:= ''; //Aqui me tiene que llegar un texto con 12 digitos if not IsInteger(Cod) then raise Exception.create('Intenta generar un código de barras con letras ('+NT(Cod)+ '), pero solo se admiten números.'); if length(Cod)<>12 then Cod:= BarrasAddDC(Cod); //Compatibilidad para atras //raise Exception.create('Intenta generar un codigo de barras que no es de 12 digitos ('+Cod+'), pero solo se admiten 12.'); //Codigo de barras en formato "UPC A" // //Este sistema imprime solo numeros, maximo 11, en la forma 1+5+5+1 = 12 //numeros, tu le pasas X, el añade ceros al principio hasta tener 11, y //el ultimo es un digito de control. // //Ademas, se generan 6 digitos a barras, se añaden 5 lineas finas (cinco unos) //y luego se añaden los otros 6 digitos, que salen en negativo porque hemos //añadido un numero impar de barras en medio. // //Construyo la lista de barras a dibujar. //Cada digito es una barra, la primera negra, luego blanca, etc, y cada //digito es un grosor (1=fino, 2=medio, 3=gorda). // //Se empieza con 3 unos... result:= IniCode; //Luego vienen los 6 primeros digitos, 11111 y luego los ultimos 6 for i:= 1 to 12 do begin Num:= StrToInt(copy(Cod,i,1)); result:= result + Codes[Num]; //Lineas finas de la mitad... if (i=6) then result:= result + MedCode; end; result:= result+IniCode; end;
#14
Posted 10 March 2011 - 11:11 AM
#15
Posted 10 March 2011 - 11:58 AM
#16
Posted 10 March 2011 - 12:31 PM
¿ 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
#17
Posted 11 March 2011 - 09:31 AM
Desde ya, muchas gracias y quedo a la espera de vuestros comentarios.
#18
Posted 11 March 2011 - 01:46 PM
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
#19
Posted 14 March 2011 - 04:12 AM
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
{*******************************************************} { } { Report Manager } { } { rpmdbarcode } { TRpBarcode printable component } { Barcode implementation } { } { Copyright © 1994-2002 Toni Martir } { toni@pala.com } { } { This file is under the MPL license } { If you enhace this file you must provide } { source code } { } { The component is based in Barcode component } { Barcode Component } { Version 1.3 } { Copyright 1998-99 Andreas Schmidt and friends } { mailto:shmia@bizerba.de or } { a_j_schmidt@rocketmail.com } { Lisenced as Freeware } { } { It has been revised added properties and } { implementation for 128C optimized codebar } { } { September 2004 Added PDF417 2D barcode support } { based on Turbo Power Systools codebase } { } { } {*******************************************************} unit rpmdbarcode; ...lo pongo como fichero descargable...