이번 포스팅에서는 모든 표들의 캡션 텍스트 또는 서식을 파이썬으로 일괄 수정하는 방법을 알려드리겠습니다.
예제는 다소 간단하게,
아래처럼 표 하단 좌측으로 정렬되어 있는 캡션을
아래처럼 상단 중앙으로 옮기는 코드입니다.
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을 리턴함)
이렇게 업무자동화 코드를 짜시면서도 스크립트 매크로 녹화 후 조금씩 수정하여 사용하면
빠르고 쾌적한 자동화 작업 하실 수 있을 것입니다.
그럼 이번 포스팅은 여기서 마칩니다.
행복한 하루 되세요!
국내 유일의 파이썬+한컴오피스 업무자동화 입문강의
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
[QnA] 그림개체의 개체설명문 가져오기 (0) | 2022.12.10 |
---|---|
[QnA] 표 너비 조절이 되지 않습니다. (0) | 2022.12.09 |
[HDMI] 최종화 : 취합문서 스타일 교정 (1) | 2022.12.08 |
댓글