А теперь немного о не менее интересном, чем печать документов. А именно, сканирование. Как я уже упоминал чуть ниже в блоге, для сканирования документов можно использовать 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");
}
// 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.
Надеюсь кому-то это решение когда-нибудь пригодится. :)
3 июля 2009 16:28
Список сканеров, которые поддерживаются службой загрузки изображений Windows
18 октября 2010 20:48
Сергей, а в каком проекте и как реализовали?
Что-то универсальное или под конкретное оборудование\ПО?
19 октября 2010 17:35
"Шевченко Юрий" написал:Сергей, а в каком проекте и как реализовали?
Что-то универсальное или под конкретное оборудование\ПО?
Ничего сложного и универсального - просто, автоматическая загрузка сканируемого документа в систему Террасофт, в рамках сбора пакета документов по клиенту.
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать