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

hwp 표 캡션 서식 일괄 수정하기

by 일코 2022. 12. 9.
반응형

이번 포스팅에서는 모든 표들의 캡션 텍스트 또는 서식을 파이썬으로 일괄 수정하는 방법을 알려드리겠습니다.

예제는 다소 간단하게,

아래처럼 표 하단 좌측으로 정렬되어 있는 캡션을

아래처럼 상단 중앙으로 옮기는 코드입니다.

hwp문서 안에서 표 캡션을 수정하려면 다소 번거롭습니다.
대부분은 직접 마우스로 클릭하실 거고, (저도 그렇습니다)
실수로 표 옆이나 표 안에서 Ctrl-N-C 같은 단축키를 누르면
캡션이 없어져버리기 일쑤입니다ㅜ
특히 보고서나 논문(논문을 hwp로 작성하시는 분들이 많지는 않겠지만..) 작성시에는
분량이 큰 경우가 많은데,
표의 갯수가 어마어마할 때도 있지요.

 

샘플 문서를 하나 만듭시다.

빈 문서에다 표를 임의로 세 개만 만들겠습니다. (단축키는 Ctrl - New-Table)

여러분은 상상력을 발휘해서 보고서 안에 표가 백 개쯤 있다고 가정해주시면 됩니다.

 

각각의 표에 캡션을 임의로 달겠습니다.

(단축키는 표 근처나 안에서 Ctrl - New-Caption)

 

이렇게 문서를 완성한 후 바탕화면에 "캡션.hwpx"로 저장하고 문서를 닫습니다.

hwp로 저장하셔도 무방합니다. 저는 오늘 한/글2022를 구매해서 설치한 기념으로 오늘부터 hwpx를 사용할 예정입니다.

 

이제 파이참을 열어서 차근차근 문제해결을 해 봅시다.

1. 파이썬으로 한/글을 열고 캡션.hwpx 파일을 불러옵니다.

 

2. 첫 번째 표 안이나 근처로 커서를 옮겨놓습니다.

(이 수작업 부분은 조금 나중에 코드로 변환할 예정입니다.)

 

3. 아래 코드를 실행하면 하단에 있던 캡션이 상단으로 이동합니다.

act = "TablePropertyDialog"
shape_object = hwp.HParameterSet.HShapeObject 
hwp.HAction.GetDefault(act, shape_object.HSet)
shape_object.ShapeCaption.Side = hwp.SideType("Top")
hwp.HAction.Execute(act, shape_object.HSet)

움짤을 보시면 SideType 안에 들어가는 문자열 인자값에 따라 캡션이 좌우상하로 옮겨집니다.

hwp.SideType("Left") 는 단순히 0을 리턴하므로, 위 코드에 0을 직접 입력해도 무방합니다.

그리고 "Right", "Top", "Bottom" 을 입력했을 때의 정수값은 각각 1, 2, 3입니다.

다섯 줄 밖에 아닌 코드지만,
처음 액션 관련 코드를 보시는 분들은 좀 어렵게 느껴지실 겁니다.
저런 코드는 대부분 외워서 만드는 게 아니라, 스크립트매크로녹화 에서 따오는 겁니다.
한/글 스크립트매크로로 "캡션 옮기기" 과정을 녹화한 후에,
우리가 원하는 액션과 상관없는 라인을 모두 지우고 나서
파이썬 문법에 맞게 조금만 가공한 결과물입니다.
포스팅 마지막에 부록으로 위 코드를 녹화하고 가공하는 과정을 다시 보여드리겠습니다.

 

4. 좌측정렬된 캡션을 중앙으로 옮기겠습니다.

캡션의 정렬상태를 바꾸려면 캡션에 직접 들어가야 합니다.

그런데 캡션에 접근하는 메서드가 따로 존재하지 않습니다.

대신 두 가지 대안이 있는데,

1. (모든 표의 캡션에 표번호가 있는 경우) 캡션 안의 표번호 컨트롤을 이용해 접근하는 방법이고

2. (표번호를 쓰지 않는 경우) "캡션 스타일 찾기"를 이용해 접근하는 방법입니다.

이 포스팅에서는 첫 번째 방법을 사용하겠습니다.

위에서 수작업으로 직접 표 안에 들어갔는데,

표번호 컨트롤로 이동하는 방법을 사용하면 단번에 캡션에 접근할 수 있게 됩니다.

코드는 아래와 같습니다.

ctrl = hwp.HeadCtrl
while ctrl:
    if ctrl.UserDesc == "번호 넣기":
        hwp.SetPosBySet(ctrl.GetAnchorPos(0))
        hwp.HAction.Run("ParagraphShapeAlignCenter")
    ctrl = ctrl.Next

위 코드가 가장 대표적인 컨트롤 찾아가기 방법입니다.

다섯 번째 줄이 "가운데정렬" 액션을 실행합니다.

실행해보면

짜잔! 의도한 대로 잘 변경되었습니다.

그럼 위에서 보여드린 코드들을 정리해서 각각 함수로 묶어보겠습니다.

import win32com.client as win32


def 한글_시작():
    hwp_app = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    hwp_app.XHwpWindows.Item(0).Visible = True
    hwp_app.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    return hwp_app


def 한글_불러오기():
    # hwp.Open(r"C:\Users\smj02\Desktop\캡션.hwpx")
    hwp.Run("FileOpen")


def 현재컨트롤로_찾아가기(ctrl):
    hwp.SetPosBySet(ctrl.GetAnchorPos(0))


def 캡션_상단으로_옮기기(side_type="Top"):
    act = "TablePropertyDialog"
    shape_object = hwp.HParameterSet.HShapeObject
    hwp.HAction.GetDefault(act, shape_object.HSet)
    shape_object.ShapeCaption.Side = hwp.SideType(side_type)
    hwp.HAction.Execute(act, shape_object.HSet)


def 중앙정렬():
    hwp.HAction.Run("ParagraphShapeAlignCenter")


def 캡션에_함수_적용(함수리스트):
    ctrl = hwp.HeadCtrl
    while ctrl:
        if ctrl.UserDesc == "번호 넣기":
            현재컨트롤로_찾아가기(ctrl)
            for 함수 in 함수리스트:
                함수()
        ctrl = ctrl.Next


if __name__ == '__main__':
    hwp = 한글_시작()
    한글_불러오기()
    캡션에_함수_적용([캡션_상단으로_옮기기, 중앙정렬])

 

코드가 제법 깔끔해졌네요.

이번 포스팅은 여기서 마칩니다.

 

부록 : 스크립트 매크로 파이썬으로 옮기기

부록으로 스크립트 매크로 녹화 코드를 파이썬으로 옮기는 과정을 천천히 보여드리겠습니다.

보여드릴 과정은 캡션을 상단으로 옮기기입니다.

1. 스크립트매크로를 녹화합니다. (Shift-Alt-H)

2. 녹화한 코드를 열어서 파이참 에디터에 붙여넣습니다.

녹화한 코드는 아래와 같습니다.

function OnScriptMacro_임시녹화용()
{
	FindCtrl();  # 컨트롤을 선택하는 메서드. 삭제할 것.
	HAction.GetDefault("TablePropertyDialog", HParameterSet.HShapeObject.HSet);  # 액션 정의하는 라인
	with (HParameterSet.HShapeObject.)
	{
		HSet.SetItem("ShapeType", 3);  # 표에 관련한 다이얼로그를 선택하는 코드. 삭제.
		ShapeCaption.Side = SideType("Top");  # 필요한 라인
		HSet.SetItem("ShapeCellSize", 0);  # 여백관련 코드. 삭제.
	}
	HAction.Execute("TablePropertyDialog", HParameterSet.HShapeObject.HSet);  # 설정한 대로 액션 실행
}

3. with문을 삭제합니다.

with문은 파이썬에서 쓰이지 않는 문법입니다.

(with 뒤 괄호 안에 있는 코드가 대괄호 안의 모든 라인 앞에 붙습니다.)

코드 중 아래 부분을

~
	with (HParameterSet.HShapeObject)
	{
		HSet.SetItem("ShapeType", 3);
		ShapeCaption.Side = SideType("Top");
		HSet.SetItem("ShapeCellSize", 0);
	}
~

아래처럼 바꿔주면 됩니다. (불필요한 들여쓰기도 모두 삭제했습니다.)

HParameterSet.HShapeObject.HSet.SetItem("ShapeType", 3);
HParameterSet.HShapeObject.ShapeCaption.Side = SideType("Top");
HParameterSet.HShapeObject.HSet.SetItem("ShapeCellSize", 0);

 

4. 나머지 서식 정리

들여쓰기 없애고, 세미콜론 지우고, 모든 프로퍼티 변수 앞에 "hwp." 붙이기 등

대략 아래와 같은 코드가 만들어졌습니다. 이렇게 실행해도 정상적으로 작동합니다.

hwp.HAction.GetDefault("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
hwp.HParameterSet.HShapeObject.ShapeCaption.Side = hwp.SideType("Top")
hwp.HAction.Execute("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)

 

5. 변경이 아니라, 현재 캡션의 위치를 알 수는 없을까요?

아래처럼 파라미터셋을 먼저 변수로 지정한 후에 GetDefaut를 하시고 나 서

파라미터셋의 아이템을 조회하시면 됩니다.

코드로 보여드리면, 아래는 수정 전의 코드이고

hwp.HAction.GetDefault("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
hwp.HParameterSet.HShapeObject.ShapeCaption.Side = hwp.SideType("Top")
hwp.HAction.Execute("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)

아래는 수정 후의 코드입니다.

shape_object = hwp.HParameterSet.HShapeObject
hwp.HAction.GetDefault("TablePropertyDialog", shape_object.HSet)
shape_object.ShapeCaption.Side = hwp.SideType("Top")
hwp.HAction.Execute("TablePropertyDialog", shape_object.HSet)

콘솔에서도 한 번 실행해보겠습니다.

현재 문서에 설정된 값을 잘 출력해주었습니다.

(캡션이 위에 있을 때는 2를, 아래에 있을 때는 3을 리턴함)

이렇게 업무자동화 코드를 짜시면서도 스크립트 매크로 녹화 후 조금씩 수정하여 사용하면

빠르고 쾌적한 자동화 작업 하실 수 있을 것입니다.

 

그럼 이번 포스팅은 여기서 마칩니다.

행복한 하루 되세요!

 

반응형

댓글0