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

[QnA] pythonwin.exe로 한/글의 TypeLibrary 생성하기

by 일코 2022. 12. 4.

이번 포스팅에서는

아래아한글 자동화 작업 때

메서드 인자명을 확인할 수 있는 타입라이브러리 파일 생성방법을 알려드리겠습니다.

대략 아래와 같이 생긴 파이썬 파일입니다.

# -*- 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를 눌러줍니다.

Importing module이라는 메시지가 출력되면서 생성완료

콘솔에 출력된 경로로 찾아가봅시다. 저의 경우에는

>>> Generating to C:\Users\smj02\AppData\Local\Temp\gen_py\3.10\7D2B6F3C-1D95-4E0C-BF5A-5EE564186FBCx0x1x0.py

라고 출력되네요. 찾아가보면,

위와 같이 괴상한 이름의 파이썬 파일이 생성되어 있습니다.

여러분의 코드 에디터로 이 파일을 한 번 열어봅시다.

hwp.HAction 클래스의 메서드 4개와 각각의 파라미터정보

위 파일은 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")

 

잠시 감회에 젖었네요ㅎㅎ

 

하여튼 위 방법으로 한/글의 타입라이브러리를 파이썬파일로 불러올 수 있고,

이 파일을 파이썬 프로젝트파일 안에 복사해 두고 종종 참고하시면

더욱 쾌적한 자동화작업 하실 수 있을 것입니다.

시간이 되면, 파이참 에디터창에서 한/글 오브젝트 메서드나 속성을 조회하는 방법도 한 번 알려드리고 싶네요.

그럼 이번 포스팅은 여기서 마칩니다.

누군가에게는 도움이 되었기를 바랍니다.

 

행복한 하루 되세요!

 

 

댓글