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

[인프런QnA] 개체 여백 조정 방법

by 일코 2023. 3. 30.
표 혹은 그림이든 개체 여백조정을 하고자 합니다.
매크로정의하고 코드편집에 따라서 해보았는데요 잘 동작하지 않네요..ㅠㅠ
아래는 개체 바깥 여백조정을 위한 함수를 만들어 본 예제입니다. 바깥 윗여백만 조정하는 것으로 했습니다.

#######################
def Change_Object_Blank():
    hwp.HAction.GetDefault("CellBorderFill", hwp.HParameterSet.HCellBorderFill.HSet)
    hwp.HParameterSet.HCellBorderFill.Hset.SetItem("ApplyTo", 1)
    hwp.HAction.Execute("CellBorderFill", hwp.HParameterSet.HCellBorderFill.HSet)
    hwp.HAction.GetDefault("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
    hwp.HParameterSet.HShapeObject.OutsideMarginTop = hwp.MiliToHwpUnit(0.0)
    hwp.HParameterSet.HShapeObject.Hset.SetItem("ShapeType", 6)
    hwp.HAction.Execute("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
    return

 

1. 완성된 (수정한) 코드를 먼저 보여드리겠습니다.

def top_margin_to(margin: float) -> bool:
    """
    표 상단 바깥 여백을 조절합니다.
    """
    shape_object = hwp.HParameterSet.HShapeObject
    hwp.HAction.GetDefault("TablePropertyDialog", shape_object.HSet)
    shape_object.OutsideMarginTop = hwp.MiliToHwpUnit(margin)
    return hwp.HAction.Execute("TablePropertyDialog", shape_object.HSet)

 

2. 실행화면은 아래와 같습니다.

이미지를 클릭하시면 크게 볼 수 있습니다.

 

3. 위 코드가 만들어지기까지의 과정을 보여드리겠습니다.

 

3-1. 매크로 녹화를 합니다.

function OnScriptMacro_중국어1성()
{
	FindCtrl();
	HAction.GetDefault("CellBorderFill", HParameterSet.HCellBorderFill.HSet);
	with (HParameterSet.HCellBorderFill)
	{
		HSet.SetItem("ApplyTo", 1);
	}
	HAction.Execute("CellBorderFill", HParameterSet.HCellBorderFill.HSet);
	HAction.GetDefault("TablePropertyDialog", HParameterSet.HShapeObject.HSet);
	with (HParameterSet.HShapeObject)
	{
		OutsideMarginTop = MiliToHwpUnit(10.0);
		HSet.SetItem("ShapeType", 6);
	}
	HAction.Execute("TablePropertyDialog", HParameterSet.HShapeObject.HSet);
}

 

3-2. 녹화한 매크로를 파이참에 붙여넣고,
     불필요해 보이는 라인은 제거합니다.

hwp.HAction.GetDefault("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
hwp.HParameterSet.HShapeObject.OutsideMarginTop = hwp.MiliToHwpUnit(10.0)
hwp.HAction.Execute("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet)

 

3.3. 위 코드를 실행해봅니다.

음...? 여백이 바뀌지 않는데요?

실행이 안 되는 이유는, 현재 표가 선택되어 있지 않기 때문입니다.
hwp.FindCtrl() 을 실행해서 표를 선택한 후 다시 실행해봅니다.

이번엔 실행은 잘 된 것 같은데, 마지막에 오류메시지가 뜨네요?

"서버에서 예외 오류가 발생했습니다." 라고 출력됩니다.
해결방법은 의외로 간단한데,
hwp.HParameterSet.HShapeObject를 변수로 먼저 지정해주면
서버에서 예외오류가 발생하지 않습니다.
(아마도 해당 HSet에 접근할 때마다 메모리 주소가 바뀌어서? 그러는 것으로 추측해봅니다.)
위 내용을 코드에 반영해봅시다.

shape_object = hwp.HParameterSet.HShapeObject라고 먼저 정의한 후
아래 hwp.HParameterSet.HShapeObject 부분을 모두 shape_object로 바꾸어줍니다.

hwp.FindCtrl()
shape_object = hwp.HParameterSet.HShapeObject
hwp.HAction.GetDefault("TablePropertyDialog", shape_object.HSet)
shape_object.OutsideMarginTop = hwp.MiliToHwpUnit(0.0)
hwp.HAction.Execute("TablePropertyDialog", shape_object.HSet)

다행히 이젠 오류메시지가 나타나지 않네요.

 

3.4. 그럼 위 코드를 함수로 만들어보겠습니다.

위 코드를 실행하기 쉽게 함수로 짜 보겠습니다.
단, hwp.FindCtrl() 메서드는 여백조정과 무관할 수 있으므로
함수 밖으로 빼는 게 좋겠습니다.

그리고 마지막 라인 hwp.HAction.Execute()
해당 액션이 성공적으로 실행된 경우 True를 리턴하고, 실패시 False를 리턴하므로
함수의 return 문으로 활용하겠습니다.

간단한 타입힌트도 적용해보았습니다.

이렇게 함수 작성을 마쳤습니다. 잘 실행되네요^^
(완성된 코드와 실행결과는 포스팅 맨 위에 있습니다.)

마치며

다소 복잡해 보이는 과정이지만,
아래아한글 특유의 "액션 지향 프로그래밍"을 반복연습하시면서
과정에 조금만 익숙해지시면
아래아한글에서 제공하는 대부분의 액션 실행과정이나 문제해결 과정이 비슷비슷하니까
금방 자유자재로 다루실 수 있게 될 겁니다^^

그럼 이번 포스팅은 여기서 마치겠습니다.
행복한 하루 되세요!!ㅎ

https://inf.run/omqm

 

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

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

www.inflearn.com

 

댓글