TWAIN - это стандартный протокол и интерфейс (API), определяющий взаимодействие между программой и сканером изображений. Стандарт TWAIN разрабатывается рабочей группой TWAIN. Версия 1 TWAIN стандарта определяет взаимодействие с сканерами изображений для Windows. Версия 2 TWAIN стандарта определяет взаимодействие с сканерами изображений для Windows, macOS, Linux.
TWAIN стандарт является самым популярным стандартом для сканеров изображений для Windows. Практически любой сканер изображений имеет TWAIN драйвер для использования сканера изображений в Windows.
TWAIN стандарт не является популярным стандартом в Linux и наше исследование (на начало 2024 года) показало что только компания Kodak предоставляет TWAIN драйвера для использования Kodak сканеров изображений в Linux.
SANE (Scanner Access Now Easy) - это интерфейс прикладного программирования (API), который предоставляет стандартизированный доступ к устройствам сканирования растровых изображений (планшетные сканеры, ручные сканеры и другие). SANE API является общественным достоянием и открыт для всеобщего обсуждения и разработки. SANE API является самым популярным API для сканеров изображений для Linux.
Многие производители сканеров создали SANE драйвера для своих сканеров изображений. Также есть SANE драйвера, которые созданы SANE сообществом. В итоге практически для любого современного сканера изображений есть SANE драйвер, который позволяет использовать сканер изображений в Linux.
VintaSoft Twain .NET SDK предоставляет VintaSoft TWAIN JavaScript API и VintaSoft Web TWAIN сервис, которые позволяют веб разработчику быстро и легко создать кросс-браузерное веб-приложение для получения изображений от TWAIN или SANE сканера в Windows и Linux. Разработанные веб приложения можно использовать во всех популярных веб браузерах.
VintaSoft TWAIN JavaScript API - это API, который позволяет работать с TWAIN и SANE сканерами изображений в Windows и Linux, т.е. клиентская сторона веб приложения использует один и тот же код для работы с TWAIN и SANE сканерами изображений в Windows и Linux. Для работы VintaSoft TWAIN JavaScript API необходимо установить VintaSoft Web TWAIN сервис на локальный компьютер, потому что VintaSoft TWAIN JavaScript API отправляет запросы к VintaSoft Web TWAIN сервису, чтобы получить доступ к локальным TWAIN и SANE сканерам изображений. Подробную информацию о VintaSoft TWAIN JavaScript API пожалуйста читайте в он-лайн документации для веб разработчика:
https://www.vintasoft.ru/docs/vstwain-dotnet-web/
VintaSoft Web TWAIN сервис - это сервис, который предоставляет Web API для доступа к локальным TWAIN сканерам для всех пользователей локального компьютера. Есть версия VintaSoft Web TWAIN сервиса для Windows и Linux.
Windows версия VintaSoft Web TWAIN сервиса может быть установлена на любой Windows компьютер с помощью Windows инсталлятора. Подробную информацию о Windows версии VintaSoft Web TWAIN сервиса пожалуйста читайте здесь:
https://www.vintasoft.ru/docs/vstwain-dotnet-web/Programming-Twain_Web-Vintasoft_Web_TWAIN_service.html
Linux версия VintaSoft Web TWAIN сервиса может быть установлена на Ubuntu, Debian, Fedora компьютер с помощью .deb- или .rpm-пакета. Подробную информацию о Linux версии VintaSoft Web TWAIN сервиса пожалуйста читайте здесь:
https://www.vintasoft.ru/docs/vstwain-dotnet-web/Programming-Twain_Web-Vintasoft_Web_TWAIN_service_for_Linux.html
Для создания веб приложения, которое получает изображения от TWAIN или SANE сканера изображений в веб браузере в Windows и Linux, необходимо выполнить следующие шаги:
- Установить VintaSoft Web TWAIN сервис на компьютер к которому подключены TWAIN и SANE сканера изображений.
- Написать JavaScript код, который использует VintaSoft TWAIN JavaScript API для доступа к локальным сканерам изображений.
Вот JavaScript код, который показывает как получить изображения от TWAIN или SANE сканера изображений в веб браузере (Firefox, Chrome, Edge, Opera, ...) в Windows и Linux:
// synchronously acquire images from TWAIN/SANE scanner and saves acquired images to PDF file
__synchronouslyAcquireImagesFromTwainScannerAndSaveToPdfFile();
/**
* Synchronously acquires images from TWAIN/SANE scanner and saves acquired images to PDF file.
*/
function __synchronouslyAcquireImagesFromTwainScannerAndSaveToPdfFile() {
// 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);
// create collection for images acquired from device
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 collection of acquired images
acquiredImages.add(acquiredImage);
// save acquired image to "result.pdf" file
acquiredImages.saveImages("d:\\result.pdf", false, [ acquiredImage.get_Id() ]);
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();
}
}