감사히 잘 활용하는 중에 질문이 있어서 글을 남깁니다
제가 용지 설정(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 등으로 인스턴스 생성해도 됨.
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를 활용하시면 좋겠어요.
제 나름의 시행착오와 노하우를 하나씩 담아서
버전업해 가고 있으니까,
아쉬운 부분이나 버그, 추가하고 싶은 메서드가 있으면
언제든 메일이나 댓글 남겨주시기 바랍니다.
읽어주셔서 감사합니다.
행복한 하루 되세요!!
관련포스팅
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
아래아한글 액션아이디와 대응 파라미터셋 목록 (1) | 2024.01.12 |
---|---|
[원데이클래스 안내] 9.2(토) 동대구역 앞 보고서 작성 자동화 원데이 클래스 (0) | 2023.08.31 |
[업무자동화 영상 튜토리얼] 데이터프레임으로 아래아한글 보고서 만들기 (0) | 2023.06.18 |
댓글