이번 포스팅에서는
아래아한글 자동화 작업 때
메서드 인자명을 확인할 수 있는 타입라이브러리 파일 생성방법을 알려드리겠습니다.
대략 아래와 같이 생긴 파이썬 파일입니다.
# -*- coding: mbcs -*-
# Created by makepy.py version 0.5.01
# By python version 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)]
# From type library 'HwpObject.tlb'
# On Tue Sep 20 21:31:28 2022
'HwpObject 1.0 Type Library'
makepy_version = '0.5.01'
python_version = 0x30a01f0
import win32com.client.CLSIDToClass, pythoncom, pywintypes
import win32com.client.util
from pywintypes import IID
from win32com.client import Dispatch
# The following 3 lines may need tweaking for the particular server
# Candidates are pythoncom.Missing, .Empty and .ArgNotFound
defaultNamedOptArg = pythoncom.Empty
defaultNamedNotOptArg = pythoncom.Empty
defaultUnnamedArg = pythoncom.Empty
CLSID = IID('{7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBC}')
MajorVersion = 1
MinorVersion = 0
LibraryFlags = 8
LCID = 0x0
from win32com.client import DispatchBaseClass
class HAction(DispatchBaseClass):
'HAction Interface'
CLSID = IID('{1A10DC8D-1155-4EE3-9EA2-1A160CDE2735}')
coclass_clsid = None
def Execute(self, actname=defaultNamedNotOptArg, pVal=defaultNamedNotOptArg):
'method Execute'
return self._oleobj_.InvokeTypes(15001, LCID, 1, (11, 0), ((8, 1), (9, 1)), actname
, pVal)
def GetDefault(self, actname=defaultNamedNotOptArg, pVal=defaultNamedNotOptArg):
'method GetDefault'
return self._oleobj_.InvokeTypes(15000, LCID, 1, (11, 0), ((8, 1), (9, 1)), actname
, pVal)
def PopupDialog(self, actname=defaultNamedNotOptArg, pVal=defaultNamedNotOptArg):
'method PopupDialog'
return self._oleobj_.InvokeTypes(15002, LCID, 1, (11, 0), ((8, 1), (9, 1)), actname
, pVal)
def Run(self, actname=defaultNamedNotOptArg):
'method Run'
return self._oleobj_.InvokeTypes(15003, LCID, 1, (11, 0), ((8, 1),), actname
)
_prop_map_get_ = {
}
_prop_map_put_ = {
}
def __iter__(self):
"Return a Python iterator for this object"
try:
ob = self._oleobj_.InvokeTypes(-4, LCID, 3, (13, 10), ())
except pythoncom.error:
raise TypeError("This object does not support enumeration")
return win32com.client.util.Iterator(ob, None)
class HActionCrossRef(DispatchBaseClass):
'HActionCrossRef Interface'
CLSID = IID('{D2C9C0DC-CB0D-487C-88C5-358FD78D2F82}')
coclass_clsid = None
def CreateItemArray(self, wszItemName=defaultNamedNotOptArg, pVal=defaultNamedNotOptArg):
'method CreateItemArray'
return self._oleobj_.InvokeTypes(15000, LCID, 1, (24, 0), ((8, 1), (3, 1)), wszItemName
, pVal)
_prop_map_get_ = {
"Command": (28703, 2, (8, 0), (), "Command", None),
"HSet": (1, 2, (9, 0), (), "HSet", None),
}
_prop_map_put_ = {
"Command": ((28703, LCID, 4, 0), ()),
"HSet": ((1, LCID, 4, 0), ()),
}
def __iter__(self):
"Return a Python iterator for this object"
try:
ob = self._oleobj_.InvokeTypes(-4, LCID, 3, (13, 10), ())
except pythoncom.error:
raise TypeError("This object does not support enumeration")
return win32com.client.util.Iterator(ob, None)
개인적으로는 액션 파라미터셋의 인자들을 확인하는 데 위 파일을 종종 참고하고 있습니다.
이 파일을 생성하는 가장 간편한 방법은
pywin32 패키지 설치시 함께 딸려오는 pythonwin.exe를 실행하는 것입니다.
이게 어디 설치되어 있냐면,
보통은 "파이썬 설치경로 / Lib / site-packages / pythonwin" 안에 pythonwin.exe가 있을 것입니다.
pythonwin.exe 창이 뜨면 상단 Tools 메뉴의 COM MakePy Utility를 클릭한 후
HwpObject 1.0 Type Library (1.0) 을 선택하고 OK를 눌러줍니다.
콘솔에 출력된 경로로 찾아가봅시다. 저의 경우에는
>>> Generating to C:\Users\smj02\AppData\Local\Temp\gen_py\3.10\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0.py
라고 출력되네요. 찾아가보면,
위와 같이 괴상한 이름의 파이썬 파일이 생성되어 있습니다.
여러분의 코드 에디터로 이 파일을 한 번 열어봅시다.
위 파일은 2만 줄이 넘으므로 한 줄씩 정독하는 것은 무리이고,
파라미터 오류가 나거나, 어떤 인자가 있는지 궁금할 때,
또 어떤 메서드가 숨겨져 있는지 검색해보는 데 활용하실 수 있습니다.
hwp 오브젝트 안에서 사용가능한 모든 API가 나열되어 있고,
모든 파라미터셋의 파라미터들을 검색할 수 있지만,
API매뉴얼에 없는 메서드를 찾아 실행하기는 어렵습니다.
파라미터 설명이 없기 때문에 시간도 많이 걸리는 등 한계가 있습니다.
또한 단축명령어인 Run() 안에 들어가는 액션문자열도 검색되지 않습니다.
여담으로, 제가 파이썬으로 한/글 자동화 작업을 시작할 수 있었던 첫걸음도
바로 이 파일을 생성하면서인데요.
13,457번째 라인의 주석에 보면 "HWPFrame.HwpObject"라는 문자열이 있습니다.
당시 공공기관 재직하면서 win32를 통해 엑셀자동화만 활용하던 시절에
엑셀의 CoClass 문자열인 "Excel.Application"을 통해 엑셀을 파이썬으로 열 수 있듯이
아래아한글의 CoClass 문자열만 알아내면 파이썬으로 한/글을 자동화할 수 있겠다는 생각에
지푸라기 잡듯 이것저것 넣어보다가 저 문자열을 넣었더니 한/글이 실행되는 감동의 순간ㅜㅜㅜ
너무 엄청난 걸 알아내버렸다고 흥분한 나머지
회사 휴가 내고 파이썬코리아 라이트닝 토크에도 참석하고, 코엑스에서 열린 파이콘에 가서 발표도 하고ㅜ
지금 생각하면 많이 부끄럽습니다..
그리고 나중에 알게 되었는데, 디스패치할 때 "hwpframe.hwpobject"처럼 소문자로만 입력해도 한/글이 실행되더라고요.
아래처럼요.
import win32com.client as win32
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
잠시 감회에 젖었네요ㅎㅎ
하여튼 위 방법으로 한/글의 타입라이브러리를 파이썬파일로 불러올 수 있고,
이 파일을 파이썬 프로젝트파일 안에 복사해 두고 종종 참고하시면
더욱 쾌적한 자동화작업 하실 수 있을 것입니다.
시간이 되면, 파이참 에디터창에서 한/글 오브젝트 메서드나 속성을 조회하는 방법도 한 번 알려드리고 싶네요.
그럼 이번 포스팅은 여기서 마칩니다.
누군가에게는 도움이 되었기를 바랍니다.
행복한 하루 되세요!
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
[QnA] 파이참에서 한/글 API 코드 자동완성을 하고 싶어요! (0) | 2022.12.05 |
---|---|
[QnA] 스타일문서를 임의로 변경한 경우 복원하기 (0) | 2022.12.04 |
[QnA] A문서 스타일을 B문서에 적용하는 가장 간편한 코딩 (0) | 2022.12.04 |
댓글