Использование принтера и печать документов достаточно частая задача в проектах на Delphi, связанных с различными формами. Поэтому для этой цели существует ряд компонентов, в том числе и стандартных.
Однако использование сканера как оказалось не совсем тривиальная задача. В одной проекте на Delphi мне понадобилось использовать сканер и получать изображения с него. При первом рассмотрении нашлось несколько решений:
- Использование ActiveX компонента Kodak Scan Image Control
- Использование компонента DelphiTwain
- Использование C++ библиотеки EZTwain Classic
Каждый из способов хорош по своему.
Использование ActiveX достаточно просто. В окне установи ActiveX компонента следует выбрать Kodak Scan Image Control и перекомпилировать пакет с компонентов.
В проекте использование будет выглядеть следующим образом. Сначала проверим доступность сканера (ScannerAvailable), затем открываем его (OpenScanner), указываем куда сканировать (ScanTo = 2 — в файл), наконец запускаем сканирование методом StartScan:
if ImgScan1.ScannerAvailable then try ImgScan1.OpenScanner; ImgScan1.ScanTo := 2; ImgScan1.Image:='c:\MyPicture.gif'; ImgScan1.StartScan ; Application.ProcessMessages; finally ImgScan1.CloseScanner ; end;
Из недостатков нужно отметить наличие компонента imgscan.ocx на целевых компьютерах, что традиционно для ActiveX.
Компонент DelphiTwain вполне удобен в работе имеет настройки. Домашняя страница проекта — http://delphitwain.sourceforge.net. После установки его традиционным образом и установки его на форму проекта сканирование запускается так:
procedure TForm1.Button1Click(Sender: TObject); var SourceIndex: Integer; begin //Пытамся загрузить библиотеку if DelphiTwain1.LoadLibrary then begin //Аналогично SourceManangerLoaded := TRUE DelphiTwain1.LoadSourceManager(); //Выбираем источник SourceIndex := DelphiTwain1.SelectSource(); if SourceIndex <> -1 then with DelphiTwain1.Source[SourceIndex] do begin //Подготавливаем для передачи данных используя режим ttmFile Loaded := TRUE; TransferMode := ttmFile; Enabled := TRUE; end else ShowMessage('Cancelled') end else ShowMessage('Twain не установлен') end;
Однако, третий способ через библиотеку EZTwain Classic показался наиболее удобным и простым. Библиотека eztwain написана на C++, для нее существует заголовочный pas-файл на Delphi для подключения к проектам. Сам проект EZTwain является коммерческим и Pro версию необходимо покупать. Однако версия EZTwain Classic является бесплатной, потому что не предполагает поддержку и имеет ограниченный функционал по сравнению с Pro-версией. Чтобы подключить библиотеку к проекту нужно подключить этот файл и положить файл eztw32.dll в директорию проекта.
Диалог выбора сканера открывается следующим образом:
procedure TForm1.btSelectScanerClick(Sender: TObject); begin TWAIN_SelectImageSource(Handle); end;
Непосредственно сканирование в файл запускаем так:
procedure TForm1.btScanClick(Sender: TObject); begin {Получаем указатель на графические данные} TWAIN_RegisterApp(1, 1, 1049, 7, 'Название окна', 'Название организации', '', 'Имя приложения'); TWAIN_SetHideUI(Integer(True)); //скрываем интерфейс сканера TWAIN_AcquireToFilename(Handle, PChar(ExtractFilePath(ParamStr(0))+'tmpscan.bmp')); end;
Способ понравился тем, что нет необходимость устанавливать или регистрировать дополнительных библиотек. К проекту линкуется дополнительная библиотека, которая напрямую используется TWAIN.