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

문서 안의 컨트롤을 차례대로 선택하는 가장 간편한 방법

by 일코 2021. 1. 13.

먼저, 아래아한글에서 "한글컨트롤", 혹은 "컨트롤"이라 함은, 일반적인 문자열 외에 삽입되는 그림, 표, 벡터이미지, 미주각주나 계산식 등의 "오브젝트"를 뜻하는 용어이며, API매뉴얼 예제에 컨트롤을 선택하는 예제코드가 몇 개 들어있다.

정확히 의미를 몰라도 되니, 아래 코드를 가볍게 한 번 읽어보자. 

1. Visual Basic으로 문서 중의 각주를 카운트하는 코드

Dim ctrlcode As CtrlCode
cnt = 0
Set ctrlcode = HwpCtrl.HeadCtrl
While Not ctrl Is Nothing
    If ctrlcode.CtrlID = "fn" Then
        cnt = cnt + 1
    End If
    Set ctrlcode = ctrlcode.Next
Wend
MsgBox cnt

2. Visual Basic으로 문서 중의 모든 표를 삭제하는 코드

Dim ctrl As ctrl
Dim nxtctrl As ctrl
Set ctrl = HwpCtrl.HeadCtrl
While Not ctrl Is Nothing
    Set nxtctrl = ctrl.Next
    If ctrl.CtrlID = "tbl" Then
    HwpCtrl.DeleteCtrl ctrl
    End If
    Set ctrl = nxtctrl
Wend 

3. C++로 그리기 개체를 찾아서 그 위치로 이동하는 코드

void FindCtrl()
{
	DHwpCtrlCode code = m_cHwpCtrl.GetHeadCtrl();
	DHwpParameterSet paramSet;
	VARIANT list, para, pos;
	while (code && code != m_cHwpCtrl.GetLastCtrl()) {
		CString strID = code.GetCtrlid();
		if (strcmp(strID, _T("gso")) == 0) {
			paramSet = code.GetAnchorPos(0);
			list = paramSet.Item("List");
			para  = paramSet.Item("Para");
			pos  = paramSet.Item("Pos");

			m_cHwpCtrl.SetPos(list.lVal, para.lVal, pos.lVal);
			break;
		}
		code = code.GetNext();
	}
}

자세히 보면 두 코드 모두 "HeadCtrl"이라는 단어와 "Next"라는 단어가 들어간다. 문법은 다소 차이가 있지만, 대략의 의미는, 문서에서 최초의 컨트롤을 찾고, (필요하면 해당 위치로 이동하고), 작업 후 다음 컨트롤로 건너뛰는 코드이다.


관련 포스팅(파이썬으로 수식 탐색하는 코드)

 

[3/5, HwpEqn] 컨트롤 탐색방법(feat. 파이썬)

지난 포스팅은... [2/5, HwpEqn] HWP문서 수식을 텍스트로 추출하는 방법 (1) 안녕하세요 ~ 저는 유튜브 회사원코딩 구독자입니다. 올려주신 영상들 잘 시청하고 있습니다. 문의드릴 사항으로는 한글

www.martinii.fun


논리적으로는 간단한데, 밑바닥부터 구현해놓았기 때문에 부담스러울 만큼 코드가 길다.
한컴에서는 장황한 문법을 단축한 간편메서드인 "액션아이디"를 굉장히 다양하게 제공해 주는데(무려 450여개!)
다행히 컨트롤을 차례대로 선택하는 단축메서드도 제공한다.
바로, SelectCtrlFrontSelectCtrlReverse다.
액션아이디는 두 종류인데, 파라미터가 필요한 액션, 그리고 파라미터가 필요없는 액션이다.
SelectCtrlFront도 파라미터가 필요없는 액션이며, 이런 메서드 실행시에는 한 줄이면 된다. 바로,

hwp.Run("SelectCtrlFront")

위처럼 Run 메서드 안에 문자열로 액션아이디를 입력하고 실행하면 된다. 엄청 간단하다~ 오예!!

그럼 위 메서드를 이용하면 얼마나 코드가 간단명료해지는지 한 번 예를 들어보자.
아래는 표와 그림이 섞인 한/글 문서이다. 두 번째 컨트롤만 그림이다.
이 문서를 대상으로 "표만 전부 삭제"하는 코드를 살펴보자.

 

 


아래 코드는 문서 내 모든 표를 찾아서 지우는 파이썬 코드이다.

# 모든 표 찾아 지우기
ctrl = hwp.HeadCtrl
while ctrl != None:
    try:
        nextctrl = ctrl.Next
    except com_error:  # 지우는 표 안에 누름틀이 한 개 이상 있는 경우 오류 발생
        sleep(1)
        nextctrl = ctrl.Next
    if ctrl.CtrlID == "tbl":  # 표의 컨트롤아이디
        hwp.DeleteCtrl(ctrl)
    ctrl = nextctrl

 

위의 코드를 액션아이디 기반으로 바꾸면 아래와 같다. 경미하지만 코드가 직관적으로 바뀌는 느낌이다.

 

hwp.Run("MoveDocBegin")
hwp.Run("SelectCtrlFront")
while True:
    현재위치 = hwp.KeyIndicator()
    if 현재위치[-1] == "표":
        hwp.Run("Delete")
    hwp.Run("SelectCtrlFront")
    나중위치 = hwp.KeyIndicator()
    if 나중위치 == 현재위치:
        break


문서 규모를 대략 알고, 커서를 문서시작으로 옮겨놓았다는 가정하에
while문 대신 for문으로 꼼수(?)를 쓰면,

for i in range(100):
    hwp.Run("SelectCtrlFront")
    if hwp.KeyIndicator()[-1] == "표": hwp.Run("Delete")

코드를 이렇게 줄일 수도 있다.
아래는 시연화면이다.

 

 

모든 컨트롤을 탐색하면서 표만 찾아서 삭제하는 코드 실행화면(클릭)

 

모든 표가 삭제되고 이미지만 남은 것을 확인할 수 있다.


정리하면

헤드컨트롤을 변수로 저장하고, 컨트롤.Next 를 사용해서 전방으로 컨트롤을 순회하는 긴 코드를 

hwp.Run("SelectCtrlFront") 한 줄로 실행할 수 있게 한컴에서 단축메서드를 제공하고 있고,

그런 한줄 단축메서드가 약 450여개나 된다.

사실 이 리스트만 틈틈이 읽어도 한/글 자동화 거의 마스터...

 

오늘 포스팅은 여기서 마친다.

긴 글 읽어주셔서 감사드리며, 행복한 하루 되시길~

 


국내 유일의 파이썬+한컴오피스 업무자동화 입문강의

 

움짤로 빠르게 배우는 파이썬-아래아한글 자동화 레시피 - 인프런 | 강의

파이썬으로 아래아한글을 다루는 짧은 예제코드들을 소개하고, 중간중간의 결과를 GIF로 보여드립니다. 동영상 강의가 아니지만 오히려 빠르게 배울 수 있고, 따라하기도 쉽습니다., - 강의 소개

www.inflearn.com

 

댓글