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 가 파일저장 시키는 명령.



리드툴의 도움말 파일.

윈7에서 구 hlp파일을 열기 위해 필요한 업데이트 링크.
http://www.askvg.com/how-to-open-help-files-hlp-in-windows-7-that-require-windows-help-program-winhlp32-exe/

+ Recent posts