Validar un código de barras en EAN8 / EAN13

function EsEan(CodigoEan : String) : Boolean;
var
   CheckSum, DigitoOrig : String;
   i, Digito, Longitud  : Integer;
begin
  Longitud := Length(CodigoEan);

   // Comprobar que no hay menos o más caracteres de los permitidos (8 ó 13)
   if not ((Longitud <> 8) and (Longitud <> 13)) then
   begin
   // Obtener el dígito de control leido en un principio
     DigitoOrig := Copy(CodigoEan, Longitud, 1);

     // Quitar el dígito de control que se ha obtenido en la lectura para procesar
     // el código de barras y verificar su correcta lectura.
     CodigoEan := Copy(CodigoEan, 1, Longitud - 1);

     CheckSum := '131313131313';

     Digito := 0;

     for i := 1 to Longitud - 1 do
       Digito := Digito + (StrToInt(Copy(CodigoEan, i, 1)) * StrToInt(Copy(CheckSum, i, 1)));

     // Extraer el valor de la derecha.
     Digito := StrToInt(Copy(IntToStr(Digito), Length(IntToStr(Digito)),1));

     // Restarlo de 10 si es mayor o igual que 10.
     if Digito > 9 then
        Digito := 10 - Digito;

     // Comparar dígito de control original con el obtenido y devolver un resultado.
     Result := (Digito = StrToInt(DigitoOrig));
   end
   else
     Result := False;
end;