Публикация

Сканирование документов из JScript

А теперь немного о не менее интересном, чем печать документов. А именно, сканирование. Как я уже упоминал чуть ниже в блоге, для сканирования документов можно использовать WIA от Microsoft. Для этого необходимо предварительно установить библиотеку wiaaut.dll от MS. Т.е. ее необходимо скачать, установить (используя regsvr32.exe) и далее можно использовать методы COM-объекта WIA.

А теперь сам код.

//-----------------------------------------------------------------------------
// scr_ScanUtils
//-----------------------------------------------------------------------------
 
// Device Types
var UnspecifiedDeviceType = 0;
var ScannerDeviceType = 1;
var CameraDeviceType = 2;
var VideoDeviceType = 3;
 
// Commands
var wiaCommandSynchronize = '{9B26B7B2-ACAD-11D2-A093-00C04F72DC3C}';
var wiaCommandTakePicture = '{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}';
var wiaCommandDeleteAllItems = '{E208C170-ACAD-11D2-A093-00C04F72DC3C}';
var wiaCommandChangeDocument = '{04E725B0-ACAE-11D2-A093-00C04F72DC3C}';
var wiaCommandUnloadDocument = '{1F3B3D8E-ACAE-11D2-A093-00C04F72DC3C}';

// Picture formats
var wiaFormatBMP = '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}';
var wiaFormatPNG = '{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}';
var wiaFormatGIF = '{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}';
var wiaFormatJPEG = '{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}';
var wiaFormatTIFF = '{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}';

// Группа "Все файлы"
var RootFilesGroup = '{F03EDFB0-C246-4A9D-B0E4-DA8C8B3DD338}';

function ConvertImageFile(ImageFile, Format) {
        var IP = System.CreateObject("Wia.ImageProcess");
        IP.Filters.Add(IP.FilterInfos("Convert").FilterID);    
        IP.Filters(1).Properties("FormatID").Value = Format;
        var Img = IP.Apply(ImageFile);
        return Img;
}

// Сканирование без диалоговых окон на сканер по-умолчанию
function SilentScan(FileName) {
        try {
                System.BeginProcessing();
                var Device;
                var Dialog = System.CreateObject("WIA.CommonDialog");
                var DeviceManager = System.CreateObject("WIA.DeviceManager");
                var Count = DeviceManager.DeviceInfos.Count;
                for(var j = 1; j = Count; j++) {
                        var DeviceInfo = DeviceManager.DeviceInfos.Item(j);
                        if (DeviceInfo.Type == ScannerDeviceType) {
                                Device = DeviceInfo.Connect();
                                break;
                        }
                }
            if (!Assigned(Device)) {
                        Log.Write(2, "Сканер не обнаружен.");
                        return;
                }
                if ((Assigned(Device.Items)) && (Assigned(Device.Items.Item(1)))) {
                        var item = Device.Items.Item(1);
                        try {
                                var Intent = 1; // цветная печать
                                /* Параметры сканирования */
                                var Properties = item.Properties;
                                for (var i = 1; i = Properties.Count; i++) {
                                        var PropItem = Properties.Item(i);
                                        switch(PropItem.PropertyID) {
                                                /* Horizontal Resolution */
                                                case 6147: PropItem.Value = 150;
                                                        break;
                                                /* Vertical Resolution */
                                                case 6148: PropItem.Value = 150;
                                                        break;
                                                /* Horizontal Starting Position (Scanning Area) */
                                                case 6149: PropItem.Value = 0;
                                                        break;
                                                /* Vertical Starting Position (Scanning Area) */
                                                case 6150: PropItem.Value = 0;
                                                        break;
                                                /* Current Intent */
                                                case 6146: PropItem.Value = Intent;
                                                        break;
                                        }
                                }
                                /* Старт сканирования */
                                var imageFile = Dialog.ShowTransfer(item);
                            if (Assigned(imageFile)) {
                                if (CheckFileExists(FileName)) {
                                        FileName = GetTemporaryFileName(ShortFileName, false)
                                }
                                /* Преобразование полученного файла в jpeg */
                                var WIAFormat = wiaFormatJPEG;
                                var Img = ConvertImageFile(imageFile, WIAFormat);
                                Img.SaveFile(FileName);
                            }
                        } catch(e) {
                                Log.Write(2, "При сканировании произошла ошибка. Попробуйте, пожалуйста, еще раз.");
                        }
                } else {
                        Log.Write(2, "При инициализации произошла ошибка.");            
                }
        } finally {
                System.EndProcessing();
        }
}

function Main() {
        SilentScan("c:\\temp\\Test.jpg");
}

В приведенном выше коде основной является функция SilentScan(). Поэтому, чтобы начать сканирование, необходимо запускать именно ее, передав полный путь к сохраняемому файлу. В этом примере файл сохраняется в формате jpg, хотя, если это необходимо, WIA позволяет конвертировать полученный объект в ряд других форматов (bmp, png, tiff, gif, jpg). Вообще по-умолчанию после сканирования получается объект в формате bmp. Поэтому, если Вам нужен только bmp-файл, можно просто делать imageFile.SaveFile(FileName) без преобразования. Вроде бы все. Да, и не забудьте подключить к скрипту scr_Utils и scr_FileUtils.

Надеюсь кому-то это решение когда-нибудь пригодится. :)

Нравится

Поделиться

4 комментария

Список сканеров, которые поддерживаются службой загрузки изображений Windows

http://support.microsoft.com/kb/293356/ru

Спасибо, пригодилось.

Сергей, а в каком проекте и как реализовали?
Что-то универсальное или под конкретное оборудование\ПО?

"Шевченко Юрий" написал:Сергей, а в каком проекте и как реализовали?
Что-то универсальное или под конкретное оборудование\ПО?

Ничего сложного и универсального - просто, автоматическая загрузка сканируемого документа в систему Террасофт, в рамках сбора пакета документов по клиенту.

Показать все комментарии