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

현재 셀의 사이즈 알아내기/변경하기

by 일코 2020. 11. 30.
"""
여러분 안녕하세요?
오늘은 파이썬으로 한/글 다루기 기초 중에
"액션생성"과 "아이템셋"을 사용하는 예제를 하나 소개해드리려고 합니다.
일전에 현재 열린 문서의 페이지 여백을 알아내거나 조회하는 방법을 알려드렸는데
이번에는 캐럿이 표 안에 위치할 때, 현재 선택한 셀의 가로세로 사이즈를 알아내는 방법입니다.
아래 코드에 자세히 주석을 달아놓겠습니다.
"""


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

Act = hwp.CreateAction("TablePropertyDialog")  # 공식문서-액션테이블에서 검색("표 고치기" 액션아이디)
Set = Act.CreateSet()  # 세트 생성
Pset = Set.CreateItemSet("ShapeTableCell", "Cell")  # 공식문서-파라미터셋에서 검색("셀 정보"로 검색)
Act.GetDefault(Set)  # 세트 초기화(Set의 파라미터에 현재 문서의 값을 적용)
print(Set.Item("Width"))  # 표의 너비 출력. 파라미터셋에서 "셀의 폭"으로 검색하면 나옴. HwpUnit 값임.
print(Set.Item("Height"))  # 표의 높이(HwpUnit) 출력
print(Pset.Item("Width"))  # 선택한 셀의 너비(HwpUnit) 출력
print(Pset.Item("Height"))  # 선택한 셀의 높이(HwpUnit) 출력

# 참고 : HwpUnit은 한/글이 사용하는 기본 길이단위.
# 1인치는 7200HwpUnit이며, 1mm 는 283.465HwpUnit이다.

# 중요! : Set나 Pset값은 실시간으로 업데이트 되지 않는다.
# Act.GetDefault(Set) 만 실행해주면 업데이트 된다.
# (Act나 Set를 재생성할 필요는 없다.)


def HwpUnitToMili(hwpunit):
    return hwpunit / 7200 * 25.4


def HwpUnitToInch(hwpunit):
    return hwpunit / 7200


def HwpUnitToPoint(hwpunit):
    return hwpunit / 100


print(HwpUnitToMili(Pset.Item("Height")))  # 이런 식으로 사용 가능

 

 

(몇 가지 중요한 라인에 대해서 언급을 하려고 하는데, 편집중에는 라인넘버가 보이지 않네요.. 다른 창을 띄워서 뭐 이렇게.. 작업을 해야 하나봐요...)

#11~12 import 

아래아한글을 불러오기 위한 win32com 모듈을 불러옵니다. 우선은 2020년 12월 현재, 오랜만에 아래아한글 업데이트가 되었는지 EnsureDispatch 명령어를 실행할 때 MinorVserion 오류가 뜨네요. 간단히 pythonwin.exe 실행하셔서 MakePyUtility 실행하시고 HwpObject 찾아서 확인 누르시면 바인딩파일 자동생성되고, IDE 재시작하시면 오류없이 임포트 됩니다.

 

#13 .Visible

아래아한글 인스턴스 생성시에는 기본적으로 백그라운드 상태에서 열립니다. 위 명령어를 실행하면 숨어있던 한/글 창이 화면에 나타나게 됩니다. 참고로 숨김상태에서도 대부분의 자동화 작업이 가능하므로, 작업상황을 관찰하셔야 되는 상황이 아니라면 숨김 상태에서 작업하시는 걸 추천합니다. (자동화에 성공했는데, 그걸 넋놓고 보면서 멍때리게 되는 부작용이 있거든요...)

 

#15 Act

(Act라는 컨벤션으로) 액션을 생성합니다. 메서드 안의 문자열은 마음대로 입력하는 게 아니고, 공식문서 중 "Action Table.hwp" 파일을 참고하시면 됩니다. hancom.com에도 API 설명이 잘 되어 있습니다.

 

# 16 Set

액션은 (가장) 크게는 두 종류로 나뉩니다. 파라미터셋이 필요한 액션과, 파라미터셋 없이 실행가능한 액션.

파라미터셋이 필요한 대부분의 액션은 액션테이블 액션아이디 옆에 파라미터셋 아이디가 표시되어 있습니다. 반면 파라미터셋이 없는 액션은 액션테이블에서 마이너스(-)심볼로만 표시되어 있습니다.

한 가지 유의하실 점은, 파이썬에 set라는 자료형 클래스가 있기 때문에, 파라미터셋을 Set이 아닌 set로 지정하시면 안 됩니다. 다행히 파이썬이 대소문자를 구분하므로 파라미터셋을 정의할 때 Set으로 사용하시면 큰 문제가 발생하지는 않을 것입니다.

#17 Pset

파라미터셋 중에서도, 배열데이터가 추가로 필요한 액션이 있습니다. 예를 들면 상하좌우 여백값들이 필요한 "PageDef"나, 표 각각의 셀값을 정의하는 "TablePropertyDialog" 같은 경우입니다. 이런 경우에는 Set 안에서 한 번 더 ItemSet을 생성하는 메서드인 CreateItemSet을 통해 아이템셋(배열)을 생성합니다. 안에 들어가는 두 개의 문자열은, 공식문서 중 "ParameterSet Table.hwp" 파일을 참고하시면 됩니다.

 

#18 GetDefault

생성시점에서 Set과 PSet은 비어있는 배열일 뿐입니다. 현재 문서의 값을 Set과 PSet에 할당하려면 GetDefault메서드를 실행해야 합니다.

 

#19~22

현재 값을 조회하는 메서드입니다. 어떤 값을 조회할 수 있는지는 ParameterSet Table.hwp를 참고하시면 됩니다. 또는, 팁을 하나 드리자면 MakePy로 생성한 바인딩파일(예 : 7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0.py) 을 열어서 어떤 메서드와 프로퍼티가 있는지 참고하실 수 있습니다.

 

#32~40

아래아한글 내부적으로 사용하는 모든 길이단위는 HwpUnit을 사용합니다. 1 HwpUnit은 정확히 1/7,200인치를 나타냅니다. 현재 아래아한글 메서드 중에 hwp.MiliToHwpUnit()이 구현되어 있으며, 파라미터로 밀리미터 값을 넣으면 HwpUnit으로 변환하여 리턴해줍니다. 혹시, 반대로 Hwp유닛을 밀리미터나 인치로 변환하실 분들을 위해 참고하시라고 함수선언 예시를 적어두었습니다. 참고하시기 바랍니다.

 

이번 포스팅은 여기서 마치겠습니다. 혹시 질문이나 첨언하실 내용 있으면 댓글로 달아주시면 빠르게 반응하겠습니다.

그럼 행복한 하루 되세요!

관련포스팅

 

각각의 셀너비, 높이를 다르게 표를 생성하는 코드

안녕하세요 선생님 유튜브, 블로그 강의를 열심히 따라하고 있는 파이썬 초보입니다. 제 업무에 적용해 보려고 열심히 코딩 중인데, 어려움이 생겨 도움을 요청하고자 실례를 무릅쓰고 이렇게

www.martinii.fun

 

댓글