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

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

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

스크랩
공유
회원등급 : 29레벨
포인트 : 4348 EP
전체 28

  • 2022-07-09 01:24

    @dra**** 님 captcha가 막는 대상이 봇이라 문자만 있는 captcha라고 해도 ocr로는 뚫기가 어렵겠죠.. 하지만 이 코드는 매우매우 유용합니다 shell을 응용하면 다른 exe에도 적용할 수 있을듯


  • 2021-12-01 18:50

    @dra**** 님 대박자료입니다

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

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


  • 2021-12-01 18:54

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


  • 2022-02-25 21:30

    @dra**** 님 하나도 모르겠어요..ㅜㅜ 코딩 언어인가요?


  • 2022-01-11 20:31

    @dra**** 님 감사합니다!


  • 2022-07-28 16:21

    @dra**** 님 유용하게 사용하겠습니다.
    이미지 다운로드 하지 않고도 이미지 소스를 tesseract 에 바로 넣어도 잘 작동하네요^^
    좋은 정보 감사합니다~!


  • 2022-09-18 15:22

    @dra**** 님 굿굿 고맙습니다


  • 2022-03-16 21:50

    @dra**** 님 오! 한번 해보고 싶어요


  • 2022-06-30 09:56

    @dra**** 님 감사합니다.


  • 2023-04-26 17:52

    @dra**** 님 감사합니다.


  • 2021-12-29 11:13

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


  • 2021-12-06 04:10

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

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


  • 2023-03-28 16:28

    @dra**** 님 어려운 부분이고 취약한 곳이지만 열공모드 진입합니다.


  • 2021-12-14 12:37

    @dra**** 님 감사합니다.


  • 2021-12-29 15:56

    @dra**** 님 감사^^


  • 2022-07-18 14:53

    @dra**** 님 좋은 정보 감사합니다!


  • 2021-12-29 15:56

    @dra**** 님 감사^^


  • 2022-07-18 14:53

    @dra**** 님 좋은 정보 감사합니다!


  • 2023-01-13 09:18

    @dra**** 님 좋은 정보 감사합니다.


  • 2022-01-12 13:23

    @dra**** 님 감사 합니다.


  • 2022-06-24 00:15

    @dra**** 님 역시 엑셀의 세계는 심오하군요... ㅠ_ㅜ


  • 2022-06-30 03:17

    @dra**** 님 이건 뭐죠?


  • 2021-12-18 20:53

    @dra**** 님 감사드립니다.


  • 2022-06-06 15:04

    @dra**** 님 감사합니다.


  • 2022-02-12 17:18

    @dra**** 님 엑셀로..ㅎㄷㄷ


  • 2022-02-26 19:00

    @dra**** 님 와우....정말 감사합니다.


  • 2022-01-20 13:22

    @dra**** 님 감사합니다.


  • 2022-02-15 22:01

    @dra**** 님 감사합니다~^^


전체 74
번호 제목 작성자 작성일 추천 조회
알림
[📚교재 출간 안내] 「진짜쓰는 실무엑셀」 , 드디어 출간되었습니다! (179)
오빠두엑셀 | 2022.02.03 | 추천 469 | 조회 184708
오빠두엑셀 2022.02.03 469 184708
공지사항
[VBA] 구하라 그러면 주어질 것이다. - VBA 마스터 E-Book (영문판) 첨부파일 (13)
dra**** | 2022.07.19 | 추천 10 | 조회 771
dra**** 2022.07.19 10 771
45662
선택된 범위 정렬 단축키 (20)
Denise | 2022.12.15 | 추천 5 | 조회 521
Denise 2022.12.15 5 521
44293
[엑셀 VBA] 예약 DB - 9. 시트의 바우처&견적서 양식에 데이터 뿌리기 (15)
dra**** | 2022.11.11 | 추천 4 | 조회 888
dra**** 2022.11.11 4 888
Re:[엑셀 VBA] 예약 DB - 9. 시트의 바우처&견적서 양식에 데이터 뿌리기
blue_0313 | 2023.03.21 | 추천 0 | 조회 69
blue_0313 2023.03.21 0 69
44227
[엑셀 VBA] 예약 DB - 8. Listbox 와 폼 컨트롤 연동하고 DB로 보내기 (1)
dra**** | 2022.11.09 | 추천 3 | 조회 566
dra**** 2022.11.09 3 566
44219
[엑셀 VBA] 예약 DB - 7. MySQL 클래스와 사용법 (3)
dra**** | 2022.11.09 | 추천 2 | 조회 513
dra**** 2022.11.09 2 513
43438
[엑셀 VBA] 예약 DB - 6. 폼 콘트롤과 DB 필드명 일치시키기
dra**** | 2022.10.21 | 추천 2 | 조회 310
dra**** 2022.10.21 2 310
43292
[엑셀 VBA] 예약 DB - 5. makeSQL() 함수 - INSERT, UPDATE문 자동 생성 (7)
dra**** | 2022.10.18 | 추천 3 | 조회 532
dra**** 2022.10.18 3 532
43091
[엑셀 VBA] 예약 DB - 4. 표 가지고 놀기 (17)
dra**** | 2022.10.13 | 추천 1 | 조회 694
dra**** 2022.10.13 1 694
43017
[엑셀 VBA] 예약 DB -3. 표(테이블, ListObject)을 사용해야 하는 이유1 (15)
dra**** | 2022.10.11 | 추천 2 | 조회 578
dra**** 2022.10.11 2 578
42998
[잡설] 엑셀이 웹으로 가야하는 이유2 (11)
dra**** | 2022.10.10 | 추천 5 | 조회 826
dra**** 2022.10.10 5 826
Re:[잡설] 엑셀이 웹으로 가야하는 이유2
tin | 2023.01.12 | 추천 0 | 조회 161
tin 2023.01.12 0 161
42982
[엑셀 VBA] 예약 DB - 2. 다시 웹으로 - Access에서 MySQL로 데이터 이식
dra**** | 2022.10.10 | 추천 2 | 조회 394
dra**** 2022.10.10 2 394
40590
[엑셀 VBA] 예약 DB - 1. 엑세스, SQL, Recordset, ListObject 의 상관 관계 (9)
dra**** | 2022.07.29 | 추천 3 | 조회 673
dra**** 2022.07.29 3 673
Re:[엑셀 VBA] 예약 DB - 1. 엑세스, SQL, Recordset, ListObject 의 상관 관계
tin | 2023.01.12 | 추천 0 | 조회 107
tin 2023.01.12 0 107
40511
[잡설] 엑셀의 꽃 파워 쿼리를 버리다. (5)
dra**** | 2022.07.29 | 추천 5 | 조회 1151
dra**** 2022.07.29 5 1151
40321
[경험담..해결했습니다.] &H80004005(-2147467259)시스템오류 (4)
티엠프이 | 2022.07.25 | 추천 2 | 조회 730
티엠프이 2022.07.25 2 730
40074
M365 업데이트 이후 발생하는 H80004005 (-2147467259) 자동화 오류 해결방법
오빠두엑셀 | 2022.07.23 | 추천 1 | 조회 511
오빠두엑셀 2022.07.23 1 511
39608
엑셀 그래프에 관한 유튜브 채널정보 입니다. (16)
레몬네이드 | 2022.07.15 | 추천 0 | 조회 394
레몬네이드 2022.07.15 - 394
36473
[엑셀VBA] 시트 이름을 변수로 설정하고 싶을때 간단한 방법 (3)
알파고 | 2022.06.27 | 추천 2 | 조회 1705
알파고 2022.06.27 2 1705
35196
Print_Area 동적 인쇄 영역설정 첨부파일 (7)
sean | 2022.06.21 | 추천 4 | 조회 1796
sean 2022.06.21 4 1796
34607
셀레니움으로 개별공시지가 조회 첨부파일 (5)
나야 | 2022.06.02 | 추천 2 | 조회 451
나야 2022.06.02 2 451
26273
엑셀 2021, M365 가로스크롤 기능 (39)
더블유에이 | 2022.01.23 | 추천 17 | 조회 1294
더블유에이 2022.01.23 17 1294
Re:엑셀 2021, M365 가로스크롤 기능
김학동 | 2022.01.23 | 추천 1 | 조회 351
김학동 2022.01.23 1 351
Re:엑셀 2021, M365 가로스크롤 기능
김동희 | 2022.05.30 | 추천 0 | 조회 200
김동희 2022.05.30 0 200
24189
[엑셀 VBA] Snippet - OCR: 이미지 파일을 텍스트 파일로 변환하기 (28)
dra**** | 2021.12.01 | 추천 8 | 조회 3509
dra**** 2021.12.01 8 3509
Re:[엑셀 VBA] Snippet - OCR: 이미지 파일을 텍스트 파일로 변환하기
tin | 2023.01.12 | 추천 0 | 조회 90
tin 2023.01.12 0 90