PDA

Ver la Versión Completa : Codigos de Barras


jostrix
06-10-2004, 07:32:23
Hola q tal a todos, me encuentro ante una situacion un poco dificil, necesito de su ayuda, lo q sucede es q nunca he trabajado con codigos de barras, y no se q tan complicado sea, si alguien puede decirme o recomendarme algun texto q me permite entender su funcionamiento en PHP y delphi, les agradecere eternamente.

Otra es q anteriormente entre estas paginas existia un componente q me permitia desarrollar codigos de barras, pero no lo he encontrado. Necesito desarrollar un pequeño programa q genere el codigo de barras en formato EAN, basado en las claves principales de mi b.d. de clientes. Alguien me puede orientar

vic_ia
06-10-2004, 18:19:09
hola...

los unicos componentes que he localizado para la generación de codigo de barras son de pago, algunos de ellos en componentes de codigo de barras EAN128 (http://idautomation.com/code128faq.html#EAN128andUCC128); otra opcion que tienes es utilizar alguna fuente del codigo de barras y hacer tu mismo el calculo de los códigos de control; en EAN128 (http://idautomation.com/code128faq.html#EAN128andUCC128)
puedes encontrar como general los codigos de control y al mandarlos a imprimir o visualizar utilizar una fuente de codigos de barras EAN128 (igualmente solo he encontrado fonts de pago,... pero sigo buscando alguna "free")...

saludos..

jostrix
16-10-2004, 21:06:10
Muchas gracias por responder mis dudas, cheque las paginas q me indicaste y estuve descargando unas demos, y pues buscando encontre el siguiente codigo q te desarrolla en EAN 8 y 13, tiene un errorcito al tratar con EAN 13, cuando el caluclo para el digito verificador es mayor q 100, pero q se resuelve con un nuevo mod de 10 sobre el resultado obtenido, (bueno eso creo, lo he hecho asi y no he tenido broncas por el momento)I

unit EAN;

interface

uses
Windows, SysUtils, Forms, Dialogs, StdCtrls, ExtCtrls, Classes, Controls;

const
EAN_izqA : array[0..9] of PChar=('0001101','0011001','0010011','0111101','0100011',
'0110001','0101111','0111011','0110111','0001011');
EAN_izqB : array[0..9] of PChar=('0100111','0110011','0011011','0100001','0011101',
'0111001','0000101','0010001','0001001','0010111');
EAN_dcha : array[0..9] of PChar=('1110010','1100110','1101100','1000010','1011100',
'1001110','1010000','1000100','1001000','1110100');
CodificaIzq : array[0..9] of PChar=('AAAAA','ABABB','ABBAB','ABBBA','BAABB',
'BBAAB','BBBAA','BABAB','BABBA','BBABA');

type
TFCodigoBarras = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Panel1: TPanel;
PaintBox1: TImage;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
// procedimiento que codifica el número en un nº binario
procedure Codifica(num : string);
// procedimiento para dibujar el cód. de barras a partir del nº binario
procedure Dibujar(matrix : string);
// procedimiento para validar-corregir los códigos
procedure EANCorrecto(var num : string);
end;

var
FCodigoBarras: TFCodigoBarras;

implementation

{$R *.DFM}

procedure TFCodigoBarras.EANCorrecto(var num : string);
var
i,N : byte;
sum : integer;
flag : byte;
begin
sum:=0;
N:=Length(num)-1;
for i:=1 to N do
begin
if (i mod 2)=0 then
begin
if N=12 then
sum:=sum+StrToInt(num[i])*3
else
sum:=sum+StrToInt(num[i]);
end
else
begin
if N=12 then
sum:=sum+StrToInt(num[i])
else
sum:=sum+StrToInt(num[i])*3;
end;
end;
if sum>99 then
Flag:=10-(sum mod 100)
else
Flag:=10-(sum mod 10);
if Flag=10 then Flag:=0;
if not(StrToInt(num[N+1])=flag) then
num:=copy(num,1,length(num)-1)+IntToStr(Flag);
end;

procedure TFCodigoBarras.Codifica(num : string);
var
matrix : string;
i : integer;
begin
num:=Edit1.Text;
matrix:='';
case Length(num) of
13: begin
EANCorrecto(num);
Edit1.Text:=num;
matrix:=matrix+'x0x'; // barra inicio
matrix:=matrix+EAN_izqA[StrToInt(num[2])];
for i:=3 to 7 do
if CodificaIzq[StrToInt(num[1])][i-3]='A' then
matrix:=matrix+EAN_izqA[StrToInt(num[i])]
else
matrix:=matrix+EAN_izqB[StrToInt(num[i])];
matrix:=matrix+'0x0x0'; // barra central
matrix:=matrix+EAN_dcha[StrToInt(num[8])];
matrix:=matrix+EAN_dcha[StrToInt(num[9])];
matrix:=matrix+EAN_dcha[StrToInt(num[10])];
matrix:=matrix+EAN_dcha[StrToInt(num[11])];
matrix:=matrix+EAN_dcha[StrToInt(num[12])];
matrix:=matrix+EAN_dcha[StrToInt(num[13])];
matrix:=matrix+'x0x'; // barra final
Dibujar(Matrix);
end;
8: begin
EANCorrecto(num);
Edit1.Text:=num;
matrix:=matrix+'x0x';
matrix:=matrix+EAN_izqA[StrToInt(num[1])];
matrix:=matrix+EAN_izqA[StrToInt(num[2])];
matrix:=matrix+EAN_izqA[StrToInt(num[3])];
matrix:=matrix+EAN_izqA[StrToInt(num[4])];
matrix:=matrix+'0x0x0';
matrix:=matrix+EAN_dcha[StrToInt(num[5])];
matrix:=matrix+EAN_dcha[StrToInt(num[6])];
matrix:=matrix+EAN_dcha[StrToInt(num[7])];
matrix:=matrix+EAN_dcha[StrToInt(num[8])];
matrix:=matrix+'x0x';
Dibujar(Matrix);
end
else
ShowMessage('LONGITUD DE CODIGO NO VALIDA');
end;

end;

procedure TFCodigoBarras.Dibujar(matrix : string);
var
i : integer;
begin
PaintBox1.Canvas.Brush.Color:=clWhite;
PaintBox1.Canvas.FillRect(Rect(0,0,PaintBox1.Width,PaintBox1.Height));
PaintBox1.Canvas.Pen.Color:=clBlack;

for i:=1 to Length(Matrix) do
if matrix[i]='1' then
PaintBox1.Canvas.PolyLine([Point(10+i,10),Point(10+i,50)])
else
if matrix[i]='x' then
PaintBox1.Canvas.PolyLine([Point(10+i,10),Point(10+i,55)]);

if Length(Edit1.Text)=13 then
begin
PaintBox1.Canvas.TextOut(3,50,Edit1.Text[1]);
PaintBox1.Canvas.TextOut(17,50,copy(Edit1.Text,2,6));
PaintBox1.Canvas.TextOut(63,50,copy(Edit1.Text,8,6));
end
else
if Length(Edit1.Text)=8 then
begin
PaintBox1.Canvas.TextOut(16,50,copy(Edit1.Text,1,4));
PaintBox1.Canvas.TextOut(48,50,copy(Edit1.Text,5,4));
end;

PaintBox1.Picture.SaveToFile('c:\windows\escritorio\BarCode\'+Edit1.Text+'.bmp');
end;

procedure TFCodigoBarras.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
begin
Codifica(Edit1.Text);
Edit1.SelStart:=0;
Edit1.SelLength:=Length(Edit1.Text);
end;
end;

end.


:p Ahora mi duda es, tengo una tabla relacionada con mis clientes en donde la clave principal es la q quiero el codigo genere su codigo de barras, el problema es q quiero q el sistema genere automaticamente la clave, pense en utilizar un campo Auto_increment, la bronca es q con este numero no se prevee lo del digito verificador..., entonces pense en un campo auto_increment y a partir de ese calcular el digio verificador y su concatenacion q sea el resultado... Esto es correcto? o existe una forma mas sencilla de hacerlo? y por otra parte q es mejor usar EAN 8 o EAN13, y en dado caso por q numero es recomendable inicializar mi campo auto_increment

Emilio
17-10-2004, 11:36:14
Eso con Delphi vale, pero con PHP de poco te va a servir, una solución válida para PHP es la de hacer uso de True Types, pero debes tener en cuenta que todo ordenador que quiera imprimir etiquetas debe tenerlas instaladas.

jostrix
17-10-2004, 23:46:22
Pues si seria de gran utilidad saber de donde puedo descargar las fuentes TrueType q mencionas, dado q se conoce el numero de maquinas q puedan ver mi aplicacion eso no seria problema o un link para descargar mis fuentes, pero tambien si alguien puede decirme como le pasa parametros desde php a una aplicacion Delphi y como indico a mi aplicacion delphi q necesita recibir un parametro para poder ser ejecutada

Emilio
21-10-2004, 15:58:26
Una simple búsqueda en google con "ean true type font" el primer enlace ya te vale...
http://www.sofotex.com/download/Graphics_Software/Font_Tools/