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

[인프런 QnA] 용지설정 관련 질문입니다!

by 일코 2024. 1. 5.
감사히 잘 활용하는 중에 질문이 있어서 글을 남깁니다
제가 용지 설정(F7)의 좌우 여백을 15mm로 설정하고자 문서를 찾기 시작했습니다.

제가 찾은 것은 다음과 같습니다.

ActionTable : PageSetup - 편집용지 ParameterSet ID = SecDef ParameterSet Table 의 SecDef를 확인하니 Item이 PageDef로 SubType을 지정하도록 합니다. 따라서 PageDef를 찾은 결과 LeftMargin과 RightMargin을 찾을 수 있었습니다.

SecDef를 넣어도 PageDef를 넣어도 에러가 발생합니다.
혹시 SecDef의 SubType를 PageDef로
지정하는 방법이 따로 존재하는 것인지 질문드립니다.

여기서 제가 사용한 코드는 다음과 같습니다.

act = hwp.CreateAction("PageSetup")
pset = act.PageDef.CreateSet()
pset.SetItem("LeftMargin", 15)
pset.SetItem("RightMargin", 15)
act.Execute(pset)

오늘 남겨주신 질문인데요.

한/글 오토메이션 API는
역사가 길어서 그런지, 개발자가 많이 거쳐가서 그런지
동일한 액션을 수행하는 여러 가지 방법이 있습니다.
그 중 세 가지만 소개해드리려고 하는데,
마지막 방법을 가장 추천드리니
읽는 데 참고하셔요ㅎ

1. hwp.CreateAction 및 CreateSet을 사용하는 방법

질문자님께서 작성하시던 방식입니다.
참고로, 가장 클래식한 방식이며, 저는 추천하지 않습니다.

import win32com.client as win32
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True


# 모든 여백을 0으로 하고, 좌우여백만 30mm로 설정하는 코드
Act = hwp.CreateAction("PageSetup")
Set = Act.CreateSet()
Act.GetDefault(Set)
Set.SetItem("ApplyTo", 3)  # 2:현재구역, 3:문서전체, 4:새구역으로
Pset = Set.CreateItemSet("PageDef", "PageDef")
Pset.SetItem("TopMargin", 0)
Pset.SetItem("BottomMargin", 0)
Pset.SetItem("LeftMargin", hwp.MiliToHwpUnit(30))
Pset.SetItem("RightMargin", hwp.MiliToHwpUnit(30))
Pset.SetItem("HeaderLen", 0)
Pset.SetItem("FooterLen", 0)
Pset.SetItem("GutterLen", 0)
Act.Execute(Set)

시연화면은 아래와 같습니다.

코드가 다소 복잡하지만, 가장 기본이 되는 방식

왜 Set 외에도 Pset을 또 만들어야 하는지,
왜 CreateItemSet 안에는 동일한 문자열이 두 번 들어가야 하는지,
궁금할 수 있지만.. 그냥 그렇게 코딩하기로 약속한 거라고 이해하고 넘어가면 마음이 편해요^^

위 코딩방식을 추천하지 않는 이유는,
우선 코드가 짧거나 직관적이지도 않고
참고할 만한 레퍼런스가 많은 것도 아니어서
(그냥 가져다 쓸 게 아니라면) 이 방식의 코딩은 추천드리지 않습니다.
대신 아래 방법들을 추천합니다.

 

2. hwp.HAction.GetDefault를 사용하는 방법

코드길이가 엄청 짧아지는 건 아니지만,
최소한 스크립트매크로를 통해 참고할 수 있는 방식이기 때문에
위 코드보다는 아래 방식을 추천합니다. 저도 선호하고요.
(실행결과는 동일합니다.)

① 스크립트매크로를 녹화합니다.

참고로,
스크립트매크로 녹화시작 단축키는 Shift-Alt-H
녹화종료 단축키는 Shift-Alt-X
매크로실행 및 코드편집 단축키는 Shift-Alt-L 을 누른 후에 매크로를 고르고 Alt-C 입니다.

스크립트매크로 녹화중

 

② 완료가 녹화된 코드는 아래와 같습니다.

function OnScriptMacro_중국어1성()
{
	HAction.GetDefault("PageSetup", HParameterSet.HSecDef.HSet);
	with (HParameterSet.HSecDef)
	{
		PageDef.LeftMargin = MiliToHwpUnit(15.0);
		PageDef.RightMargin = MiliToHwpUnit(15.0);
		PageDef.TopMargin = MiliToHwpUnit(0.0);
		PageDef.BottomMargin = MiliToHwpUnit(0.0);
		PageDef.HeaderLen = MiliToHwpUnit(0.0);
		PageDef.FooterLen = MiliToHwpUnit(0.0);
		HSet.SetItem("ApplyClass", 24);
		HSet.SetItem("ApplyTo", 3);
	}
	HAction.Execute("PageSetup", HParameterSet.HSecDef.HSet);
}

 

③ 위 코드를 파이썬 방식으로 변환하면 아래와 같습니다.

미묘하게 1.의 코드와 비슷한 듯 다릅니다.
저는 이 방식을 선호하기는 하지만,
이어서 보여드릴 3. 의 방식을 더 추천합니다.

pset = hwp.HParameterSet.HSecDef
hwp.HAction.GetDefault("PageSetup", pset.HSet)
pset.PageDef.LeftMargin = hwp.MiliToHwpUnit(15)
pset.PageDef.RightMargin = hwp.MiliToHwpUnit(15)
pset.PageDef.TopMargin = 0
pset.PageDef.BottomMargin = 0
pset.PageDef.HeaderLen = 0
pset.PageDef.FooterLen = 0
pset.HSet.SetItem("ApplyTo", 3)
hwp.HAction.Execute("PageSetup", pset.HSet)

시연화면은 아래와 같습니다.

녹화한 코드를 수정하기만 하면 되니 세상간편

우선 "스크립트매크로"라는 믿음직한 레퍼런스 제조기가 있으니까
마음이 한결 편합니다.
다만, 파이썬 코드로 변환하는 과정이
처음엔 다소 생소하고, 익숙해지는 데 시간이 좀 걸리기는 합니다.

이제 마지막 방법을 소개합니다.

 

3. pyhwpx 모듈을 통한 페이지 설정

pyhwpx는 한/글 오토메이션 API와 같이 연계해서 사용할 수 있는 모듈이기 때문에
기존 자동화를 구축해 두셨다면, 양념 정도로만 활용해주시면 좋겠습니다.
여러가지 간편하고 유용한 메서드들을 만들어 뒀거든요.
물론 pyhwpx 독립적으로도 사용 가능하고, 내부적으로는 동일하게 win32 기반입니다.
하여튼 이 방법을 가장 추천합니다.

① pip install pyhwpx로 모듈 설치

pyhwpx 모듈은 pip로 간편하게 설치하실 수 있습니다.
설치 후에는 임포트문 from pyhwpx import Hwp 를 실행하여 Hwp 클래스만 임포트합니다.

from pyhwpx import Hwp

hwp = Hwp()  # hwp 대신 다른 이름, hwpx 등으로 인스턴스 생성해도 됨.

영상에서는 hwpx라고 만들었지만, hwp 등 자유롭게 인스턴스 이름 생성하시길

hwp 인스턴스를 생성하면
기본적으로 현재 활성화되어 있는(혹은 최근에 활성화되었던) 한/글 창에 자동으로 연결됩니다.

pyhwpx.Hwp() 클래스 안에는 용지설정 관련해서 미리 만들어 둔 편의함수가 세 개 있는데요. 각각
get_pagedef_as_dict (또는 get_pagedef) 및 set_pagedef 입니다.

실행과정을 한 번 보여드리겠습니다.

① get_pagedef_as_dict()로 용지정보 추출하기

from pyhwpx import Hwp

hwp = Hwp()

page_def = hwp.get_pagedef_as_dict()
print(page_def)

사전 형태로 용지설정 정보가 추출되었습니다.
(무려 key가 한글이고, 단위가 mm입니다!)

만약 한글 key가 불편하시거나, 오토메이션API의 파라미터셋이 익숙하신 분들은
hwp.get_pagedef_as_dict(as_="eng")로 실행하시면 영문 key로 추출됩니다.

 

② 추출한 dict의 값 변경

이제 page_def 사전 안에서 원하는 대로 설정을 변경합니다.

page_def["왼쪽"] = 15  # 단위는 mm임.
page_def["오른쪽"] = 15

③ set_page_def로 변경값 적용

hwp.set_pagedef(page_def)

짜잔~ 변경이 완료되었습니다.

마치며

한/글 문서의 용지설정을 변경하는 세 가지 방법을 알려드렸어요.
대부분의 설정변경은 위 과정과 비슷합니다.
대표적으로,
글자모양을 바꾸는 CharShape이나
문단모양을 바꾸는 ParaShape이 있는데요.

가급적이면 API문서와 더불어
스크립트매크로 녹화를 통해서 코드를 참고하시면
자동화 코드 짜기 훨씬 수월합니다.

그리고 적극적으로 pyhwpx를 활용하시면 좋겠어요.
제 나름의 시행착오와 노하우를 하나씩 담아서
버전업해 가고 있으니까,
아쉬운 부분이나 버그, 추가하고 싶은 메서드가 있으면
언제든 메일이나 댓글 남겨주시기 바랍니다.

읽어주셔서 감사합니다.
행복한 하루 되세요!!

관련포스팅

 

쉬운 용지설정 : get_pagedef_as_dict와 set_pagedef

기존 오토메이션 API에서 용지설정은 복잡하진 않지만 꽤 코드가 길었다. 굳이 예전 코드를 보여드릴 필요는 없을 것. 그래서 pyhwpx에 get_pagedef_as_dict 와 set_pagedef 메서드를 추가하였는데, 사용법

martinii.fun

 

 

앞으로도 도움이 되는 콘텐츠를 만들어 가겠습니다.

 

댓글