Page 1 of 2

tableta de captura de firma en formato digital

Posted: Mon Aug 07, 2017 5:57 pm
by miarcod
Hola,

Estoy probando una tableta para la captura de firma, como la que tienen los bancos, pero no se por donde empezar

¿Alguien la está utilizando?
Algún ejemplo, o ayuda será bienvenido

Gracias

Re: tableta de captura de firma en formato digital

Posted: Mon Aug 07, 2017 7:41 pm
by cnavarro
Marca y modelo?

Re: tableta de captura de firma en formato digital

Posted: Mon Aug 07, 2017 8:05 pm
by miarcod
WACOM STU-430/G

Re: tableta de captura de firma en formato digital

Posted: Mon Aug 07, 2017 8:44 pm
by cnavarro
Entiendo que te han de proporcionar alguna DLL, o algún SDK para su programación desde cualquier lenguaje

------------------------------------------- EDITO -----------------------------------------------

Si, he visto esto

http://signature.wacom.eu/es/productos/ ... tware-sdk/

Re: tableta de captura de firma en formato digital

Posted: Tue Aug 08, 2017 12:46 pm
by karinha

Re: tableta de captura de firma en formato digital

Posted: Tue Aug 08, 2017 4:28 pm
by miarcod
gracias,
voy a ver si consigo la información

Re: tableta de captura de firma en formato digital

Posted: Thu Aug 10, 2017 2:57 pm
by russimicro
Buena día...

Esta fue mi solución...

1. Las pen tablet, funcionan como una extensión del mouse y de la pantalla
2. Una vez instalada cualquier marca de pen tablet, queda habilita esta función y ya puede usar el lápiz sobre la tablet y dibujar. Esta función la puede
hacer a manera de prueba con el mouse sobre la aplicación que captura la digitalización ( dibujar a mano alzada), que puede ser microsoft paint o
una aplicación propia ( desarrollo)
3. En fivewin lo puede implementar con la clase TGRAPH

En estos días estoy desarrollando una app para manejo y registro de firmas, fotos y huellas y me encontré con los siguientes problemas :
A. Para la firma se debe capturar y luego recortar para que la imagen resultante no sea del tamaño de la ventana y que al imprimir se pueda ajustar
y ser legible en una área de firma de documento, no encontré esta opción en fivewin , sino que en java .
B. La solución fue en java (captura firma, la recorta y genera la imagen) y hacer interface desde mi app-fivewin mediante paso de parámetros
(directo o con archivo texto), y lanzar y cerrar la app-java desde fivewin como si fuera una ventana mas de mi app-fivewin.
( No se nota que es una app externa)
C. De esta forma ya tengo una app para toma de huellas, toma de fotos, lectura de basculas POS y ahora captura de firmas.

Con gusto le puedo ampliar este tema...

* todo lo hice con ejemplos java tomados de los fabricantes y adaptadas por terceros - google + el ajuste o desarrollo particular en java

Johnson Russi
Colombia

Re: tableta de captura de firma en formato digital

Posted: Tue Aug 22, 2017 7:19 pm
by miarcod
Bueno, me he puesto en contacto con el fabricante y he descargado el SDK, pero no se por donde tirar,

Tengo libreriras para C, pero al intentar enlazarlas en un ejemplo que tiene para C me tira el error

Code: Select all

Turbo Incremental Link 6.70 Copyright (c) 1997-2014 Embarcadero Technologies, Inc.
Error: 'X:\CEPP\FUENTES\FW\WACOM\LIB\W32\WGSSSTU.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
creo que el problema es que estan escritas para otro compilador.

tambien tengo la DLL "wgssSTU.DLL" y ahora estoy intentando usar una DLL pero no no se que funciones puedo utilizar y como llamarlas.

La documentación se refiere a esta clase como la primera para obtener los dispositvos conectados

For those wanting to skip any preamble, the key classes and functions are:

wgssSTU::UsbDevices – retrieves an array of attached USB tablets.
wgssSTU::UsbInterface and wgssSTU::SerialInterface – connects to a specific tablet.
wgssSTU::Tablet – queries and controls a tablet.
wgssSTU::JScript – provides helper routines for use in HTML.




Intento leeer el array de dispositivos con este ejemplo

Code: Select all

Function main()
   pruebaC()
   Msginfo("fin")
RETURN NIL

STATIC FUNCTION PruebaC()
Testear()
RETURN NIL

FUNCTION Testear()
Local x

    x := WgssSTU():UsbDevices() // Array de tablets conectadas

RETURN NIL

DLL FUNCTION WgssSTU() AS LONG PASCAL LIB "wgssSTU.DLL"

//DLL FUNCTION WgssSTU() AS LONG PASCAL FROM "WgssSTU" LIB "wgssSTU.dll"
*/
 

Re: tableta de captura de firma en formato digital

Posted: Tue Aug 22, 2017 7:21 pm
by cnavarro
Parece que la lib es para Visual Studio, compila con las libs de fw para visual studio
Seguramente tengas que desarrollar un wrapper de la lib para poder acceder a las funciones

Re: tableta de captura de firma en formato digital

Posted: Thu Sep 14, 2017 6:41 pm
by miarcod
Bueno, sigo con el tema,

Estoy probando los ejemplos que me pasaron en javascript y hay algo que no funciona.
A ver si alguien me puede echar una mano
Cuando ejecuto la pagina con internet explorer la imagen se carga correctamente en la tablet, pero cuando lo hago yo, la imagen no se carga bien aunque se carga algo y además se produce un error en metodo tablet:writeimage

¿Alguna idea?
Gracias

pagina javascript

Code: Select all

<html>
<head>
<title>SendToSTU</title>
<script type="text/javascript">

<!--
// ==========================================================================
//      Utilities
//

function print(txt) {
  var txtDisplay = document.getElementById("txtDisplay");
  txtDisplay.value += txt + "\n";
  txtDisplay.scrollTop = txtDisplay.scrollHeight; // scroll to end
}
function dec2hex(i) {
  return( "0x" + ((i<16)?"0":"") + i.toString(16).toUpperCase()); // add leading zero if < 16 e.g. 0x0F
}

function DisplayImage() {
        var filename = document.getElementById("imgFilename").value;
        document.getElementById("idImg").src = filename;
}

function SendToSTU() {
        DisplayImage();
    var filename = document.getElementById("imgFilename").value;
        print("SendToSTU: " + filename);
    sdkSendToSTU(filename);
}
function getCurrentDir() {
    var scriptFullName = window.location.pathname; // gets /c:/pathname/file.html
    scriptFullName = scriptFullName.replace(/\//g,"\\"); //convert all '/' to '\'
    var scriptPath = scriptFullName.substring( 1, scriptFullName.lastIndexOf("\\")+1 ); // c:\pathname\
    scriptPath = unescape(scriptPath); // change %20 back to space
    return( scriptPath );
}
function OnLoad() {
    document.getElementById("imgFilename").value = getCurrentDir() + "640x480.png"; // default to STU-500
        DisplayImage();
    print("Use the [Browse] button to select an image file. Sample images are included in this folder:");
    print( getCurrentDir() );
    print("To display the image on an STU press [Send Image to STU]");
}

// ==========================================================================
//      SDK Application code
//

                                    // enumerations copied from SDK\COM\doc with reformatted syntax
enumEncodingFlag = {                // encodingFlag reports what the STU device is capable of:
  EncodingFlag_Zlib : 0x01, 
  EncodingFlag_1bit : 0x02,         // mono
  EncodingFlag_16bit : 0x04,        // 16bit colour (520/530)
  EncodingFlag_24bit : 0x08         // 24bit colour (530)
}

enumEncodingMode = {                // selects image transformation
  EncodingMode_1bit : 0x00,         // mono display STU300/430/500
  EncodingMode_1bit_Zlib : 0x01,    // use zlib compression (not automated by the SDK – the application code has to compress the data)
  EncodingMode_16bit : 0x02,        // colour stu-520 & 530
  EncodingMode_24bit : 0x04,        // colour STU 530
                                    // tablet.supportsWrite() is true if the bulk driver is installed and available
  EncodingMode_1bit_Bulk : 0x10,    // use bulk driver (520/530) 
  EncodingMode_16bit_Bulk : 0x12, 
  EncodingMode_24bit_Bulk : 0x14, 

  EncodingMode_Raw : 0x00, 
  EncodingMode_Zlib : 0x01, 
  EncodingMode_Bulk : 0x10, 
  EncodingMode_16bit_565 : 0x02 
}

enumScale = {
  Scale_Stretch : 0, 
  Scale_Fit : 1, 
  Scale_Clip : 2 
}

var tablet;
var protocolHelper;
    
function sdkSendToSTU(filename) {
  if (connect())
  {
    try
    {
      var caps = tablet.getCapability();
      var info = tablet.getInformation();
      print("STU model: " + info.modelName);
      var pId = tablet.getProductId();
      print("Product id: "+ dec2hex(pId));
      var encodingFlag = protocolHelper.simulateEncodingFlag(pId, caps.encodingFlag);
      print("encodingFlag: " + dec2hex(encodingFlag));
      
      if ((encodingFlag & enumEncodingFlag.EncodingFlag_24bit) != 0)
      {
        encodingMode = tablet.supportsWrite() ? enumEncodingMode.EncodingMode_24bit_Bulk : enumEncodingMode.EncodingMode_24bit; 
      }
      else if ((encodingFlag & enumEncodingFlag.EncodingFlag_16bit) != 0)
      {
        encodingMode = tablet.supportsWrite() ? enumEncodingMode.EncodingMode_16bit_Bulk : enumEncodingMode.EncodingMode_16bit; 
      }
      else
      {
        // assumes 1bit is available
        encodingMode = enumEncodingMode.EncodingMode_1bit; 
      }
      print("encodingMode: " + dec2hex(encodingMode));

      var stuImage = protocolHelper.resizeAndFlatten(unescape(filename), 0, 0, 0, 0, caps.screenWidth, caps.screenHeight, encodingMode, enumScale.Scale_Fit, false, 0);
      tablet.writeImage(encodingMode, stuImage);      // uses the colour mode flags in encodingMode
      tablet.disconnect();
    }
    catch(e)
    {
      print("Exception: " + e.message);
    }
  }
}

function connect()
{
  var connected = false;
  try 
  {
    var usbDevices;
    usbDevices = new ActiveXObject("WacomGSS.STU.UsbDevices");

    var count = usbDevices.Count;

    if (count > 0)
    {
      var usbDevice = usbDevices.Item(0);     // use the first STU found in the list.

      if (tablet == null)
      {
        protocolHelper = new ActiveXObject("WacomGSS.STU.ProtocolHelper");
        tablet = new ActiveXObject("WacomGSS.STU.Tablet");
      }

      var r1 = tablet.usbConnect(usbDevice, false);
      var r = r1.value;

      if (r == 0)
      {
        connected = true;
      }
      else 
      {
        print("Connect failed");
      }
    } 
    else
    {
      print("No devices connected");
    }
    usbDevices = null;
  }
  catch (e) 
  {
    print("Exception: "+ e.message);
  }
  return connected;
}


-->
</script>
</head>
<body onload="OnLoad()">
        <h1>SendToSTU</h1>
<table>
     <tr>
          <td style="border:1px solid black;width:250pt;height:190pt;">
               <img id="idImg" style="width:250pt;"/>
          </td>
          <td>
          <input type="button" value="Send Image to STU" style="width:40mm;margin-left:5mm"  onClick="SendToSTU();"
                    title="Sends the image file to the STU display"/>
          </td>
     </tr>
</table>
  <p/>
  <input type="hidden" id="imgFilename" />
  <input type="file" id="browseFile" size=80 onchange="imgFilename.value=this.value;DisplayImage();" />
  <br/><br/>
  <textarea cols="125" rows="15" id="txtDisplay"></textarea>
</body>
</html>
 
y esto es lo que yo he generado en harbour

Code: Select all

#include "FiveWin.Ch"
#define NTRIM(n)    ( LTrim( Str( n ) ) )
//#define print(x)  msginfo(x)



#translate print( <v1>[, <v2>])      =>  ;
                   depura( <v1> [,  <v2> ] )


STATIC UsbDevices, usbDevice, tablet, protocolHelper, r, r1

//------------------------------------------------------------------------//
Function main()

   If MsgNoYes("Borrar")
      BorrarTablet()
   Else
      EnviarImagen()
   EndIf

   print("fin")
RETURN NIL

//------------------------------------------------------------------------//
Function Connect()
Local nCount    //, r1, r
//Local usbDevices, nCount
//Local usbDevice, tablet, protocolHelper, r1, r
Local Connected := .F.

     nCount := 0
     TRY
       usbDevices = createObject("WacomGSS.STU.UsbDevices")
       nCount := usbDevices:Count
     CATCH
        Msginfo("Falta el driver de conexion STU")
        RETURN Connected
     END

     If nCount ==0
        WindAviso("No se localizaron dispositivos STU")
        Return Connected
     EndIf


     with object usbDevices
          usbDevice := :Item(0)
     End

    protocolHelper = createObject("WacomGSS.STU.ProtocolHelper")
    tablet         = createObject("WacomGSS.STU.Tablet")
    r1             = tablet:usbConnect(usbDevice, 0)
    r              = r1:value
    If r = 0
       Connected = .t.
    Else
       WindAviso("No se pudo conectar")
    EndIf

Return Connected

//------------------------------------------------------------------------//
#define EncodingFlag_Zlib   0x01
#define EncodingFlag_1bit   0x02        // mono
#define EncodingFlag_16bit  0x04        // 16bit colour (520/530)
#define EncodingFlag_24bit  0x08        // 24bit colour (530)

/*
enumEncodingFlag = {                // encodingFlag reports what the STU device is capable of:
  EncodingFlag_Zlib : 0x01,
  EncodingFlag_1bit : 0x02,         // mono
  EncodingFlag_16bit : 0x04,        // 16bit colour (520/530)
  EncodingFlag_24bit : 0x08         // 24bit colour (530)
}
*/

#define EncodingMode_1bit   0x00    // mono display STU300/430/500
#define EncodingMode_1bit_Zlib  0x01    // use zlib compression (not automated by the SDK – the application code has to compress the data)
#define EncodingMode_16bit  0x02    // colour stu-520 & 530
#define EncodingMode_24bit  0x04    // colour STU 530
                                        // tablet.supportsWrite() is true if the bulk driver is installed and available
#define EncodingMode_1bit_Bulk  0x10    // use bulk driver (520/530)
#define EncodingMode_16bit_Bulk 0x12
#define EncodingMode_24bit_Bulk 0x14
#define EncodingMode_Raw    0x00
#define EncodingMode_Zlib   0x01
#define EncodingMode_Bulk   0x10
#define EncodingMode_16bit_565  0x02


/*
enumEncodingMode = {                // selects image transformation
  EncodingMode_1bit : 0x00,         // mono display STU300/430/500
  EncodingMode_1bit_Zlib : 0x01,    // use zlib compression (not automated by the SDK – the application code has to compress the data)
  EncodingMode_16bit : 0x02,        // colour stu-520 & 530
  EncodingMode_24bit : 0x04,        // colour STU 530
                                    // tablet.supportsWrite() is true if the bulk driver is installed and available
  EncodingMode_1bit_Bulk : 0x10,    // use bulk driver (520/530)
  EncodingMode_16bit_Bulk : 0x12,
  EncodingMode_24bit_Bulk : 0x14,

  EncodingMode_Raw : 0x00,
  EncodingMode_Zlib : 0x01,
  EncodingMode_Bulk : 0x10,
  EncodingMode_16bit_565 : 0x02
}
*/

#define Scale_Stretch   0
#define Scale_Fit   1
#define Scale_Clip  2

/*
enumScale = {
  Scale_Stretch : 0,
  Scale_Fit : 1,
  Scale_Clip : 2
}
*/

#define false   0

FUNCTION BorrarTablet()
If !Connect()
   RETURN NIL
EndIf
print("Tablet conectada")
tablet:setClearScreen()
tablet:disconnect()
print("tablet borrada")
return nil



FUNCTION unescape(xValue) ; RETURN xValue

FUNCTION EnviarImagen()
Memvar oErr
Local caps, info, pId, encodingFlag, encodingMode, stuImage, filename
BorrarTablet()

If !Connect()
   RETURN NIL
EndIf
print("Tablet conectada")

caps = tablet:getCapability()
info = tablet:getInformation()
print("STU model: " + info:modelName)
pId = tablet:getProductId()
print("Product id: "+ dec2hex(pId))

encodingFlag = protocolHelper:simulateEncodingFlag(pId, caps:encodingFlag)
print("encodingFlag: " + dec2hex(encodingFlag))

If nAnd(encodingFlag, EncodingFlag_24bit ) != 0
    encodingMode = iif(tablet:supportsWrite(), EncodingMode_24bit_Bulk, EncodingMode_24bit)
elseif nAnd(encodingFlag , EncodingFlag_16bit) != 0
    encodingMode = iif(tablet:supportsWrite(), EncodingMode_16bit_Bulk, EncodingMode_16bit)
else
    encodingMode = EncodingMode_1bit
EndIf


print(encodingflag)
print(EncodingFlag_24bit )
print(nAnd(EncodingFlag, EncodingFlag_Zlib ))
print(nAnd(EncodingFlag, EncodingFlag_1bit ))
print(nAnd(EncodingFlag, EncodingFlag_16bit))
print(nAnd(EncodingFlag, EncodingFlag_24bit ))
print(tablet:supportsWrite(), "suportswrite")
print("encodingMode: " + dec2hex(encodingMode))


filename := unescape("imagen.jpg")
stuImage = protocolHelper:resizeAndFlatten(filename, 0, 0, 0, 0, caps:screenWidth, caps:screenHeight, encodingMode, Scale_Fit, .f., 0)

print(filename, "filename")
print(caps:screenWidth, "screenwidth")
print(caps:screenHeight, "screenhigh")
print(encodingMode, "encondingmode")
print(Scale_Fit, "ScaleFit")


TRY
   tablet:writeImage(encodingMode, stuImage)      // uses the colour mode flags in encodingMode
CATCH oErr
   Msginfo("Error en la escritura de la tablet")
END


tablet:disconnect()

RETURN NIL

 

Re: tableta de captura de firma en formato digital

Posted: Fri Sep 15, 2017 10:07 am
by mastintin
¿ Que tipo de captura de firma necesitas ? .
Me refiero si simplemente es capturar una imagen de firma o se trata de que se "realmente segura" con todo lo que aporta wacom, de seguridad en trazos, certificado,fechado , etc
Yo me peleé con una de un amigo hace como un año.
Si lo que buscas requiere "seguridad" la opción facil es usar el programa de generacíon de pdf que trae la tableta, te permite personalizar ciertos parametros ( limitados) pero te genera "pdf seguros" con un monton de información sobre la firma. Si necnesitas personalizarlo mucho mas tienes que tirar del sdk que ademas creo que era de pago .
Para una cosa simple donde quieras recoger los trazos tienes un sdk mas simple con ejemplos en varios idiomas de programación. Yo lo intente intentando crear un wrapper a harbour pero no funcionaba como debería.
La solución final para mi ( que solo pretendía capturar la firma ) fue coger el ejemplo que tienes en Delphi y modificarlo un poco para poner el logo de fondo de pantalla y los tesxto que quería mostar y que generase una imagen de la firma .
Es un exe delphi con unos pocos parametros en un fichero ini. Se llama desde el programa fwh.exe , se espera a que genere el archivo imagen de la firma y se cierra el programa y se devuelve el control al exe fwh para que genere el pdf con la firma ...

Re: tableta de captura de firma en formato digital

Posted: Fri Sep 15, 2017 12:29 pm
by miarcod
Gracias por responder,

De momento estoy haciendo pruebas,

El caso es que estoy jugando un poco con la tableta para ver que se puede hacer y como es la primera vez que trabajo con objetos COM estoy un poco perdido,

Lo que me sorprende es que cuando ejecuto la pagina html, el codigo javascript hace el trabajo correctamente, (enviar una imagen que aparece en la tablet) pero cuando lo hago con harbour se envia la imagen (pero no sale correctamente) y se genera un error.

Creo que debe se por el tipo de algun dato (int, long...) que le paso a la funcion pero no se como comprobar.

caps = tablet:getCapability()

la variable caps que se carga con el metodo getCapability() devuelve un objeto con varios valores pero de distintos tipos segun la documentacion
UNIT16 y UNIT8

Creo que el problema está en el metodo protocolHelper.resizeAndFlatten


en javascript es

var stuImage = protocolHelper.resizeAndFlatten(unescape(filename), 0, 0, 0, 0, caps.screenWidth, caps.screenHeight, encodingMode, enumScale.Scale_Fit, false, 0)

En harbour lo he traducido y los valores que envio a la funcion son los mismos pero el resultado es que aparece en la tablet una imagen que es como si se viera la imagen ampliada y a continuación se genera un error.

Code: Select all

filename := "imagen.jpg"
stuImage = protocolHelper:resizeAndFlatten(filename, 0, 0, 0, 0, caps:screenWidth, caps:screenHeight, encodingMode, Scale_Fit, .f., 0)

TRY
   tablet:writeImage(encodingMode, stuImage)      // uses the colour mode flags in encodingMode
CATCH oErr
   Msginfo("Error en la escritura de la tablet")
END
Un saludo

Re: tableta de captura de firma en formato digital

Posted: Thu Nov 16, 2017 11:35 am
by AngelSalom
Hola amigos, ¿algún avance al respecto? Me toca pelearme también con una wacom.
Saludos!

Re: tableta de captura de firma en formato digital

Posted: Tue Nov 21, 2017 9:52 am
by AngelSalom
mastintin wrote:¿ Que tipo de captura de firma necesitas ? .
Me refiero si simplemente es capturar una imagen de firma o se trata de que se "realmente segura" con todo lo que aporta wacom, de seguridad en trazos, certificado,fechado , etc
Yo me peleé con una de un amigo hace como un año.
Si lo que buscas requiere "seguridad" la opción facil es usar el programa de generacíon de pdf que trae la tableta, te permite personalizar ciertos parametros ( limitados) pero te genera "pdf seguros" con un monton de información sobre la firma. Si necnesitas personalizarlo mucho mas tienes que tirar del sdk que ademas creo que era de pago .
Para una cosa simple donde quieras recoger los trazos tienes un sdk mas simple con ejemplos en varios idiomas de programación. Yo lo intente intentando crear un wrapper a harbour pero no funcionaba como debería.
La solución final para mi ( que solo pretendía capturar la firma ) fue coger el ejemplo que tienes en Delphi y modificarlo un poco para poner el logo de fondo de pantalla y los tesxto que quería mostar y que generase una imagen de la firma .
Es un exe delphi con unos pocos parametros en un fichero ini. Se llama desde el programa fwh.exe , se espera a que genere el archivo imagen de la firma y se cierra el programa y se devuelve el control al exe fwh para que genere el pdf con la firma ...
Hola mastintin , ¿sería posible que me pasaras el fuente Delphi modificado? Me basta con recoger la firma sin más florituras.

Re: tableta de captura de firma en formato digital

Posted: Tue Nov 21, 2017 2:10 pm
by mastintin
AngelSalom wrote: Hola mastintin , ¿sería posible que me pasaras el fuente Delphi modificado? Me basta con recoger la firma sin más florituras.
Lo busco y te envío lo que tengo .Facilitame un mail ...