How to scan pages from the automatic document feeder (ADF) of TWAIN/SANE scanner?
In This Topic
If you want to scan pages from the automatic document feeder (ADF) of TWAIN scanner, you should use the
WebTwainDeviceDocumentFeederJS class.
If you want to scan pages from the automatic document feeder (ADF) of SANE scanner, you should set the scan mode allowing to use ADF, for example, Kodak scanners have several scan modes for ADF scanning: 'ADF', 'ADF Front', 'ADF Back', 'ADF Both', 'ADF Duplex'. The scan mode of SANE scanner can be set using the
WebTwainDeviceJS.set_SaneScanMode function. Names of scan modes, which are supported by SANE device, can be obtained using
WebTwainDeviceJS.getSupportedSaneScanModes function.
Here is JavaScript code that demonstrates how to use the automatic document feeder of TWAIN/SANE scanner:
// acquire images from document feeder of TWAIN scanner
__acquireImagesFromDocumentFeederOfTwainScanner();
/**
* Acquires images from document feeder of TWAIN scanner.
*/
function __acquireImagesFromDocumentFeederOfTwainScanner() {
// 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 TWAIN device
device = deviceManager.findDeviceByName("Twain64: KODAK Scanner: i5000");
if (device == null)
return;
// open device without UI
device.open(false);
// if device is SANE device
if (device.get_DeviceName().substring(0, 4) == "Sane") {
// specify that images must be acquired from ADF
device.set_SaneScanSource("ADF Duplex");
}
// if device is TWAIN device
else {
// if device has document feeder
if (device.get_HasFeeder()) {
var documentFeeder = device.get_DocumentFeeder();
// enable the document feeder of TWAIN device
documentFeeder.set_Enabled(true);
// specify that application want to acquire all pages from the feeder
device.set_XferCount(-1);
// if pages can be scanned in duplex mode
if (documentFeeder.get_DuplexMode().toString() != 'None') {
// enable duplex scanning
documentFeeder.set_DuplexEnabled(true);
}
}
}
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();
// get image as Base64 string
var bitmapAsBase64String = acquiredImage.getAsBase64String();
// update image preview
var previewImageElement = document.getElementById('previewImage');
previewImageElement.src = bitmapAsBase64String;
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 use the automatic document feeder of TWAIN/SANE scanner:
import { Component } from '@angular/core';
@Component({
selector: 'twain-scanning-demo',
templateUrl: './twain-scanning-demo.component.html'
})
export class TwainScanningDemoComponent {
ngOnInit() {
// acquire images from document feeder of TWAIN scanner
__acquireImagesFromDocumentFeederOfTwainScanner();
}
/**
* Acquires images from document feeder of TWAIN scanner.
*/
__acquireImagesFromDocumentFeederOfTwainScanner() {
// 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 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 TWAIN device
device = deviceManager.findDeviceByName("Twain64: KODAK Scanner: i5000");
if (device == null)
return;
// open device without UI
device.open(false);
// if device is SANE device
if (device.get_DeviceName().substring(0, 4) == "Sane") {
// specify that images must be acquired from ADF
device.set_SaneScanSource("ADF Duplex");
}
// if device is TWAIN device
else {
// if device has document feeder
if (device.get_HasFeeder()) {
var documentFeeder = device.get_DocumentFeeder();
// enable the document feeder of TWAIN device
documentFeeder.set_Enabled(true);
// specify that application want to acquire all pages from the feeder
device.set_XferCount(-1);
// if pages can be scanned in duplex mode
if (documentFeeder.get_DuplexMode().toString() != 'None') {
// enable duplex scanning
documentFeeder.set_DuplexEnabled(true);
}
}
}
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();
// get image as Base64 string
let bitmapAsBase64String: string = acquiredImage.getAsBase64String();
// update image preview
let previewImageElement: HTMLImageElement = document.getElementById('previewImage') as HTMLImageElement;
previewImageElement.src = bitmapAsBase64String;
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();
}
}
}