[엑셀 VBA] Snippet - OCR: 이미지 파일을 텍스트 파일로 변환하기

작성자
dra****
작성일
2021-12-01 10:15
조회
369

Captcha 한번 VBA로 뚫어 보려다 별걸 다하게 됩니다.
tesseract라는 무료 OCR 프로그램이 있습니다.
웹상의 이미지를 다운 받아 문서로 바꿔주는 유용한 툴입니다.
GUI가 아닌 CMD창에서 명령어로 입력하는 방식인데,
이 부분을 VBA로 구현하면 text 파일로 변환해서 엑셀로 바로 가져 올수 있습니다.
일반 영문 이미지 파일은 거의 99프로 변환이 됩니다. 정작 Captcha에는 효과가 없습니다.

한글 이미지는 tesseract 홈페이지에 관련 된 내용이 있으니 참고 하시면 됩니다.
그리고 다른 폰트의 글자를 인식하기 위한 글자를 훈련시키는 방법도 있습니다.
그 데이터를 이용해서 변환도 가능합니다.

전체적인 로직
1. tesseract 다운 받기

https://github.com/tesseract-ocr/tesseract

위의 주소에 가서 다운/설치 하시면 됩니다.

설명이 많이 불친절해서 나름 연구를 좀 하셔야 합니다.

 

2. 웹 주소상의 이미지를 다운 받는 로직 구현하기

"URLDownloadToFile" 이라는 urlmon 윈도우즈 API를 이용합니다.

' https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms775123(v=vs.85)
#If VB7 Then
    Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
        (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal szFileName As String, _
         ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As Long
#Else
    Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
        ByVal pCaller As Long, _
        ByVal szURL As String, _
        ByVal szFileName As String, _
        ByVal dwReserved As Long, _
        ByVal lpfnCB As Long _
    ) As Long
#End If
 
Public Function downloadFile(url As String) As Boolean
    Dim captchaFolder As String: captchaFolder = ThisWorkbook.path & "\captcha\captcha.jpg"
    Dim result As String
    result = URLDownloadToFile(0, url, captchaFolder, 0, 0)
    If result = "0" Then
        MsgBox "successful in downloading the captcha file."
        Call captchaInterpret(captchaFolder) '이 부분에 대한 함수는 아래 3번에 있슴다
    Else
        MsgBox "failed in downloading the captcha file."
    End If
End Function

 

3. 다운 받은 이미지 파일을 text 파일로 변환하기

Public Function captchaInterpret(srcFile As String) As Boolean
    Dim tesseract As String, destFile As String
    Dim arg As String, captchaValue As String
 
    tesseract = "C:\Program Files\Tesseract-OCR\tesseract.exe"
    destFile = ThisWorkbook.path & "\captcha\captcha"
    arg = srcFile & " " & destFile & " --oem 1"
 
    'Debug.Print arg
 
    Dim objShell As New Shell32.shell
    'Call objShell.ShellExecute("C:\Program Files\Tesseract-OCR\tesseract.exe", "E:\captcha.png E:\captcha.txt")
    Call objShell.ShellExecute(tesseract, arg)
 
    Open destFile & ".txt" For Input As #1
        Line Input #1, captchaValue
    Close #1
 
    '한 줄을 위에서 읽어 들여 Dictionary에 담아 둔다.
    If dictPost.Exists("captchaValue") Then Call dictPost.Remove("captchaValue")
    dictPost.Add "captchaValue", captchaValue
 
    captchaInterpret = True
End Function

 

위의 소스는 제 프로젝트의 일부분이라, 본인에 맞게 Path라던가, 파일 이름, 출력 방법 등을 수정 하셔야 합니다.

 

결론: Captcha를 판독하는데는 실패 했지만, 다른 이미지로 된 문서를 판독하는데는 매우 훌륭합니다. 따라서 대규모 문서 스캔을 한 이후 이를 텍스트로 변환하는 유로 툴이 없는 경우 훌륭한 대안이 될 것이라 생각합니다.

전체 11

  • 2021-12-01 18:50

    대박자료입니다

    테서렉트를 cmd로 실행할수도 있네요. 라이브러리가 없어도 이런식으로 구현할 수 있다니 놀랍습니다 ㅎㅎ

    이제 실행파일이랑 내부적으로 cmd 실행만 제공되면 여러가지로 활용할 수 있겠네용


  • 2021-12-01 18:54

    대량으로 이미지 텍스트로 변환할 때 매우 유용할 듯 합니다. ^^


  • 2022-01-11 20:31

    감사합니다!


  • 2021-12-29 11:13

    엑셀의 세계란..너무힘드네요 ㅎㅎ 더열심히 공부하겠습니다.


  • 2021-12-06 04:10

    다음에 시간 있으면 한번 연습해봐야겠네요~!ㅎㅎ

    캡챠에는 무용이라는 점이 아쉽지만.. 그래도 무료로 OCR 되는게 어딥니꽈~^^ㅎㅎ


  • 2021-12-14 12:37

    감사합니다.


  • 2021-12-29 15:56

    감사^^


  • 2021-12-29 15:56

    감사^^


  • 2022-01-12 13:23

    감사 합니다.


  • 2021-12-18 20:53

    감사드립니다.


  • 2022-01-20 13:22

    감사합니다.


전체 49
번호 제목 작성자 작성일 추천 조회
알림
하루 딱 "1분", 진짜 쓰는 엑셀 꿀팁 👉 "오빠두엑셀" 인스타그램 오픈! (32)
트로피 오빠두엑셀 | 2021.10.12 | 추천 23 | 조회 836
트로피 오빠두엑셀 2021.10.12 23 836
26273
엑셀 2021, M365 가로스크롤 기능 (3)
더블유에이 | 2022.01.23 | 추천 3 | 조회 68
더블유에이 2022.01.23 3 68
Re:엑셀 2021, M365 가로스크롤 기능
김학동 | 2022.01.23 | 추천 0 | 조회 34
김학동 2022.01.23 0 34
24189
[엑셀 VBA] Snippet - OCR: 이미지 파일을 텍스트 파일로 변환하기 (11)
dra**** | 2021.12.01 | 추천 5 | 조회 369
dra**** 2021.12.01 5 369
23999
[엑셀 VBA] Snippet - Public IP, Local IP, Mac Address 구하기 (5)
dra**** | 2021.11.25 | 추천 2 | 조회 157
dra**** 2021.11.25 2 157
23794
[엑셀 VBA] Snippet - 변수를 clipboard로 복사하기 (5)
dra**** | 2021.11.21 | 추천 2 | 조회 186
dra**** 2021.11.21 2 186
23337
HTML 라이브러리 사용하기 귀찮을 때, 사용하는 파싱함수 (getElementsByTag, getAttribute) (8)
트로피 오빠두엑셀 | 2021.11.09 | 추천 0 | 조회 193
트로피 오빠두엑셀 2021.11.09 0 193
23142
[잡설] 엑셀을 이용한 웹 자동화: SEO 이야기 (13)
dra**** | 2021.11.04 | 추천 3 | 조회 379
dra**** 2021.11.04 3 379
22802
[잡설] 웹 서버에서 내보내는 엑셀 파일 및 데이터 이야기 (6)
dra**** | 2021.10.25 | 추천 0 | 조회 213
dra**** 2021.10.25 0 213
22325
[엑셀 VBA] 파워쿼리 자동화 4. CRUD (5)
dra**** | 2021.10.12 | 추천 1 | 조회 309
dra**** 2021.10.12 1 309
22161
[엑셀 VBA] 파워쿼리 자동화 3. MySQL Class (8)
dra**** | 2021.10.07 | 추천 0 | 조회 310
dra**** 2021.10.07 0 310
21839
[엑셀 VBA] 파워쿼리 자동화 2. 자동화 실습 (10)
dra**** | 2021.09.28 | 추천 0 | 조회 410
dra**** 2021.09.28 0 410
21764
[엑셀 VBA] 개체 Reference - QueryTable Object 첨부파일 (2)
dra**** | 2021.09.26 | 추천 0 | 조회 163
dra**** 2021.09.26 0 163
21675
[엑셀 VBA] 파워쿼리 자동화 1. 자동화 순서 (10)
dra**** | 2021.09.23 | 추천 0 | 조회 757
dra**** 2021.09.23 0 757
21496
[엑셀 VBA] 개체 Reference - ADODB.Recordset : Database 필수 첨부파일 (4)
dra**** | 2021.09.16 | 추천 1 | 조회 262
dra**** 2021.09.16 1 262
21491
[잡설] IT가 흘러가고 있는 방향에 대한 단상 - 무엇을 공부해야 하는가? (24)
dra**** | 2021.09.16 | 추천 5 | 조회 335
dra**** 2021.09.16 5 335
21482
[엑셀 VBA] MySQL 02. Range -> 배열 -> INSERT (5)
dra**** | 2021.09.16 | 추천 0 | 조회 397
dra**** 2021.09.16 0 397
21412
[엑셀 VBA] MySQL 01. 워크시트 Custom Properties 활용하기 (4)
dra**** | 2021.09.14 | 추천 1 | 조회 176
dra**** 2021.09.14 1 176
20740
[엑셀 VBA] 개체 Reference - ListObject Object - [표]가지고 놀기 첨부파일 (13)
dra**** | 2021.08.29 | 추천 4 | 조회 374
dra**** 2021.08.29 4 374
20211
[엑셀 VBA] Windows API - winuser.h : 윈도우즈 프로그램의 핵심 첨부파일 (8)
dra**** | 2021.08.17 | 추천 3 | 조회 322
dra**** 2021.08.17 3 322
20194
[잡설] 엑셀이 웹으로 가야 하는 이유 (31)
dra**** | 2021.08.16 | 추천 17 | 조회 731
dra**** 2021.08.16 17 731
20153
[엑셀 VBA] 개체 Reference - FileSystem Object 첨부파일 (3)
dra**** | 2021.08.15 | 추천 1 | 조회 219
dra**** 2021.08.15 1 219