Сканирование изображений, используя TWAIN компоненту WIA







Универсальная обработка заполнения объектов для сканирования изображений сохранения в любом формате и прикрепления его к документу. Можно использовать как самостоятельную обработку, так и добавить через «Администрирование» во «Дополнительные обработки и отчеты». Протестирована на БП 3.0, УНФ 1.6, ЗКГУ 3.1, УТ 11.4, Розница 2.2.
Не требуется установка дополнительных программ и компонентов (кроме драйвера сканера, естественно)

Данная обработка использует компоненту Twain которая хранится в макете обработки, никакие внешние процедуры из конфигурации ей не нужны что делает ее универсальной. Единственное только возможны изменения в процедурах регистрации обработки

 Если Метаданные.ОбщиеМакеты.Найти("ПрисоединенныеФайлы")<>Неопределено ТОгда
Для каждого Спр Из Метаданные.Справочники Цикл
Если ПрисоединенныеФайлы.КОбъектуМожноПрисоединятьФайлы(Справочники[Спр.Имя].ПустаяСсылка()) Тогда
ПараметрыРегистрации.Назначение.Добавить("Справочник." + Спр.Имя);
КонецЕсли;
КонецЦикла;
Для каждого Спр Из Метаданные.Документы Цикл
Если ПрисоединенныеФайлы.КОбъектуМожноПрисоединятьФайлы(Документы[Спр.Имя].ПустаяСсылка()) Тогда
ПараметрыРегистрации.Назначение.Добавить("Документ." + Спр.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;

Для работы со сканерами мы используем Windows Image Acquisition (WIA)-это полнофункциональный компонент для обработки изображений, обеспечивающий сквозные возможности обработки изображений. Уровень автоматизации WIA позволяет легко получать изображения с цифровых камер, сканеров или веб-камер, а также вращать, масштабировать и аннотировать файлы изображений https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-wiadevicetype

 
.....
КодВозврата = ПодключитьВнешнююКомпоненту("ВнешняяОбработка.СканированиеДокументов.Макет.КомпонентаTWAIN", "twain");
.....
Соответсвие = Новый Соответствие;

Соответсвие.Вставить("DeviceManager", Новый COMОбъект("WIA.DeviceManager"));
Соответсвие.Вставить("ImageFile", Новый COMОбъект("WIA.ImageFile"));
Соответсвие.Вставить("CommonDialog", Новый COMОбъект("WIA.CommonDialog"));
Соответсвие.Вставить("ImageProcess", Новый COMОбъект("WIA.ImageProcess"));
.....

Для определения списка устройств:

Функция ПолучитьУстройства() Экспорт

Массив = Новый Массив;

Если Не ПроинициализироватьКомпоненту() Тогда
Возврат Массив;
КонецЕсли;

Для Каждого DeviceInfo Из Обработка_ПараметрыПриложения["СтандартныеПодсистемы.ИнтерфейсWIA"]["DeviceManager"].DeviceInfos() Цикл
Массив.Добавить(DeviceInfo.Properties("Name").Value);
КонецЦикла;

Возврат Массив;

КонецФункции

Получить нужное устройство для работы и обработки:

 
Функция ПолучитьУстройство(ИмяУстройства)

Для Каждого DeviceInfo Из Обработка_ПараметрыПриложения["СтандартныеПодсистемы.ИнтерфейсWIA"]["DeviceManager"].DeviceInfos() Цикл
Если ВРЕГ(DeviceInfo.Properties("Name").Value) = ВРЕГ(ИмяУстройства) Тогда
Возврат DeviceInfo;
КонецЕсли;
КонецЦикла;

Возврат Неопределено;

КонецФункции

Для работы с диалоговыми окнами необходимо определить несколько переменных:

Типы файлов:

 СоответствиеФорматID = Новый Соответствие;
СоответствиеФорматID.Вставить(-1, "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}");
СоответствиеФорматID.Вставить("BMP", "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}");
СоответствиеФорматID.Вставить("PNG", "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}");
СоответствиеФорматID.Вставить("GIF", "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}");
СоответствиеФорматID.Вставить("JPG", "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");
СоответствиеФорматID.Вставить("JPEG", "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");
СоответствиеФорматID.Вставить("TIFF", "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}");
 

Типы изображений:

 СоответствиеЦветностьID = Новый Соответствие;
СоответствиеЦветностьID.Вставить(-1, 0); //Не задано
СоответствиеЦветностьID.Вставить(0, 4);  //Монохромное (текст)
СоответствиеЦветностьID.Вставить(1, 2);  //Чернобелое
СоответствиеЦветностьID.Вставить(2, 1);  //Цветное

Для запуска сканера в нужном режиме без диалога:

 
  Image = CommonDialog.ShowAcquireImage(WiaDeviceType, WiaImageIntent, WiaImageBias, СоответствиеФорматID.Получить(ФорматКартинки));

Для запуска помощника сканирования:

 
....
objDevice=CommonDialog.ShowSelectDevice(WiaDeviceType,false,false);
Image = CommonDialog.ShowAcquisitionWizard(objDevice); //ПолучитьУстройство(ИмяУстройства));
....

Если желаем полностью настроить сканер программно и запустить сканирование без диалогов:

 
РазмерГоризонтально = Окр(210 / 25.4 * Разрешение, 0);
РазмерВертикально = Окр(296 / 25.4 * Разрешение, 0);

Device =  Обработка_ПараметрыПриложения["СтандартныеПодсистемы.ИнтерфейсWIA"]["DeviceManager"]; //Новый COMОбъект("WIA.DeviceManager");
DeviceInfo = Device.DeviceInfos();
Если DeviceInfo.Count() > 0 Тогда
objDevice = CommonDialog.ShowSelectDevice(WiaDeviceType, Ложь, Ложь);

Сканер = objDevice.Items(1);
СканерПараметры = Сканер.Properties();
СканерПараметры.Item("6146").Value = Цветность;
СканерПараметры.Item("6147").Value = Разрешение;
СканерПараметры.Item("6148").Value = Разрешение;

СканерПараметры.Item("6149").Value = 0;
СканерПараметры.Item("6150").Value = 0;

СканерПараметры.Item("6151").Value = РазмерГоризонтально;
СканерПараметры.Item("6152").Value = РазмерВертикально;

Image = Сканер.Transfer();

КонецЕсли;

Весь список свойств можно получить через отладку

И последнее — это как и где получить возможные разрешения для сканера. Они также хранятся в свойствах каждого элемента.

В принципе, для работы со сканером как бы все есть, даже более. 

Также данную библиотеку можно использовать и для получения видео и для обработки изображений. Например, вот так с помощью нее можно конвертировать изображение в нужный формат данных:

 
ImageProcess = Обработка_ПараметрыПриложения["СтандартныеПодсистемы.ИнтерфейсWIA"]["ImageProcess"];

Если  ImageProcess.Filters.Count = 0 ТОгда
ImageProcess.Filters.Add(ImageProcess.FilterInfos("Convert").FilterID);
Конецесли;
ImageProcess1 = ImageProcess.Filters(1);
Для К = 1 По ImageProcess1.Properties.Count Цикл
Если ImageProcess1.Properties(К).Name = "FormatID" Тогда
ImageProcess1.Properties(К).Value = СоответствиеФорматID.Получить(ФорматКартинки);
Прервать;
КонецЕсли;
КонецЦикла;

Image = ImageProcess.Apply(Image); //применяем фильтр на изображение

Обработка тестировалась на платформе 1С:Предприятие 8.3 (8.3.15).

Проверено на конфигурациях БП 3.0, ЗКГУ 3.1, УНФ 1.6, УТ 11.4, Розница 2.2.

3 Comments

  1. amd1986

    Компонента работает на 64 битной платформе 1С? Ранее то не работала..

    Reply
  2. vik070777

    Щас проверю на ВебКлиенте точно не работает

    Reply
  3. vik070777

    Работает

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *