VBA에서 스캐너 Twain 드라이버와 이미지프로세싱툴인 LEAD Tools를 이용해 스캐너를 제어하고 이미지를 만들어 저장한다.
* ltocx13n.ocx 파일을 System32 디렉토리에 카피.
* [도구] -> [참조] 에서 LEAT Main Control 등록.
Sett 이름의 시트의 A와 B열에 이런모양으로다가 환경설정값을 저장해놓고 불러다 쓰도록 한다. 환경설정폼은 알아서..
DeviceName | KODAK Scanner: i1120 |
Resolution | 200 Dpi |
Color | 흑백 |
Page | 단면 |
Paper | A4 크기 |
VBE에서 간단하게 유저폼 생성해서 버튼2개와 LEAD Main Control 추가.
[도구] -> [추가 컨트롤] 에서 LEAD Main Control (13.0) 체크한다음 폼에다 올려준다.
Dim TwainF_W, TwainF_H
Dim TwainPixT, TwainBit
'******************************************************************************
' Direct Scan Button Click
'******************************************************************************
Sub cmdScanST_Click()
Hwnd = FindWindow(vbNullString, Me.Caption)
LEAD1.AutoSetRects = True
LEAD1.AutoRepaint = False
LEAD1.EnableTwainEvent = True
'//////// 설정 저장값에 따라 상수값 변환
Select Case Replace(Sett.Range("B5"), " 크기", "")
Case "기본값": TwainF_W = 11952: TwainF_H = 16848
Case "A3": TwainF_W = 16838: TwainF_H = 23811 '11.7 x 16.5 inches
Case "A4": TwainF_W = 11952: TwainF_H = 16848 '8.3 x 11.7 inches
Case "A5": TwainF_W = 8352: TwainF_H = 11952 '5.83 x 8.3 inches
Case "B4": TwainF_W = 14570: TwainF_H = 20636 '10.1 x 14.3 inches
Case "B5": TwainF_W = 10368: TwainF_H = 14544 '7.2 x 10.1 inches
End Select
Select Case Sett.Range("B3")
Case "흑백": TwainPixT = TWAIN_PIX_HALF: TwainBit = 1
Case "8 bit 회색조": TwainPixT = TWAIN_PIX_GRAY: TwainBit = 8
Case "24 bit 컬러": TwainPixT = TWAIN_PIX_RGB: TwainBit = 24
End Select
With LEAD1
.TwainSourceName = Sett.Range("B1").Value
.TwainMaxPages = -1 'Default
.TwainAppAuthor = "" 'Default
.TwainAppFamily = "" 'Default
.TwainFrameLeft = -1 'Default
.TwainFrameTop = -1 'Default
.TwainFrameWidth = TwainF_W
.TwainFrameHeight = TwainF_H
.TwainBits = TwainBit
.TwainPixelType = TwainPixT
.TwainRes = Val(Sett.Range("B2").Value)
.TwainContrast = TWAIN_DEFAULT_CONTRAST 'Default contrast
.TwainIntensity = TWAIN_DEFAULT_INTENSITY 'Default intensity
.EnableTwainFeeder = True
.EnableTwainAutoFeed = True
.EnableTwainDuplex = 0
End With
SavedSetting = LEAD1.EnableMethodErrors
Me.MousePointer = 11 'Set the pointer to an hourglass
LEAD1.TwainRealize (Hwnd)
Me.MousePointer = 0 'Set the mouse pointer back to the default
LEAD1.TwainFlags = 0
LEAD1.EnableMethodErrors = False
nRet = LEAD1.TwainAcquire(Hwnd)
If nRet <> SUCCESS Then
MsgBox "TWAIN 장치가 준비되지 않았습니다."
LEAD1.EnableMethodErrors = SavedSetting
GoTo FINISHED
End If
FINISHED:
LEAD1.EnableMethodErrors = SavedSetting
LEAD1.EnableTwainEvent = False
'LEAD1.BitonalScaling = BITONALSCALING_SCALETOGRAY
'LEAD1.AutoScroll = True
'LEAD1.DstWidth = LEAD1.ScaleWidth 'Use the full control width.
'LEAD1.DstClipWidth = LEAD1.ScaleWidth
'CalcHeight = (LEAD1.BitmapHeight * LEAD1.ScaleWidth) / LEAD1.BitmapWidth
'LEAD1.DstHeight = CalcHeight 'Use the proportional height.
'LEAD1.DstClipHeight = CalcHeight
'LEAD1.ForceRepaint
End Sub
'******************************************************************************
' Device Select Button Click
'******************************************************************************
Sub cmdSet_Click()
On Error GoTo SELECT_CANCEL
Hwnd = FindWindow(vbNullString, Me.Caption)
LEAD1.TwainSelect Hwnd
Sett.Range("B1") = LEAD1.TwainSourceName
Exit Sub
SELECT_CANCEL:
End Sub
Private Sub LEAD1_TwainPage()
Dim PutRng As Range
Dim myfile As String
DoEvents
'///// 오늘날짜 폴더 생성.
Dim Path_add As String
Dim file_name As String
Path_add = ThisWorkbook.Path & "\ScanImages"
file_name = ""
If Dir(ThisWorkbook.Path & "\ScanImages", vbDirectory) = "" Then
MkDir Path_add
End If
If Dir(ThisWorkbook.Path & "\ScanImages\" & Left(Now(), 10), vbDirectory) = "" Then
MkDir Path_add & "\" & Left(Now(), 10)
End If
Path_add = Path_add & "\" & Left(Now(), 10)
'///// 스캔 이미지 저장.
Static PageCount As Integer
PageCount = PageCount + 1
myfile = Path_add & "\" & Left(Now(), 10) & "_" & Right("000" & PageCount, 4) & ".TIF"
LEAD1.Save myfile, FILE_CCITT_GROUP4, TwainBit, 0, SAVE_OVERWRITE
'LEAD1.Save myfile, FILE_TIF, TwainBit, 0, SAVE_OVERWRITE
'Call OCRReader(myfile)
End Sub
당연히 이것만 가지고는 실행이 안된다.
리드툴은 창의 핸들을 필요로 한다 그렇기때문에 VBA의 Userform에 윈도우핸들값을 찾아다줘야 한다. (Hwnd)
유저폼 코드에는 api를 public수준으로 갖다넣을수 없으므로 빈모듈을 하나 추가한다음
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByRef lparam As Long) As Long
Public Hwnd As Long
Public lparam As Long
이렇게 넣어준다.
창핸들을 잡는건 cmdScanST_Click() 프로시저에
Hwnd = FindWindow(vbNullString, Me.Caption)
이걸로 잡아주면된다.
LEAD1.EnableTwainEvent = True 해주면 스캔작업이 일어난 후에 자동으로 LEAD1_TwainPage()를 호출한다.
.EnableTwainFeeder = True
.EnableTwainAutoFeed = True
이 두개 프로퍼티를 True로 해주면 여러장 연속급지 처리가 된다.
.EnableTwainDuplex = 0
이 프로퍼티는 0일때 단면스캔, 1이면 양면스캔이다.
정확히는
Value Meaning
TWAIN_DUPLEX_NONE [0] No duplex scanning
TWAIN_DUPLEX_1PASS [1] 1-Pass duplex scanning
TWAIN_DUPLEX_2PASS [2] 2-Pass duplex scanning
TWAIN_UNSUPPORTED [2001] The current Twain device does not support duplex scanning.
nRet = LEAD1.TwainAcquire(Hwnd)
twainActuire가 실제 스캔명령을 내리는 메서드이며 결과값을 nRet로 리턴한다. 성공하면 SUCCESS가 뜨고 LEAD1_TwainPage()로 넘어가서 지정된 동작을 수행하게 된다.
LEAD1.Save 가 파일저장 시키는 명령.
리드툴의 도움말 파일.
http://www.askvg.com/how-to-open-help-files-hlp-in-windows-7-that-require-windows-help-program-winhlp32-exe/
'Excel Develop > VBA' 카테고리의 다른 글
[ACCESS] 엑세스의 일련번호(Autonumber Counter) 를 초기화하는 쿼리 (0) | 2013.07.04 |
---|---|
[VB/VBA] 자동으로 닫히는 MsgBox (4) | 2012.11.27 |
[VBA] API로 유저폼(Userform) 주무르기 - 타이틀바(캡션) 없애기, 모서리 둥글게 만들기, 투명한 유저폼 만들기 (3) | 2012.11.24 |
[VBA] 크기조절이 가능한 유저폼 생성하기. (Resizable Userform) (3) | 2012.11.24 |