Как пропустить пустые страницы при TWAIN сканировании?
В этом разделе
Пустые страницы при TWAIN сканировании можно пропускать 2 способами:
- используя возможности TWAIN сканера
- используя возможности библиотеки (SDK)
1. Пропуск пустых страниц при использовании возможностей TWAIN сканера
Для начала необходимо проверить, поддерживает ли TWAIN сканер возможность пропуска пустых страниц - проверьте, поддерживает ли TWAIN сканер возможность ICAP_AUTODISCARDBLANKPAGES.
Если TWAIN сканер поддерживает возможность ICAP_AUTODISCARDBLANKPAGES, то вам нужно установить значение возможности таким образом, чтобы определить нужно ли пропускать пустые страницы.
Допустимые значения возможности ICAP_AUTODISCARDBLANKPAGES:
- -2 - TWAIN сканер НЕ должен пропускать пустые страницы при сканировании
- -1 - TWAIN сканер должен пропускать пустые страницы при сканировании
Вот C#/VB.NET код, который демонстрирует, как пропускать пустые страницы, если TWAIN сканер поддерживает эту возможность:
/// <summary>
/// Synchronously acquires images from TWAIN device and skips blank pages using TWAIN capability.
/// </summary>
public void SynchronouslyAcquireImagesFromTwainDeviceAndSkipBlankPagesUsingTwainCapability()
{
try
{
using (Vintasoft.Twain.DeviceManager deviceManager = new Vintasoft.Twain.DeviceManager())
{
// open the device manager
deviceManager.Open();
// get reference to the default device
Vintasoft.Twain.Device device = deviceManager.DefaultDevice;
// set scanning settings
device.TransferMode = Vintasoft.Twain.TransferMode.Memory;
device.ShowUI = false;
// open the device
device.Open();
// get a reference to the IAutoDiscardBlankPages capability
Vintasoft.Twain.DeviceCapability autoDiscardBlankPagesCap = device.Capabilities.Find(Vintasoft.Twain.DeviceCapabilityId.IAutoDiscardBlankPages);
// if discarding of blank pages is not supported
if (autoDiscardBlankPagesCap == null)
System.Windows.Forms.MessageBox.Show("Device cannot automatically discard blank pages.");
else
// enable discarding of blank pages
autoDiscardBlankPagesCap.SetValue(true);
// synchronously acquire image(s) from TWAIN device
Vintasoft.Twain.AcquireModalState acquireModalState;
do
{
acquireModalState = device.AcquireModal();
switch (acquireModalState)
{
case Vintasoft.Twain.AcquireModalState.ImageAcquired:
// add the acquired image to a TIFF file
device.AcquiredImage.Save(@"d:\test.tif");
// dispose the acquired image
device.AcquiredImage.Dispose();
break;
case Vintasoft.Twain.AcquireModalState.ScanCompleted:
// output current state
System.Console.WriteLine("Scan completed.");
break;
case Vintasoft.Twain.AcquireModalState.ScanCanceled:
// output current state
System.Console.WriteLine("Scan canceled.");
break;
case Vintasoft.Twain.AcquireModalState.ScanFailed:
// output current state
System.Console.WriteLine(string.Format("Scan failed: {0}", device.ErrorString));
break;
}
}
while (acquireModalState != Vintasoft.Twain.AcquireModalState.None);
// close the device
device.Close();
// close the device manager
deviceManager.Close();
}
}
catch (Vintasoft.Twain.TwainException ex)
{
System.Console.WriteLine("Error: " + ex.Message);
}
System.Console.ReadLine();
}
''' <summary>
''' Synchronously acquires images from TWAIN device and skips blank pages using TWAIN capability.
''' </summary>
Public Sub SynchronouslyAcquireImagesFromTwainDeviceAndSkipBlankPagesUsingTwainCapability()
Try
Using deviceManager As New Vintasoft.Twain.DeviceManager()
' open the device manager
deviceManager.Open()
' get reference to the default device
Dim device As Vintasoft.Twain.Device = deviceManager.DefaultDevice
' set scanning settings
device.TransferMode = Vintasoft.Twain.TransferMode.Memory
device.ShowUI = False
' open the device
device.Open()
' get a reference to the IAutoDiscardBlankPages capability
Dim autoDiscardBlankPagesCap As Vintasoft.Twain.DeviceCapability = device.Capabilities.Find(Vintasoft.Twain.DeviceCapabilityId.IAutoDiscardBlankPages)
' if discarding of blank pages is not supported
If autoDiscardBlankPagesCap Is Nothing Then
System.Windows.Forms.MessageBox.Show("Device cannot automatically discard blank pages.")
Else
' enable discarding of blank pages
autoDiscardBlankPagesCap.SetValue(True)
End If
' synchronously acquire image(s) from TWAIN device
Dim acquireModalState As Vintasoft.Twain.AcquireModalState
Do
acquireModalState = device.AcquireModal()
Select Case acquireModalState
Case Vintasoft.Twain.AcquireModalState.ImageAcquired
' add the acquired image to a TIFF file
device.AcquiredImage.Save("d:\test.tif")
' dispose the acquired image
device.AcquiredImage.Dispose()
Exit Select
Case Vintasoft.Twain.AcquireModalState.ScanCompleted
' output current state
System.Console.WriteLine("Scan completed.")
Exit Select
Case Vintasoft.Twain.AcquireModalState.ScanCanceled
' output current state
System.Console.WriteLine("Scan canceled.")
Exit Select
Case Vintasoft.Twain.AcquireModalState.ScanFailed
' output current state
System.Console.WriteLine(String.Format("Scan failed: {0}", device.ErrorString))
Exit Select
End Select
Loop While acquireModalState <> Vintasoft.Twain.AcquireModalState.None
' close the device
device.Close()
' close the device manager
deviceManager.Close()
End Using
Catch ex As Vintasoft.Twain.TwainException
System.Console.WriteLine("Error: " + ex.Message)
End Try
System.Console.ReadLine()
End Sub
Преимущества этой техники:
- Когда TWAIN сканер пропускает пустую страницу при сканировании - он не отправляет страницу в приложение и тем самым экономит память.
Недостатки этой техники:
- Только профессиональные, довольно дорогие TWAIN сканеры поддерживают пропуск пустых страниц.
2. Пропуск пустых страниц с использованием возможностей библиотеки (SDK)
Алгоритм этой техники довольно прост. TWAIN сканер отправляет в библиотеку все изображения отсканированных страниц, а библиотека проверяет, является ли изображение пустым, используя метод Vintasoft.Twain.AcquiredImage.IsBlank.
Вот C#/VB.NET код, который демонстрирует, как пропускать пустые страницы с помощью метода IsBlank:
/// <summary>
/// Synchronously acquires images from TWAIN device and skips blank pages using AcquiredImage.IsBlank method.
/// </summary>
public void SynchronouslyAcquireImagesFromTwainDeviceAndSkipBlankPagesUsingIsBlankMethod()
{
try
{
using (Vintasoft.Twain.DeviceManager deviceManager = new Vintasoft.Twain.DeviceManager())
{
// open the device manager
deviceManager.Open();
// get reference to the default device
Vintasoft.Twain.Device device = deviceManager.DefaultDevice;
// set scanning settings
device.TransferMode = Vintasoft.Twain.TransferMode.Memory;
device.ShowUI = false;
// open the device
device.Open();
// synchronously acquire image(s) from TWAIN device
Vintasoft.Twain.AcquireModalState acquireModalState;
do
{
acquireModalState = device.AcquireModal();
switch (acquireModalState)
{
case Vintasoft.Twain.AcquireModalState.ImageAcquired:
// if acquired image is not blank
if (!device.AcquiredImage.IsBlank(0.01f))
// add the acquired image to a TIFF file
device.AcquiredImage.Save(@"d:\test.tif");
// dispose the acquired image
device.AcquiredImage.Dispose();
break;
case Vintasoft.Twain.AcquireModalState.ScanCompleted:
// output current state
System.Console.WriteLine("Scan completed.");
break;
case Vintasoft.Twain.AcquireModalState.ScanCanceled:
// output current state
System.Console.WriteLine("Scan canceled.");
break;
case Vintasoft.Twain.AcquireModalState.ScanFailed:
// output current state
System.Console.WriteLine(string.Format("Scan failed: {0}", device.ErrorString));
break;
}
}
while (acquireModalState != Vintasoft.Twain.AcquireModalState.None);
// close the device
device.Close();
// close the device manager
deviceManager.Close();
}
}
catch (Vintasoft.Twain.TwainException ex)
{
System.Console.WriteLine("Error: " + ex.Message);
}
System.Console.ReadLine();
}
''' <summary>
''' Synchronously acquires images from TWAIN device and skips blank pages using AcquiredImage.IsBlank method.
''' </summary>
Public Sub SynchronouslyAcquireImagesFromTwainDeviceAndSkipBlankPagesUsingIsBlankMethod()
Try
Using deviceManager As New Vintasoft.Twain.DeviceManager()
' open the device manager
deviceManager.Open()
' get reference to the default device
Dim device As Vintasoft.Twain.Device = deviceManager.DefaultDevice
' set scanning settings
device.TransferMode = Vintasoft.Twain.TransferMode.Memory
device.ShowUI = False
' open the device
device.Open()
' synchronously acquire image(s) from TWAIN device
Dim acquireModalState As Vintasoft.Twain.AcquireModalState
Do
acquireModalState = device.AcquireModal()
Select Case acquireModalState
Case Vintasoft.Twain.AcquireModalState.ImageAcquired
' if acquired image is not blank
If Not device.AcquiredImage.IsBlank(0.01F) Then
' add the acquired image to a TIFF file
device.AcquiredImage.Save("d:\test.tif")
End If
' dispose the acquired image
device.AcquiredImage.Dispose()
Exit Select
Case Vintasoft.Twain.AcquireModalState.ScanCompleted
' output current state
System.Console.WriteLine("Scan completed.")
Exit Select
Case Vintasoft.Twain.AcquireModalState.ScanCanceled
' output current state
System.Console.WriteLine("Scan canceled.")
Exit Select
Case Vintasoft.Twain.AcquireModalState.ScanFailed
' output current state
System.Console.WriteLine(String.Format("Scan failed: {0}", device.ErrorString))
Exit Select
End Select
Loop While acquireModalState <> Vintasoft.Twain.AcquireModalState.None
' close the device
device.Close()
' close the device manager
deviceManager.Close()
End Using
Catch ex As Vintasoft.Twain.TwainException
System.Console.WriteLine("Error: " + ex.Message)
End Try
System.Console.ReadLine()
End Sub
Преимущества этой техники:
- Она подходит для любого TWAIN сканера.
Недостатки этой техники:
- Расход памяти больше, чем в первой технике.