Um dos melhores componentes de scaneamento que j?? utilizei ?? o da VintaSoft. Ele n??o ?? free, mas pode ser utilizado normalmente. O ??nico empecilho ?? que, para cada scan que fizer, ele ir?? solicitar que clique em Evaluate. Quem comprar, vale a pena pois ?? muito bom e seu suporte sempre est?? a disposi????o. Chega de elogios e vamos ao que interessa.
O componente permite tanto utilizar em Windows Form quando Web Form e no site h?? todos os exemplos necess??rios. Baixe o componente e instale. Para nosso exemplo, trabalharemos com um Windows Form. Fiz uma pequena aplica????o de scanear nota fiscal.
V?? na pasta de instala????o do componente, copie o arquivo Vintasoft.Twain.dll para sua aplica????o e adicione como refer??ncia. No Code-Behind do formul??rio a ser trabalhado, adicione o seguinte c??digo para inicializar o componente:
using Vintasoft.Twain;
// Carrega o gerenciador de dispositivo
DeviceManager _deviceManager = new DeviceManager();
Device _device;
// Avalia se ?? um dispositivo ??til
if (!_deviceManager.IsTwainAvailable)
{
MessageBox.Show(“N??o ?? um dispositivo TWAIN!”, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
// Abre o gerenciador de dispositivo
_deviceManager.Open();
// Seta o dispositivo corrente
_device = _deviceManager.Devices.Current;
lblDipositivo.Text = _deviceManager.Devices.Current.Info.ProductName;
}
catch (TwainDeviceManagerException ex)
{
MessageBox.Show(ex.Message, “Gerenciador de Dispositivos”);
return;
}
Agora, ao clicar no bot??o Scannear, adicionamos o seguinte m??todo:
private void btnScanear_Click(object sender, EventArgs e)
{
try
{
// Seta as configura????es
_device.TransferMode = TransferMode.File;
try
{
_device.ShowUI = false;
_device.ShowIndicators = false;
_device.DisableAfterAcquire = true;
}
catch { }
// Abre o dispositivo
_device.Open();
// Propriedades do scaneamento
try
{
_device.UnitOfMeasure = UnitOfMeasure.Inches;
_device.Resolution = new Resolution(float.Parse(resolucaoX.SelectedItem.ToString()), float.Parse(resolucaoY.SelectedItem.ToString()));
}
catch { }
// Informa????o sobre o arquivo
_arquivo = “LJ_” + _loja + “_Scan_” + DateTime.Now.ToString(“yyyy_MM_dd_HH_mm_ss”) + “.jpg”;
_device.FileName = _directoryForImages + _arquivo;
//_device.FileFormat = TwainImageFileFormat.Jpeg;
// Captura a imagem
AcquireModalState acquireModalState = AcquireModalState.None;
do
{
acquireModalState = _device.AcquireModal();
switch (acquireModalState)
{
case AcquireModalState.ImageAcquired:
_device.FileName = _directoryForImages + _arquivo;
//_device.FileFormat = TwainImageFileFormat.Jpeg;
break;
case AcquireModalState.ScanCompleted:
CloseDevice();
break;
case AcquireModalState.ScanCanceled:
CloseDevice();
break;
case AcquireModalState.ScanFailed:
CloseDevice();
break;
case AcquireModalState.UserInterfaceClosed:
CloseDevice();
break;
}
}
while (acquireModalState != AcquireModalState.None);
}
catch (TwainException ex)
{
MessageBox.Show(ex.Message + ” – “ + ex.StackTrace, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
E outros m??todos s??o necess??rios adicionar ao form, como:
private void CloseDeviceAndDeviceManager()
{
// Verifica de h?? dispositivo
if (_device != null)
{
if (_device.State != DeviceState.Closed)
_device.Close();
}
// Fecha a ger??ncia
if (_deviceManager.State != DeviceManagerState.Closed)
_deviceManager.Close();
}
private void CloseDevice()
{
// Desabilita o servi??o
if (_device.State == DeviceState.Enabled)
{
if (!_device.ShowUI)
_device.Disable();
}
// Fecha
if (_device.State == DeviceState.Opened)
_device.Close();
}
private void Scan_FormClosing(object sender, FormClosingEventArgs e)
{
if (_device != null)
{
// Verifica se est?? em uso
if (_device.State == DeviceState.Transferring ||
_device.State == DeviceState.TransferReady)
{
// Envia a solicita????o de cancelamento
_device.CancelTransfer();
// Aguarda finalizar
e.Cancel = true;
MessageBox.Show(“O dispositivo est?? em uso! Aguarde alguns instantes enquanto ?? solicitado a libera????o do scanner.”, “Informa????o”);
return;
}
}
// Fecha o dispositivo e a ger??ncia
CloseDeviceAndDeviceManager();
}
Pronto! O scaneamento ?? realizado e ?? gerado um arquivo JPG. Reparem que est?? comentado o atributo _device.FileFormat porque nem todo scanner d?? a possibilidade de configura????o. Alguns aceitam e outros n??o. Se utilizar alguma configura????o que o scanner n??o suporta, deve aparecer a mensagem: “Failed to get/get to capability”. Ent??o voc?? precisa deixar apenas as configura????es que o scanner suporte.
Bons scans!