How to get information about capabilities/options of TWAIN/SANE device?
In This Topic
TWAIN standard defines many standard capabilities (XferCount, IPixelType, DoubleFeedDetection, IContrast, IRotation, etc), which can be supported by TWAIN device. Also TWAIN device can provide custom capabilities, which are defined by scanner manufacturer.
If you want to get a list of capabilities, which are supported by TWAIN device, please use the
WebTwainDeviceJS.getSupportedCapabilities function.
If you want to get current value of TWAIN device capability, please use the
WebTwainCapabilityInfoJS.get_CurrentValue function.
If you want to get the default value of TWAIN device capability, please use the
WebTwainCapabilityInfoJS.get_DefaultValue function.
If you want to get supported values of TWAIN device capability, please use the
WebTwainCapabilityInfoJS.get_SupportedValues function.
SANE API does not define standard options for SANE device, SANE API just defines rules, which allow to create self-describing options by device manufacturer.
If you want to get a list of options, which are supported by SANE device, please use the
WebTwainDeviceJS.getSupportedCapabilities function.
If you want to get current value of SANE device option, please use the
WebTwainCapabilityInfoJS.get_CurrentValue function.
If you want to get supported values of SANE device option, please use the
WebTwainCapabilityInfoJS.get_SupportedValues function.
Here is JavaScript code that demonstrates how to get information about supported values of capability/option of TWAIN/SANE device:
// get information about capability value from TWAIN/SANE scanner
__getCapValueFromTwainScanner();
/**
* Returns information about capability value from TWAIN/SANE scanner.
*/
function __getCapValueFromTwainScanner() {
// register the evaluation version of VintaSoft Web TWAIN service
// please read how to get evaluation license in documentation: https://www.vintasoft.com/docs/vstwain-dotnet-web/Licensing-Twain_Web-Evaluation.html
Vintasoft.Twain.WebTwainGlobalSettingsJS.register('REG_USER', 'REG_URL', 'REG_CODE', 'EXPIRATION_DATE');
// URL to the VintaSoft Web TWAIN service
var serviceUrl = 'https://localhost:25329/api/VintasoftTwainApi';
// a Web API controller that allows to work with TWAIN and SANE devices
var twainService = new Vintasoft.Shared.WebServiceControllerJS(serviceUrl);
// TWAIN/SANE device manager
var deviceManager = new Vintasoft.Twain.WebTwainDeviceManagerJS(twainService);
// the default settings of device manager
var deviceManagerInitSetting = new Vintasoft.Twain.WebTwainDeviceManagerInitSettingsJS();
var device = null;
try {
// open device manager
deviceManager.open(deviceManagerInitSetting);
// get the default TWAIN/SANE device
device = deviceManager.get_DefaultDevice();
// open device without UI
device.open(false);
// if device is SANE device
if (device.get_DeviceName().substring(0, 4) == "Sane") {
// get "mode" option of SANE device
var scanModeOption = device.getCapability("mode", new Vintasoft.Twain.WebTwainDeviceCapabilityUsageModeEnumJS("Get"));
// if "mode" option is supported by SANE device
if (scanModeOption != null) {
// output information about current scan mode
console.log("Current scan mode: " + scanModeOption.get_CurrentValue());
// get supported scan modes
var supportedScanModes = scanModeOption.get_SupportedValues();
var supportedScanModesAsArray = supportedScanModess.get_SupportedValuesAsArray();
var supportedScanModesString = "Supported scan modes: ";
// for each supported scan mode
for (var j = 0; j < supportedScanModesAsArray.length; j++) {
supportedScanModesString += supportedScanModesAsArray[j].toString() + ' ';
}
// output information about supported scan modes
console.log(supportedScanModesString);
}
}
// if device is TWAIN device
else {
// get IPixelType capability of TWAIN device
var pixelTypeCap = device.getCapability(
new Vintasoft.Twain.WebDeviceCapabilityIdEnumJS("IPixelType"),
new Vintasoft.Twain.WebTwainDeviceCapabilityUsageModeEnumJS("Get"));
// if IPixelType capability is supported by TWAIN device
if (pixelTypeCap != null) {
// output information about current pixel type
console.log("Current pixel type: " + pixelTypeCap.get_CurrentValue());
// output information about default pixel type
console.log("Default pixel type: " + pixelTypeCap.get_DefaultValue());
// get supported pixel types
var supportedPixelTypes = pixelTypeCap.get_SupportedValues();
var supportedPixelTypesAsArray = supportedPixelTypes.get_SupportedValuesAsArray();
var supportedPixelTypesString = "Supported pixel types: ";
// for each supported pixel type
for (var j = 0; j < supportedPixelTypesAsArray.length; j++) {
supportedPixelTypesString += supportedPixelTypesAsArray[j].toString() + ' ';
}
// output information about supported pixel types
console.log(supportedPixelTypesString);
}
}
// a collection that stores images, which are acquired from TWAIN/SANE devices and stored in memory of VintaSoft Web TWAIN service
var acquiredImages = new Vintasoft.Twain.WebAcquiredImageCollectionJS(deviceManager);
var acquireModalState;
do {
// do one step of modal image acquisition process
var acquireModalResult = device.acquireModalSync();
// get state of image acquisition
acquireModalState = acquireModalResult.get_AcquireModalState().valueOf();
switch (acquireModalState) {
case 2: // image is acquired
// get acquired image
var acquiredImage = acquireModalResult.get_AcquiredImage();
// add acquired image to the image collection
acquiredImages.add(acquiredImage);
// get image as Base64 string
var bitmapAsBase64String = acquiredImage.getAsBase64String();
// update image preview
var previewImageElement = document.getElementById('previewImage');
previewImageElement.src = bitmapAsBase64String;
// clear image collection (delete images from memory of VintaSoft Web TWAIN service) because image is not necessary anymore
acquiredImages.clear();
break;
case 4: // image scan is failed
alert(acquireModalResult.get_ErrorMessage());
break;
case 9: // image scan is finished
break;
}
}
while (acquireModalState !== 0);
}
catch (ex) {
alert(ex);
}
finally {
if (device != null) {
// close the device
device.close();
}
// close the device manager
deviceManager.close();
}
}
Here is TypeScript code that demonstrates how to get information about supported values of capability/option of TWAIN/SANE device:
import { Component } from '@angular/core';
@Component({
selector: 'twain-scanning-demo',
templateUrl: './twain-scanning-demo.component.html'
})
export class TwainScanningDemoComponent {
ngOnInit() {
// get information about capability value from TWAIN/SANE device
this.__getCapValueFromTwainScanner();
}
/**
* Returns information about capability value from TWAIN/SANE device.
*/
__getCapValueFromTwainScanner() {
// register the evaluation version of VintaSoft Web TWAIN service
// please read how to get evaluation license in documentation: https://www.vintasoft.com/docs/vstwain-dotnet-web/Licensing-Twain_Web-Evaluation.html
Vintasoft.Twain.WebTwainGlobalSettingsJS.register('REG_USER', 'REG_URL', 'REG_CODE', 'EXPIRATION_DATE');
// URL to the VintaSoft Web TWAIN service
let serviceUrl: string = 'https://localhost:25329/api/VintasoftTwainApi';
// a Web API controller that allows to work with TWAIN and SANE devices
let twainService: Vintasoft.Shared.WebServiceControllerJS = new Vintasoft.Shared.WebServiceControllerJS(serviceUrl);
// TWAIN/SANE device manager
let deviceManager: Vintasoft.Twain.WebTwainDeviceManagerJS = new Vintasoft.Twain.WebTwainDeviceManagerJS(twainService);
// the default settings of device manager
let deviceManagerInitSetting: Vintasoft.Twain.WebTwainDeviceManagerInitSettingsJS = new Vintasoft.Twain.WebTwainDeviceManagerInitSettingsJS();
try {
// open device manager
deviceManager.open(deviceManagerInitSetting);
}
catch (ex) {
alert(ex);
return;
}
let device: Vintasoft.Twain.WebTwainDeviceJS = null;
try {
// get the default TWAIN/SANE device
device = deviceManager.get_DefaultDevice();
// open device without UI
device.open(false);
// if device is SANE device
if (device.get_DeviceName().substring(0, 4) == "Sane") {
// get "mode" option of SANE device
let scanModeOption: Vintasoft.Twain.WebTwainCapabilityInfoJS = device.getCapability(
"mode",
new Vintasoft.Twain.WebTwainDeviceCapabilityUsageModeEnumJS("Get"));
// if "mode" option is supported by SANE device
if (scanModeOption != null) {
// output information about current scan mode
console.log("Current scan mode: " + scanModeOption.get_CurrentValue());
// get supported scan modes
let supportedScanModes: Vintasoft.Twain.WebTwainCapabilitySupportedValuesJS = scanModeOption.get_SupportedValues();
let supportedScanModesAsArray: object[] = supportedScanModes.get_SupportedValuesAsArray();
let supportedScanModesString: string = "Supported scan modes: ";
// for each supported scan mode
for (let j: number = 0; j < supportedScanModesAsArray.length; j++) {
supportedScanModesString += supportedScanModesAsArray[j].toString() + ' ';
}
// output information about supported scan modes
console.log(supportedScanModesString);
}
}
// if device is TWAIN device
else {
// get IPixelType capability of TWAIN device
let pixelTypeCap: Vintasoft.Twain.WebTwainCapabilityInfoJS = device.getCapability(
new Vintasoft.Twain.WebDeviceCapabilityIdEnumJS("IPixelType"),
new Vintasoft.Twain.WebTwainDeviceCapabilityUsageModeEnumJS("Get"));
// if IPixelType capability is supported by TWAIN scanner
if (pixelTypeCap != null) {
// output information about current pixel type
console.log("Current pixel type: " + pixelTypeCap.get_CurrentValue());
// output information about default pixel type
console.log("Default pixel type: " + pixelTypeCap.get_DefaultValue());
// get supported pixel types
let supportedPixelTypes: Vintasoft.Twain.WebTwainCapabilitySupportedValuesJS = pixelTypeCap.get_SupportedValues();
let supportedPixelTypesAsArray: object[] = supportedPixelTypes.get_SupportedValuesAsArray();
let supportedPixelTypesString: string = "Supported pixel types: ";
// for each supported pixel type
for (let j: number = 0; j < supportedPixelTypesAsArray.length; j++) {
supportedPixelTypesString += supportedPixelTypesAsArray[j].toString() + ' ';
}
// output information about supported pixel types
console.log(supportedPixelTypesString);
}
}
// a collection that stores images, which are acquired from TWAIN/SANE devices and stored in memory of VintaSoft Web TWAIN service
let acquiredImages: Vintasoft.Twain.WebAcquiredImageCollectionJS = new Vintasoft.Twain.WebAcquiredImageCollectionJS(deviceManager);
let acquireModalState: number;
do {
// do one step of modal image acquisition process
let acquireModalResult: Vintasoft.Twain.WebTwainDeviceAcquireModalResultJS = device.acquireModalSync();
// get state of image acquisition
acquireModalState = acquireModalResult.get_AcquireModalState().valueOf() as number;
switch (acquireModalState) {
case 2: // image is acquired
// get acquired image
let acquiredImage: Vintasoft.Twain.WebAcquiredImageJS = acquireModalResult.get_AcquiredImage();
// add acquired image to the image collection
acquiredImages.add(acquiredImage);
// get image as Base64 string
let bitmapAsBase64String: string = acquiredImage.getAsBase64String();
// update image preview
let previewImageElement: HTMLImageElement = document.getElementById('previewImage') as HTMLImageElement;
previewImageElement.src = bitmapAsBase64String;
// clear image collection (delete images from memory of VintaSoft Web TWAIN service) because image is not necessary anymore
acquiredImages.clear();
break;
case 4: // image scan is failed
alert(acquireModalResult.get_ErrorMessage());
break;
case 9: // image scan is finished
break;
}
}
while (acquireModalState !== 0);
}
catch (ex) {
alert(ex);
}
finally {
if (device != null) {
// close the device
device.close();
}
// close the device manager
deviceManager.close();
}
}
}