본문 바로가기
아래아한글 자동화/python+hwp 중급

[4/8] 캐럿을 개체 앞으로 이동하는 방법

by 일코 2022. 10. 25.

이전 포스팅에서 hwp.FindCtrl()을 실행하면

캐럿과 인접한 개체(이미지)가 선택되는 것을 보여드렸습니다.

이 시점부터는 "개체"라는 용어 대신 "컨트롤(Ctrl)"이라는 용어를 사용하겠습니다.
한/글 내부적으로 통용되는 용어이니 익숙해지시길 바랍니다.

그런데, 캐럿을 컨트롤(표, 이미지, 차트 등) 앞으로 옮기려면 어떻게 해야 할까요?

 

모든 컨트롤은 연결되어 있기 때문에

우선 한/글 문서의 모든 컨트롤들은 "linked list"라는 자료형으로 모두 연결되어 있습니다.

그래서, 특정 컨트롤을 선택하려면

문서의 첫 번째 컨트롤인 hwp.HeadCtrl이나

마지막 컨트롤인 hwp.LastCtrl에서부터 시작해서

Next 또는 Prev 명령어로 순차적인 탐색을 해야 합니다.

 

현재 탐색중인 컨트롤의 타입(예를 들어 이미지는 "gso", 표는 "tbl" 등)을 알려주는 명령어는

CtrlID(영문코드) 또는 UserDesc(한글)입니다.

 

이해를 돕기 위해

코드를 한 번 실행해보겠습니다.

구역, 쪽번호 위치가 정의된 후에

표-그림-그림 - 표-그림-그림 - 표-그림-그림 순서로

컨트롤이 이어져 있습니다.

 

현재 탐색중인 컨트롤로 캐럿을 옮기려면

현재 탐색중인 컨트롤로 캐럿을 옮기기 위해서는

hwp.SetPosBySet(ctrl.GetAnchorPos(0)) 라는 메서드를 실행하면 됩니다.

hwp.GetAnchorPos 메서드는 현재 컨트롤의 좌표정보를 가진 객체를 리턴해주고
hwp.SetPosBySet 메서드는 위 객체를 통해 해당 좌표로 이동해주는 메서드입니다.
(참고로 hwp.GetAnchorPos(0)의 0은 "바로 상위 리스트에서의 앵커포지션을 리턴하라"는 파라미터입니다.)

 

이해를 돕기 위해 코드 실행화면을

이해를 돕기 위해 코드 실행화면을 보여드리겠습니다.

 

정리하자면

1. 파이썬의 while문으로 hwp.HeadCtrl에서부터 Next 명령어를 통해 컨트롤을 탐색하다가

2. 파이썬의 if문으로 ctrl.CtrlID"gso"이거나, ctrl.UserDesc"그림"인 경우에만

3. hwp.SetPosBySet(hwp.GetAnchorPos(0)) 명령어로 캐럿을 그림 앞으로 옮긴 후

4. hwp.FindCtrl()을 실행

5. 그림추출(경로) 메서드 실행  # 이전 포스팅에서 정의함

 

이 과정을 실행하면 문서에 삽입된 모든 그림이 이미지파일로 저장되겠습니다.

 

여기까지 짚어본 코드의 흐름은 대략 아래와 같습니다.

(실행되는 코드는 아닙니다. 경로명이 아직 정의되지 않았기 때문입니다.)

ctrl = hwp.HeadCtrl
while ctrl != None:
    if ctrl.UserDesc == "그림":
        hwp.SetPosBySet(hwp.GetAnchorPos(0))
        hwp.FindCtrl()
        그림추출(경로명)
    ctrl = ctrl.Next
마지막 컨트롤까지 탐색한 이후에는 ctrl == None이 되므로 
while문이 종료됩니다.

 

여기까지 따라오시느라 수고하셨습니다.

이 튜토리얼도 슬슬 중반부로 접어듭니다.

여기서부터는

 

1. 문단제목과 위치를 추출해서

2. 하위폴더를 만들어 두고

3. 각 이미지가 어느 문단에 속해 있는지 파악해서

4. 이미지를 저장할 경로와 파일명을 결정한 후

5. 그림추출(경로명) 메서드로 이미지를 저장

 

하는 과정을 이어서 진행해보겠습니다.

댓글