본문 바로가기
업무자동화/파이썬-아래아한글 자동화 기초

[파이썬-한/글]GetText 사용시 탐색범위 지정하는 방법

by 회사원코딩 2021. 8. 14.
728x90
반응형

질문주신 내용

양동훈 님께서 질문주신 내용

GetText는 한/글 문서 내의 모든 텍스트를 탐색하는 메서드입니다.
사용방법은 ①InitScan으로 초기화하고, ②GetText로 탐색한 후에 ③ReleaseScan으로 종료합니다.
재미있는 점은, 탐색범위 지정이 굉장히 유연한데, InitScan 실행시 optionRange 파라미터를 사용해서 옵션과 탐색범위를 정할 수 있습니다. 예를 들어 본문만, 역순으로, 라인별로 끊어서, 단락기호별로, 블록선택한 범위 내에서, 혹은 커서위치부터 등등 굉장히 유연하며, MovePosSetPos를 사용해서 탐색중인 문단 혹은 글자위치로 캐럿을 옮기는 것도 간편합니다. (어떤 면에서는 찾아바꾸기 액션과 유사해 보이지만,

API매뉴얼 중 InitScan을 찾아보겠습니다. (HwpCtrl API.hwp 95페이지입니다.)

option, Range, (spara, spos, epara, epos) 등 2~6개 파라미터 활용


0x는 파이썬에서 16진수의 정수를 의미하며, 이는 10진수로 변환하여 입력해도 무방합니다.

조금만 더 부연설명을 드리면, option과 Range 파라미터는 더하기 연산으로 조합이 가능합니다.
무슨 뜻이냐면, Range로 범위를 지정할 때 "캐럿 위치부터 문서의 끝까지"로 지정하려면
0x0000 + 0x0007 = 0x0007이므로 Range=0x7이라고 지정하면 됩니다. (정수값을 그대로 입력해도 되고요.)
줄의 시작부터 줄의 끝까지로 지정하려면 0x0020+0x0002 = 0x0022이므로 Range=0x22로 지정하면 되는 거죠.

그러면 동훈님께서 질문 주신 두 가지,
① 페이지 범위 지정 탐색
② 현재 커서 위치 이후로만 탐색

이건 어떻게 옵션을 주면 좋을까요? 둘 다 의외로 간단할 수 있는데,

① 페이지 범위 지정 탐색 방법

커서를 해당 페이지 시작점으로 이동하고 나서 InitScan을 시작하면 됩니다.

# 5페이지로 이동 target_page = 5 hwp.HAction.Run("MoveDocBegin") # 문서 시작으로 이동 for _ in range(target_page-1): hwp.HAction.Run("MovePageDown") # 문서 시작으로 이동 hwp.InitScan(...)

특정 페이지까지만 탐색하는 방법은 대략 이렇습니다.

# 5페이지로 이동 target_page = 5 hwp.HAction.Run("MoveDocBegin") # 문서 시작으로 이동 for _ in range(target_page-1): hwp.HAction.Run("MovePageDown") # 문서 시작으로 이동 # 5~10페이지 탐색 current page = hwp.KeyIndicator()[3] hwp.InitScan(option=0, Range=0x22) while current_page <= 10: text = GetText() # 탐색실시 if text[0] in (0, 1): # 문서끝에 도달한 경우 break # while문 종료 hwp.SetPos(201) # MoveScanPos : GetText() 탐색위치로 커서 이동 current page = hwp.KeyIndicator()[3] # 현재 쪽번호 print(text[1]) # text[1]로 자유롭게 작업 실시

 


donaricano-btn

728x90
반응형

댓글7

  • 심최 2021.12.13 10:03

    안녕하세요 글 잘 보고있습니다. 질문이 있어 이렇게 댓글을 남깁니다.
    오랜만에 한글 자동화 프로그램을 작성하는데 예전에는 InitScan시 option과 Range 파라미터만 적용해도 잘 동작했는데 아래한글 2021버전과 파이썬 3.8.10버전을 사용하는데 InitScan 함수에서 매개변수의 수가 부족하다는 오류가 발생을하고 InitScan(0,0x22,1,1,999,999)이렇게 매개변수를 6개를 넣어줘야 동작을 하는데 혹시 버전마다 동작이 다른가 싶어 질문 올립니다. 혹시 작성자의 파이썬 버전과 win32버전 그리고 한글버전을 알 수 있을까요?
    답글

    • 심최 2021.12.13 10:45

      한글 인스턴스를 생성할 때 dispatch를 사용하는가 gencache.ensuredispatch를 사용하는가에 차이가 있었습니다. InitScan()을 사용할 때 InitScan에 매개변수를 생략하면 InitScan매개변수에 기본값이 들어가는데 그 기본값들이 gencache안에 있어서 gencache를 생성하지 않으면 매개변수의 개수 오류가 발생할 수 밖에 없었습니다. 좋은 글 감사합니다. 공부에 많은 도움이 되는 것 같습니다.

  • 회사원코딩 2021.12.13 10:36 신고

    안녕하세요? 버전마다 동작이 다른 것은 아닌데, 대부분은 EnsureDispatch가 적용되지 않아서 나타나는 현상입니다.

    hwp를 생성할 때 최초 한 번은

    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") 라고 인스턴스화해보시기 바랍니다.

    그 이후부터는 짧게 hwp.Dispatch 로 코딩하셔도 동일하게 매개변수 초기화가 되어 있을 것입니다.

    저는 현재 파이썬3.10, 아래아한글2020, pywin32 최신버전을 사용하고 있습니다.
    답글

    • 심최 2021.12.13 10:47

      ㅠㅠㅠ 해결하고 보다니 빠른 댓글 너무 감사합니다. 하신 말씀대로 해결하였습니다.~ 감사합니다.

  • 백일프로 2022.01.10 15:34 신고

    안녕하세요. 선생님 덕분에 많은걸 보고 배우고 있어 너무 감사합니다.
    다른게 아니고.. 파이썬으로 100페이지 되는 문서안에 표를 자동으로 찾아가서 각 표의 데이터와 해당페이지번호를 데이터프레임으로 담아넣고 사용할려고 하는데... 일주일 넘게 해봐도 도저히 안되네요.. 표를 찾아가기 위해 표 제목을 검색해서 커서를 해당페이지로 이동만 시키면 currentpage로 페이지는 알수 있을거 같은데.. 표제목으로 찾아가는것도 안되지만 파인딩 하니까 표제목이 같은 문자가 (목차, 표 윗줄) 이렇게 자꾸 2개가 나오니까 또 안되는데 혹시 방법이 없을까요?

    젤 좋은건 .. 모든 표와 해당페이지를 데이터프레임으로 담고, 표 제를 따로 추출하는건데... hwp 관련 자료를 봐도 모르겠네요..
    답글

    • 회사원코딩 2022.01.10 16:02 신고

      1. 캐럿이동은

      한 줄에 되지는 않지만, 간단한 편입니다. 표 컨트롤 탐색한 후에 AnchorPos로 좌표 찾아서, MovePos에다 해당 좌표찍으면 그 표 앞으로 캐럿이 옮겨집니다.


      2. 표를 찾아갈 때에는

      문자열로 찾기를 하지 마시고 HeadCtrl에서부터 .Next 메서드로 "tbl"을 찾으시는 걸 추천합니다. API매뉴얼(hwpctrl.hwp)에서 검색해보시면 비슷한 예제도 찾으실 수 있어요.

      3. 말씀하신대로

      모든 표를 df로 담으셔도 괜찮지만, 굳이 나중에 솎아내셔야 한다면 이런 작업이 적절할까 싶네요. 서식이 항상 동일한 경우거나, 표 위치가 바뀌지 않는다든지 하는 조건이 있으면 그걸 이용하는 방법이 제일 효율적인 것 같아요.

      괜찮으시다면 유사한 샘플자료나 구체적인 컨셉만이라도 메일로 보내주시면 한 번 검토해서, 포스팅이나 영상으로 설명드려보고 싶은데 어떠실까요?ㅎ

  • 백일프로 2022.01.14 23:19 신고

    답변 정말 감사드립니다.!! 제가 최근 야근에 찌들려서 감사인사가 늦었습니다. 포스팅이나 영상으로 설명해주신다면 더더욱 감사드려요. 바로 예제 한글파일이랑 구체적인 컨셉 메일로 보내드리겠습니다.~ 코딩이 재미있는데 막히면 한도끝도 없이 막혀버려서... 비전공자인데다가.. 코딩센스가 없는건디 ㅠㅠ . 아무튼 바로 보내드릴께요^^
    답글