먼저, 아래아한글에서 "한글컨트롤", 혹은 "컨트롤"이라 함은, 일반적인 문자열 외에 삽입되는 그림, 표, 벡터이미지, 미주각주나 계산식 등의 "오브젝트"를 뜻하는 용어이며, 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"라는 단어가 들어간다. 문법은 다소 차이가 있지만, 대략의 의미는, 문서에서 최초의 컨트롤을 찾고, (필요하면 해당 위치로 이동하고), 작업 후 다음 컨트롤로 건너뛰는 코드이다.
관련 포스팅(파이썬으로 수식 탐색하는 코드)
논리적으로는 간단한데, 밑바닥부터 구현해놓았기 때문에 부담스러울 만큼 코드가 길다.
한컴에서는 장황한 문법을 단축한 간편메서드인 "액션아이디"를 굉장히 다양하게 제공해 주는데(무려 450여개!)
다행히 컨트롤을 차례대로 선택하는 단축메서드도 제공한다.
바로, SelectCtrlFront와 SelectCtrlReverse다.
액션아이디는 두 종류인데, 파라미터가 필요한 액션, 그리고 파라미터가 필요없는 액션이다.
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여개나 된다.
사실 이 리스트만 틈틈이 읽어도 한/글 자동화 거의 마스터...
오늘 포스팅은 여기서 마친다.
긴 글 읽어주셔서 감사드리며, 행복한 하루 되시길~
국내 유일의 파이썬+한컴오피스 업무자동화 입문강의
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
한/글 2020 최신 업데이트로도 고쳐지지 않은 API버그 (0) | 2021.01.14 |
---|---|
[커뮤니티질문] HWP문서의 특정 셀에 색을 넣고 싶은데요. (3) | 2021.01.09 |
HWP여백조정 후 이미지 너비/높이를 폭에 맞게 일괄조정하는 방법 (8) | 2021.01.07 |
댓글