Testimonios


I found your product from a posting in the Code Gear news groups -- there were several listed, but this one posting indicated that the programmer was very happy with your product. Those kind of recommendations I take seriously. Also, the price was reasonable for the functionality.

It was very easy to learn and I had an interface developed with a Fujitsu 6130 ADF scanner in just a few hours. Great product!

Michael Philbrick
Integraprise, Inc.


VintaSoftTwain ActiveX Control - Preguntas más frecuentes

Cuestiones generales:

 

Redistribución:

 

Ventas:

 

Despliegue:

 

Web despliegue:

 

Programación:

 

Bases de datos:

 

 

¿Para qué fines puedo utilizar VintaSoftTwain ActiveX control?

Puede utilizar el componente ActiveX para dirigir el trabajo del escaneo, de la cámara digital y web y otros dispositivos que soportan el estandard TWAIN.

 


 

¿En qué lenguaje de programación puedo utilizar el componente ActiveX?

La licencia del desarrollador y la licencia de la compañía permiten utilizar este componente:

  • MS Visual Studio 6.0 (VB, VC++, VFoxpro)
  • Borland Delphi, Borland C++ Builder
  • MS .NET Studio (VB.NET, C#.NET, C++.NET)
  • MS Office (Excel, Word, Access)
  • en todos lenguajes de programación y aplicación que soportan el funcionamiento сon ActiveX componente.

La licencia del servidor permite utilizar este componente en:

  • Internet Explorer 5.0 o superior : ASP.NET, PHP, JavaScript, VBScript, etc
  • Mozilla Firefox 3.0 o superior con IE Tab Plug-in : ASP.NET, PHP, JavaScript, VBScript, etc
  • todos lenguajes de programación basados en HTML.

 

 

¿Qué límites tiene la versión no registrada del componente?

Los límites de la versión no registrada:

  • nagware
  • cada imagen se puede guardar al disco o cargar como fichero BMP
  • solo la imagen en negro u blanco o en gris puede ser guardado al disco o cargado al servidor como fichero JPEG o TIFF

Todos estos límites están borrados de la versión registrada del componente.

 

 

No he encontrado la respuesta a mi pregunta. ¿Qué debo hacer?

Puede encontrar la información sobre la mayoria de las preguntas en la documentación o en este FAQ. Si no ha encontrado la respuesta a su pregunta, escriba al Servicio de Apoyo Técnico.

 


 

¿Puedo distribuir este ActiveX con mi aplicación sin costo alguno?

Si, puede distribuir este ActiveX componente con su aplicación. Paga solamente por el registro inicial. La licencia de la compañía no tiene límites en la distribución. La licencia del desarrollador tiene ciertos límites en la distribución. La redistribución del licencia para servidor no es libre de derechos. Por favor, vea el contrato de licencia.

 


 

¿Qué ficheros debo incluir en distribución de mi programa?

Tiene que incluir solo un fichero: vstwain.dll.
A la instalación de su programa registre el componente ActiveX por medio del programa regsvr32.exe (regsvr32.exe vstwain.dll).

 


 

¿Qué hacer si la redistribución de mi aplicación que está creado sobre la base de la licencia del desarrollador puede ser superior 100 copias en el año en curso?

Si posee la licencia del desarrollador y redistribución de su aplicación puede ser superior 100 copias en el año en curso, Ud. debe contactar Ventas "VintaSoft". Ud. proveerá de oportunidad actualizar su licencia del desarrollador a la licencia de la compañía con 30% descuento o comprar la segunda licencia del desarrollador.

 

 

He creado el programa en Visual Studio .NET. ¿Qué pasos debo hacer para la instalación correcta de mi programa al ordenador de mi cliente?

Antes de distribuir su programa:

  • Borre de su proyecto la referencia a los ficheros AxVSTWAINLib y VSTWAINLib, y añadales de nuevo – los ficheros Ax VSTWAINLib y VSTWAINLib deben ser instalados en el directorio junto con su programa.
  • Asegúrese que la opcíon “Copy Local" para las referencias a los ficheros AxVSTWAINLib.dll y VSTWAINLib.dll tiene el parámetro "False".
  • Después de la compilación de su programa añada tres ficheros al distribuidor de su programa: vstwain.dll, AxInterop.VSTWAINLib.dll, Interop.VSTWAINLib.dll (dos ultimos ficheros serán generados por Visual Studio).

Durante de la distribución de su programa:

 

 

Se produce un error cuando intento registrar el ActiveX en Windows98. ¿Qué debo hacer?

Este problema está relacionada con la falta de las bibliotecas necesarias en el sistema. Para el trabajo de ActiveX son necesarias las bibliotecas siguientes:

  • KERNEL32.DLL
  • ATL.DLL
  • GDI32.DLL
  • OLE32.DLL
  • OLEAUT32.DLL
  • SHELL32.DLL
  • USER32.DLL
  • WS2_32.DLL

Por favor instale el paquete "Visual C++ run time files" al ordenador – esto debe resolver el problema. Este paquete de instalación puede descargarse desde este enlace: http://download.microsoft.com/download/vc60pro/update/1/w9xnt4/en-us/vc6redistsetup_enu.exe

 

 

He creado el programa en Delphi. El programa funciona correctamente si inicialisarlo con el derecho del administrador, pero si inicializarlo con el derecho de visitante, aparece el aviso siguiente "Exception EOleSysError in module...". ¿Cómo puedo resolver este problema?

Primeramente hay que registrar ActiveX en el sistema por medio del programa register32.exe – hay que hacerlo con el derecho de administrador.

Pues es necesario utilizar el código siguiente en su programa:

program Simple;

uses
  Forms,
  Windows, Registry, Dialogs,  ActiveX,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

function IsVSTwainRegistered : Boolean;
var Reg:TRegistry;
begin
 Reg:=TRegistry.Create;
 try
  Reg.RootKey:=HKEY_CLASSES_ROOT;
  Result:=Reg.OpenKey('CLSID\{1169E0CD-9E76-11D7-B1D8-FB63945DE96D}',False);
  if Result then Reg.CloseKey;
 finally
  Reg.Free;
 end;
end;

begin
  if not IsVSTwainRegistered() then
    begin
      ShowMessage('VintaSoftTwain ActiveX is not registered!');
      Exit;
    end;
    
  OleInitialize(nil);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  OleUninitialize;
end.

Este código permite comprobar que el programa sea registrado en el sistema y permita dirigir su programa con derechos de invitado.

 

 

¿Qué diferencias son entre la licencia del desarrollador y la licencia de la compañía (sitio)?

  • La licencia del desarrollador debe ser utilizado en desarrollo de software por sólo un desarrollador, que nombre es indicado en los datos de licencia.
  • La licencia de la compañía debe ser utilizado en desarrollo de software por cualquier desarrollador de la compañía, que nombre es indicado en los datos de licencia.
  • La licencia del desarrollador puede ser utilizado en desarrollo de software en cualquier computador ubicado en cualquier dirección física.
  • La licencia de la compañía puede ser utilizado en desarrollo de software en cualquier computador ubicado en una sola dirección física (en sólo una oficina).
  • La licencia del desarrollador permite la redistribución de aplicación que integra los ensamblados SDK redistribuibles no más de 100 copias en el año.
  • La licencia de la compañía permite la redistribución de aplicación ilimitada, que integra los ensamblados SDK redistribuibles.

 

 

¿Cómo puedo añadir el objeto VintaSoftTwain a la forma en el proyecto VB.NET?

Para añadir el objeto VintaSoftTwain al forma de la aplicación hay que hacer lo siguente:
  • Abrir Visual Studio.NET y pues abrir la aplicación
  • Abrir en el diseñador de formas el forma de la aplicación, donde hay que insertar el objeto VintaSoftTwain
  • Abrir el panel "Toolbox"
  • Apretar el botón derecho del ratón al panel "Toolbox"
  • Elegir el punto "Add/Remove Items..." del menú aparecido
  • Abrir el señal "COM Components"
  • Apretar el botón "Browse..." y elegir el fichero vstwain.dll
  • Encontrar y destacar la clase VintaSoftTwain en la lista
  • Cerrar la ventana apretando el botón "Ok"
  • Encontrar y elegir el objeto VintaSoftTwain al panel "Toolbox"
  • Transferir con ayuda del raton el objeto uno a la forma del anexo

 

 

Quiero utilizar ActiveX en Delphi 2005, pero el diseñador de formas no permite añadir ActiveX componentes a la forma de la aplicación. Ocurre el error siguiente "Failed to add a reference to the ActiveX type library. Ensure that it is properly registered. ...". ¿Cómo puedo resolver este problema?

Borland Delphi 8.0 (2005) y Borland C# el Constructor 1.0 tienen error y ellos aceptan ActiveX control solo si US local es usado. Otros locales son ignorados.

Es la lista de los pasos que hay que hacer para resolver este problema:

  • Desinstalar ActiveX del panel de componentes (Tools Palette)
  • Cambiar la variante de la lengua instalada al ordenador a "US Locale"
  • Recargar el ordenador
  • Añadir de nuevo ActiveX al panel de componentes – todo debe ser en orden.

 

 

¿Cómo puedo instalar dinámicamente el objeto VintaSoftTwain en mi proyecto a VB?

Hay que hacer lo siguiente:
  • Abrir el punto del menu "Project -> References".
  • En la ventana abierta añadir la referencia al objeto "VintaSoftTwain ActiveX Control".
  • Pues hay que añadir el código siguiente al proyecto:
  Option Explicit
  Dim WithEvents VSTwain1 As VSTWAINLib.VintaSoftTwain

  Private Sub StartScan_Click()
     Set VSTwain1 = New VSTWAINLib.VintaSoftTwain
     With VSTwain1
        .StartDevice
        If .SelectSource = 1 Then
            .ShowUI = True
            .Acquire
        End If
     End With
  End Sub

  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
     If Flag <> 0 Then
        If VSTwain1.ErrorCode <> 0 Then
            MsgBox VSTwain1.ErrorString
        End If
     Else
        Set Image1.Picture = VSTwain1.GetCurrentImage
        VSTwain1.TiffCompression = 10
        VSTwain1.SaveImage 0, "c:\test.tif"
     End If
  End Sub

 

 

Trato de utilizar ActiveX en el medio Windows 2003 Server, pero se produce el error "Error at loading the TWAIN_32.DLL". ¿Cómo puedo resolver este problema?

La versión Windows 2003 Server que está utilizando tiene el error en la configuracíon: la función GetWindowsDirectory hace volver la via no correcta al directorio Windows, y notamente "C:\Documents and Settings\User\Windows\" en lugar de "C:\Windows\".
Este artículo le ayuda a resolver este problema: http://support.microsoft.com/kb/832048.

 


 

No puedo añadir el VintaSoftTwain ActiveX a un formulario de mi aplicación VS.NET 2005. ¿Cómo puedo resolver este problema?

Debe añadir a su proyecto la referencia a la biblioteca "stdole" antes de añadir el objeto VintaSoftTwain ActiveX a la forma del aplicación. Esto es la lista de los pasos necesarios:

  • Ponga el cursor del ratón al punto "References" y clic el botón derecho del ratón
  • Elija el punto "Add reference" del menú aparecido
  • Abra el señal "COM"
  • Encuentre y elija la clase "OLE Automation" de la lista
  • Cierre la ventana apretando el botón "Ok"

Después de estos pasos puede añadir el objeto VintaSoftTwain ActiveX al formulario de la aplicación sin algun problema.

 

 

Cuando trato de arrastrar el control de activeX desde el cuadro de herramientas en la forma en MS Visual Studio 2005, el siguiente error: "Mensaje de error: No se ha podido importar el control ActiveX". ¿Existe una manera de resolver esto?

  • Arrastre VintaSoftTWAIN ActiveX Control desde el cuadro de herramientas en la form. Este error se producirá: "No se ha podido importar el control ActiveX. Por favor, asegúrese de que está debidamente registrado".
  • Reconstruir el proyecto, seleccione "Build > Rebuild Solution".
  • Arrastre VintaSoftTWAIN control ActiveX desde el cuadro de herramientas en la form por segunda vez. El conocido error de nuevo.
  • Reconstruir el proyecto por segunda vez, seleccione "Build > Rebuild Solution".
  • Arrastre VintaSoftTWAIN ActiveX Control desde el cuadro de herramientas en la forma por tercera vez y el control ActiveX se importado con éxito.

 

 

¿Cómo puedo firmar la copia del componente para utilizarla en mi página web?

VintaSoftTwain ActiveX está firmado por el certificado digital de Thawte.
Por favor, escribanos si quiere firmar VintaSoftTwain ActiveX con su propio certificado.

 


 

¿Qué debo hacer para añadir ActiveX a mi WEB proyecto?

Necesita hacer lo siguiente:

  1. Añada el fichero vstwain.dll al server.
  2. Corrige en HTML código las líneas siguentes.
  // In example:
  <OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1
          CLASSID="CLSID:1169E0CD-9E76-11D7-B1D8-FB63945DE96D"
          CODEBASE="">
  </OBJECT>

  // In your code:
  <OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1
          CLASSID="CLSID:1169E0CD-9E76-11D7-B1D8-FB63945DE96D"
          CODEBASE="http://www.your-server.com/activex/VSTwain.cab#version=5,1,0,1">
  </OBJECT>

Después todas estas operaciones no se debe instalar el componente ActiveX en todos los ordenadores de su organización. Cuando el usuario abre la página, recibirá con el componente la demanda al instalación del componente al ordenador. En caso de la respuesta positiva, el componente será instalado al ordenador automáticamente y tendrá la posibilidad de trabajar con su página web.

El archivo VSTwain.cab puede ser encontrado en directorio "Bin" de paquete distributivo.

 

 

¿Cómo puedo cargar la imagen del escaneo al servidor web?

El protocolo HTTP no permite guardar las imágenes al servidor web (HTTP) directamente. Para resolver este problema se puede utilizar el web-script que debe ser insertado al servidor. Puede encontrar muchos scriptes en el internet o utilizar uno de los siguientes: ASP script, Perl script.

Para cargar las imágenes al servidor por medio de script se debe saber que espacios contiene el script.

ASP script contiene los espacios siguientes:

  • El espacio del texto "Demo"
  • El espacio para el fichero "txtFile"
  • El botón "cmdSubmit"

Para cargar las imágenes por medio de este script se debe utilizar el código siguiente:

  if VSTwain1.SetHttpServerParams("http://www.your-server.com/clsUploadTest.asp",
                 "http://www.your-server.com/clsUploadTest.asp", 4) = 0 then
    MsgBox VSTwain1.ErrorString
  else
    VSTwain1.SetHttpFormField "Demo", "Demo string"
    VSTwain1.SetHttpFormField "cmdSubmit", "SUBMIT"
    if VSTwain1.SaveImageToHttp(0, "txtFile", "demo.jpg") = 0 then
        MsgBox VSTwain1.ErrorString
    else
        Timer.Interval = 10
    end if
  end if

Perl script contiene los espacios siguientes:

  • El espacio del texto "login"
  • El espacio del texto "pass"
  • El espacio para el fichero "file"

Para cargar las imágenes por medio de este script se debe utilizar el código siguiente:

  if VSTwain1.SetHttpServerParams("http://www.your-server.com/cgimages/upload.cgi",
                 "http://www.your-server.com/upload.html", 4) = 0 then
    MsgBox VSTwain1.ErrorString
  else
    VSTwain1.SetHttpFormField "login", "guest"
    VSTwain1.SetHttpFormField "pass", "guest"
    if VSTwain1.SaveImageToHttp(0, "file", "demo.jpg") = 0 then
        MsgBox VSTwain1.ErrorString
    else
        Timer.Interval = 10
    end if
  end if

Por favor, vea nuestros ejemplos.

 

 

Trato de elegir el dispositivo por medio de la opción sourceIndex en Internet Explorer, pero ocurre el error. ¿Por que?

Cada objeto a la página web en Internet Explorer tiene la opción sourceIndex – esta opción es accesible solamente para la lectura. Debe utilizar el código siguente para trabajar con la opción sourceIndex del objeto VSTwain en JavaScript o VBScript:
  VSTwain1.StartDevice()
  VSTwain1.object.SourceIndex = 1     ' second device
  VSTwain1.Acquire()

 

 

¿Puedo utilizar ActiveX en Mozilla Firefox?

Sí, puede utilizar ActiveX en Mozilla Firefox 3.0 y superiores con permitido IE Tab Plug-in.

 


 

¿Cómo puedo recibir las imágenes en negro y blanco (documentación)?

Esto es el ejemplo del código para recibir las imágenes en negro y blanco:
  Private Sub StartScan()
      VSTwain1.StartDevice()
      If VSTwain1.SelectSource() = 1 Then
          VSTwain1.OpenDataSource()
          VSTwain1.PixelType = 0     ' 0 - BW images, 
                                     ' 1 - gray images , 
                                     ' 2 - RGB images
          VSTwain1.Acquire()
      End If
  End Sub

 

 

El lenguaje de programación que utilizo no soporta el trabajo con las arrays. ¿Cómo puedo resolver este problema?

Si necesita recibir la matriz de valores de GetPageSizes, GetPixelTypes, GetResolutions, GetUnitsOfMeasure, pero el lenguaje de programación que utiliza no soporta el trabajo con las matrices, puede utilizar el método siguiente:
  ' This example shows how to get supported pixel types
  VSTwain1.StartDevice()
  VSTwain1.OpenDataSource()
  bSupportBW = 0
  VSTwain1.PixelType = 0                ' black-white (1 bit per pixel)
  if VSTwain1.ErrorCode = 0 then        ' black-white images are supported 
                                        ' by device
    bSupportBW = 1
  end if
  bSupportGray = 0
  VSTwain1.PixelType = 1                ' gray (8 bit per pixel)
  if VSTwain1.ErrorCode = 0 then        ' gray images are supported 
                                        ' by device
    bSupportGray = 1
  end if
  bSupportRGB = 0
  VSTwain1.PixelType = 2                ' RGB (24 bit per pixel)
  if VSTwain1.ErrorCode = 0 then        ' RGB images are supported 
                                        ' by device
    bSupportRGB = 1
  end if
  ...................

 

 

¿Puedo dirigir el Alimentador automático de documentos (ADF) sin interface usuario?

Este ejemplo que muestra como dirigir el trabajo del escaneo con el Alimentador automático de documentos (ADF) sin interface usuario:
  Private Sub StartScan()
      VSTwain1.StartDevice()
      If VSTwain1.SelectSource() = 1 Then             ' user selected the 
                                                      ' device
          VSTwain1.ShowUI = False                     ' disable UI
          VSTwain1.DisableAfterAcquire = True
          VSTwain1.MaxImages = 1
          VSTwain1.AutoCleanBuffer = True
          VSTwain1.TiffMultiPage = True               ' multi page TIFF file
          VSTwain1.TiffCompression = 10               ' auto detect best 
                                                      ' compression algorithm
          If VSTwain1.OpenDataSource() = 1 Then
              VSTwain1.UnitOfMeasure = 0              ' inches
              VSTwain1.PixelType = 0                  ' BW image
              VSTwain1.Resolution = 200               ' 200 dpi
              If VSTwain1.FeederPresent = 1 Then
                  VSTwain1.FeederEnabled = True
                  If VSTwain1.Duplex <> 0 Then
                      VSTwain1.DuplexEnabled = True   ' enable duplex
                  End If
                  If VSTwain1.FeederLoaded = 1 Then
                      VSTwain1.XferCount = -1
                      VSTwain1.AutoFeed = True
                      VSTwain1.Acquire()
                  End If
              End If
          End If
      End If
  End Sub

  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
      If Flag <> 0 Then
          If VSTwain1.ErrorCode <> 0 Then
              MsgBox VSTwain1.ErrorString
          Else
              MsgBox "Scan completed."
          End If
      Else
          If VSTwain1.SaveImage(VSTwain1.NumImages-1,"c:\test.tiff") = 0 Then
            MsgBox VSTwain1.ErrorString
          End If
      End If
  End Sub

 

 

¿Puedo crear la aplicación de consola por medio de este componente ActiveX?

No es posible crear la aplicación de consola por medio de este componente ActiveX. La aplicación debe tener propia ventana para el trabajo con el ordenador.

 


 

¿Puedo elegir el dispositivo necesario sin diálogo estandartizado de la eleccíon del dispositivo?

Si. Para la numeración de dispositivos se puede utilizar el código siguiente:
  VSTwain1.StartDevice
  For i = 0 To VSTwain1.SourcesCount - 1
     MsgBox VSTwain1.GetSourceProductName(i)
  Next
Esto es el código para la elección del primer dispositivo:
  VSTwain1.StartDevice
  VSTwain1.SourceIndex = 0
  .....
  VSTwain1.Acquire
Pero la mejor variante es la siguiente:
  VSTwain1.StartDevice
  For i = 0 To VSTwain1.SourcesCount - 1
     If VSTwain1.GetSourceProductName(i) = "Your device name" Then
       VSTwain1.SourceIndex = i
       Exit For
    End If
  Next
  .....
En este caso es necesario saber el nombre correcto del dispositivo.

 

 

¿Cómo puedo desconectar la ventana del indicador del proceso del escaneo al recibo de los imagenes sin interface del usuario?

El estandard TWAIN permite desconectar la ventana del indicador del proceso del escaneo, si ShowUI=False. Se puede hacer de la manera siguente:
  VSTwain1.StartDevice
  VSTwain1.ShowUI = False
  VSTwain1.DisableAfterAcquire = True
  VSTwain1.MaxImages = 1
  VSTwain1.OpenDataSource
  VSTwain1.ShowIndicators = 0     ' disable indicator window
  VSTwain1.Acquire

 

 

Tengo que escanear solamente una parte de la imagen. ¿Qué debo hacer?

Utilice el código siguiente para recibir una parte de la imagen delineada por el rectángulo (0.2,0.2) - (8.3,10.8):
  VSTwain1.StartDevice()
  VSTwain1.ShowUI = False
  VSTwain1.OpenDataSource()
  .............
  VSTwain1.UnitOfMeasure = 0                 ' inches
  VSTwain1.SetImageLayout(0.2,0.2,8.3,10.8)
  VSTwain1.Acquire()

 

 

¿Cómo puedo instalar la resolución diferente para los ejes X y Y durante el escaneo de imágenes?

Esto es el ejemplo donde la resolución para el eje X es 4800 dpi, y para el eje Y 9600 dpi:
  VSTwain1.StartDevice
  VSTwain1.ShowUI = False
  VSTwain1.DisableAfterAcquire = True
  VSTwain1.MaxImages = 1
  VSTwain1.OpenDataSource
  VSTwain1.UnitOfMeasure = 0     ' inches
  VSTwain1.Capability = 4376     ' ICAP_XRESOLUTION (0x1118)
  VSTwain1.CapType = 1           ' one value
  VSTwain1.CapValue = 4800       ' 4800 dpi
  VSTwain1.SetCap
  VSTwain1.Capability = 4377     ' ICAP_YRESOLUTION (0x1119)
  VSTwain1.CapType = 1           ' one value
  VSTwain1.CapValue = 9600       ' 9600 dpi
  VSTwain1.SetCap
  VSTwain1.Acquire

 

 

¿Cómo puedo elegir la orientación de la imagen al escaneo?

Puede elegir la orientación de la imagen al escaneo solamente si el escaner soporta esta opción:
  .....
  VSTwain1.OpenDataSource
  VSTwain1.capability = 4368     ' ICAP_ORIENTATION (0x1110)
  If VSTwain1.IsCapSupported Then
    VSTwain1.capType = 1         ' one value
    VSTwain1.capValue = 3        ' Landscape
    VSTwain1.SetCap
  End If
  .....

Los parametros posibles para la orientación:

  • 0   La orientación de retrato, la rotación a 0 grados
  • 1   La rotación a 90 grados
  • 2   La rotación a 180 grados
  • 3   La orientación de paisaje la rotación a 270 grados

 

 

Nuestra organización utilice el escaneo de la red con el Alimentador automático de documentos (ADF) y procesamos mucha documentación cada dia. ¿Cómo podemos automatizar nuestro trabajo? Quisieramos guardar cada documento en el fichero separado.

Puede utilizar la página en blanco para dividir los documentos y difinir las páginas en blanco con ayuda del método IsBlankPage. Por ejemplo:
  Dim documentsCounter as Integer

  ............
  documentsCounter = 0
  ............

  Private Sub StartScan()
      VSTwain1.StartDevice()
      If VSTwain1.SelectSource() = 1 Then         ' select the device
          VSTwain1.ShowUI = False                 ' disable UI
          VSTwain1.DisableAfterAcquire = True
          VSTwain1.MaxImages = 1
          VSTwain1.AutoCleanBuffer = True
          VSTwain1.TiffMultiPage = True           ' multi page TIFF file
          VSTwain1.TiffCompression = 10           ' auto detect best 
                                                  ' compression algorithm
          If VSTwain1.OpenDataSource() = 1 Then
              VSTwain1.UnitOfMeasure = 0          ' inches
              VSTwain1.PixelType = 0              ' black-white image
              VSTwain1.Resolution = 200           ' 200 dpi
              If VSTwain1.Duplex <> 0 Then
                  VSTwain1.DuplexEnabled = True   ' enable duplex
              End If
              If VSTwain1.FeederPresent = 1 Then
                  VSTwain1.XferCount = -1
                  VSTwain1.FeederEnabled = True
                  VSTwain1.AutoFeed = True
                  If VSTwain1.FeederLoaded = 1 Then
                      VSTwain1.Acquire()
                  End If
              End If
          End If
      End If
  End Sub

  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
      If Flag <> 0 Then
          If VSTwain1.ErrorCode <> 0 Then
              MsgBox VSTwain1.ErrorString
          Else
              VSTwain1.StopDevice()
              MsgBox "Scan completed."
          End If
      Else
          Dim currNoiseLevel As Single
          If VSTwain1.IsBlankImage(0, 0.01, currNoiseLevel) = 1 Then
            documentsCounter = documentsCounter + 1
          End If
          If VStwain1.SaveImage(0,"c:\documents\doc"+Str(documentsCounter)+".tiff") = 0 Then
            MsgBox VSTwain1.ErrorString
          End If
      End If
  End Sub

 

 

¿Puedo utilizar el código patch para dividir los trabajos de serie? Y ¿Cómo puedo determinar el final del trabajo de serie?

Puede dividir los trabajos de serie, utilize la opción CAP_JOBCONTROL.

Esto es el ejemplo para Visual Basic .NET:

  Dim jobsCounter As Integer
  
  Private Sub Form_Load()
    jobsCounter = -1
  End Sub
  
  Private Sub Scan_Click()
    VSTwain1.StartDevice
    VSTwain1.MaxImages = 1
    VSTwain1.ShowUI = 0
    VSTwain1.DisableAfterAcquire = 1
    VSTwain1.TiffMultiPage = 1
    VSTwain1.OpenDataSource
    ' 1 - Detect and include job separator and continue scanning.
    ' 3 - Detect and exclude job separator and continue scanning.
    VSTwain1.JobControl = 1
    jobsCounter = jobsCounter + 1
    VSTwain1.Acquire
  End Sub
  
  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
    If Flag <> 0 Then
      If VSTwain1.ErrorCode <> 0 Then
        MsgBox (VSTwain1.ErrorString)
      End If
    Else
      If VSTwain1.EndOfJob = 1 Then
        jobsCounter = jobsCounter + 1
      Else
        VSTwain1.SaveImage 0, "c:\job"+Str(jobsCounter)+".tif"
      End If
    End If
  End Sub
  .....

 

 

Debo saber, cuando la imagen será adquirida en el programa, pero no puedo utilizar el evento PostScan. ¿Cómo puedo resolver este problema?

Comenzando con la versión 3.0 puede utilizar el método AcquireModal para resolver este problema.

Esto es el ejemplo para Visual Basic:

  VSTwain1.AppProductName = "MyTwainApplication"
  If VSTwain1.StartDevice() Then
      VSTwain1.SelectSource
      VSTwain1.ShowUI = True
      While VSTwain1.AcquireModal() = 1
          Set Image1.Picture = VSTwain1.GetCurrentImage()
          If VSTwain1.SaveImage(0, "c:\test.tiff") = 0 Then
              MsgBox (VSTwain1.ErrorString)
          End If
      Wend
  Else
      MsgBox VSTwain1.ErrorString
  End If

 

 

¿Puedo recibir la imagen con la profundidad del color a 48 bit al pixel?

Si. La biblioteca VintaSoftTwain. NET permite recibir las imágenes de color de 48-bit o las imágenes grises de 16-bits.

Aquí está un ejemplo que demuestra como recibir la imagen de color de 48-bpp del escaner sin la interface de usuario:
  VSTwain1.OpenDataSource()
  VSTwain1.PixelType = 2       ' RGB
  VSTwain1.Capability = 4395   ' IBitDepth
  VSTwain1.CapType = 1         ' One value
  VSTwain1.CapValue = 16       ' 16 bits per color component
  VSTwain1.SetCap()
  VSTwain1.Acquire()
Aquí está un ejemplo que demuestra como recibir la imagen de color de 24-bpp del escaner sin la interface de usuario:
  VSTwain1.OpenDataSource()
  VSTwain1.PixelType = 2       ' RGB
  VSTwain1.Capability = 4395   ' IBitDepth
  VSTwain1.CapType = 1         ' One value
  VSTwain1.CapValue = 8        ' 8 bits per color component
  VSTwain1.SetCap()
  VSTwain1.Acquire()
Aquí está un ejemplo que demuestra como recibir la imagen gris de 16-bpp del escaner sin la interface de usuario:
  VSTwain1.OpenDataSource()
  VSTwain1.PixelType = 1       ' Gray
  VSTwain1.Capability = 4395   ' IBitDepth
  VSTwain1.CapType = 1         ' One value
  VSTwain1.CapValue = 16       ' 16 bits per color component
  VSTwain1.SetCap()
  VSTwain1.Acquire()

 

 

Cuando utilizo el escaner HP ScanJet se pierde una media pulgada en la parte superior de la imagen y se añade el rectángulo negro en dimensión de una media pulgada en la parte inferior de la imagen. ¿Por qué?

Para resolver este problema tiene que cambiar el parámetro del atributo PageSize de A4 a USLETTER.

 


 

¿Puedo recibir unas imágenes del escáner, guardarlas en forma del file TIFF multipágina en el disco y después cargarlas al servidor HTTP?

Sí, aquí está el ejemplo que muestra como cargar el file del disco al servidor web a través de la forma web con 3 parámetros: "user name", "user password" y "file name".

  If VSTwain1.SetHttpServerParams("http://www.server.com/cgi/upload.cgi",
                                  "http://www.server.com/upload.html", 4) = 0 Then
    MsgBox VSTwain1.ErrorString
  Else
    VSTwain1.SetHttpFormField "user", "guest"
    VSTwain1.SetHttpFormField "pass", "guest"
    VSTwain1.SetHttpFileFromDisk("c:\temp\multipage.tif")
    If VSTwain1.SaveImageToHttp(0, "file", "multipage.tif") = 0 Then
      MsgBox VSTwain1.ErrorString
    Else
      Timer.Interval = 10
    End If
  End If

 


 

¿Puedo guardar las imágenes adquiridas en espacio OLE da la tabla MS Access?

Si. Puede hacerlo. Debe utilizar el método GetImageAsDIB.

Esto es el ejemplo para MS Access ("OrderImage" ea el espacio OLE da la tabla):

Option Compare Database
Option Explicit

Private Sub Form_AfterUpdate()
    On Error GoTo error1
    Image1.PictureData = Me![OrderImage]
    Exit Sub
error1:
    Image1.Picture = ""
End Sub

Private Sub Form_Current()
    On Error GoTo error1
    Image1.PictureData = Me![OrderImage]
    Exit Sub
error1:
    Image1.Picture = ""
End Sub

Private Sub BAcquire_Click()
    With VSTwain1
        .StartDevice()
        If .SelectSource() = 1 Then
            .AutoCleanBuffer = 1
            .MaxImages = 1
            .ShowUI = 1
            .Acquire()
        End If
    End With

End Sub

Private Sub VSTwain1_PostScan(ByVal Flag As Long)
    If Flag <> 0 Then
        If VSTwain1.ErrorCode <> 0 Then
            MsgBox VSTwain1.ErrorString
        End If
    Else
        If VSTwain1.NumImages > 0 Then
            If IsNull(Me!OrderName) Then ' a new record?
                Me![OrderName] = " "
                Me![OrderName] = "Order N" + Str(Me!Index)
            End If
            
            Me![OrderImage] = VSTwain1.GetImageAsDIB(0)
            If VSTwain1.ErrorCode <> 0 Then
                MsgBox VSTwain1.ErrorString
            End If
            Form.Refresh
        End If
    End If
End Sub

 

 

¿Puedo guardar las imágenes adquiridas en la tabla MS SQL del servidor?

Si. Puede hacerlo de la manera siguiente. Hay que utilizar el metodo GetImageAsDIB.

Esto es el ejemplo para C# como guardar la imagen en la tabla SQL del server:

  private void SaveToSql_Click(object sender, System.EventArgs e)
  {
     byte[] dib = (byte[]) VSTwain1.GetImageAsDIB(0);
     int imageSize = 14 + dib.Length;
     int imageOffset = 14 + 40;
     int imageBPP = VSTwain1.GetImageBPP(0);
     if (imageBPP == 1) imageOffset += 2*4;
     else if (imageBPP == 8) imageOffset += 256*4;
     
     byte[] image = new byte[imageSize];
     Array.Clear(image,0,imageSize);
   
     // BITMAPFILEHEADER
     image[0] = (byte)'B';
     image[1] = (byte)'M';
     image[2] = (byte)(imageSize&0xFF);
     image[3] = (byte)((imageSize&0xFF00)>>8);
     image[4] = (byte)((imageSize&0xFF0000)>>16);
     image[5] = (byte)((imageSize&0xFF000000)>>24);
     image[10] = (byte)(imageOffset&0xFF);
     image[11] = (byte)((imageOffset&0xFF00)>>8);
     image[12] = (byte)((imageOffset&0xFF0000)>>16);
     image[13] = (byte)((imageOffset&0xFF000000)>>24);
   
     Array.Copy(dib,0,image,14,dib.Length);
     
     // Insert the image into the database
     SqlConnection myConnection = new SqlConnection (@"server=(local);
						database=northwind;uid=sa;pwd=");
     try
     {
        myConnection.Open();
        SqlCommand myCommand = new SqlCommand("DELETE FROM Images WHERE ImageID=1",
						myConnection);
        myCommand.ExecuteNonQuery();
        myCommand = new SqlCommand ("INSERT INTO Images " 
        	+ "(Image, ImageID) VALUES (@Image, @ImageID)", myConnection);
        myCommand.Parameters.Add("@Image", image);
        myCommand.Parameters.Add("@ImageID", 1);
        myCommand.ExecuteNonQuery();
        MessageBox.Show("Image is saved successfully.");
     }
     finally 
     {
        myConnection.Close();
     }		
  }
Y esto es el ejemplo para C# como recibir la imagen guardada antes de la tabla SQL del servidor:
  private void BGetImageFromSql_Click(object sender, System.EventArgs e)
  {
     SqlConnection myConnection = null;
     try    
     {        
        myConnection = new SqlConnection(@"server=(local);
					database=northwind;uid=sa;pwd=");
        SqlCommand myCommand = new SqlCommand("SELECT Image FROM Images WHERE ImageID=1",
					myConnection);
        myConnection.Open();                
        
        // Get the image from the database.        
        byte[] imagedata = (byte[])myCommand.ExecuteScalar();        
        if (imagedata != null)        
        {
           if (pictureBox1.Image != null)
           {
              pictureBox1.Image.Dispose();
              pictureBox1.Image = null;
           }
           MemoryStream stream = new MemoryStream(imagedata);
           pictureBox1.Image = new Bitmap(stream);
           MessageBox.Show("Image is loaded successfully.");
        }        
        else        
        {            
           MessageBox.Show("Image does not exist in database.");
        }    
     }    
     finally    
     {        
        myConnection.Close();    
     }		
  }

 

 

Utilizo Visual FoxPro y no recibo el evento PostScan. ¿Por qué?

Para resolver este problema hay que añadir el orden Application.AutoYield = .F. al inicio del aplicación.