[ 한글 자동화 ] 파이썬으로 실행 중인 한글 프로그램 찾아 조작하는 방법
파이썬으로 한글 자동화가 필요한 이유
업무를 하다 보면 반복적으로 한글 문서를 작성하거나 편집해야 하는 상황이 자주 발생합니다.
이런 단순 반복 작업은 시간을 많이 소모할 뿐만 아니라 지루함과 실수의 원인이 되기도 합니다.
파이썬을 활용한 한글 자동화는 이러한 문제를 해결하는 효과적인 방법입니다.
한글 자동화를 통해 문서 생성, 텍스트 삽입, 서식 변경, 표 편집 등 다양한 작업을 자동으로 처리할 수 있습니다. 특히 이미 실행 중인 한글 프로그램을 제어할 수 있다면 작업 효율이 크게 향상됩니다.
이번 포스팅에서는 파이썬으로 현재 실행 중인 한글 프로그램을 찾아 제어하는 방법에 대해
초보자도 쉽게 이해할 수 있도록 상세히 설명하겠습니다.
자동화에 필요한 라이브러리 소개
한글 자동화를 위해서는 주로 두 가지 핵심 라이브러리가 필요합니다.
1. pythoncom
pythoncom은 Windows의 COM(Component Object Model) 인터페이스를
파이썬에서 사용할 수 있게 해주는 라이브러리입니다.
COM은 서로 다른 프로그램 간에 통신할 수 있게 해주는 Microsoft의 기술입니다.
이 라이브러리를 통해 실행 중인 프로그램의 목록을 가져오고 특정 프로그램을 식별할 수 있습니다.
2. win32com.client
win32com.client는 COM 객체를 파이썬에서 쉽게 사용할 수 있게 해주는
래퍼(wrapper) 라이브러리입니다.
이 라이브러리를 통해 한글 프로그램의 기능을 파이썬에서 직접 호출할 수 있습니다.
텍스트 삽입, 서식 변경, 표 편집 등 다양한 작업이 가능합니다.
이 라이브러리들은 pywin32 패키지에 포함되어 있습니다. 다음 명령어로 설치할 수 있습니다:
pip install pywin32
실행 중인 한글 프로그램 찾기
일반적으로 한글 자동화를 할 때는 새로운 한글 인스턴스를 생성하는 방식을 많이 사용합니다.
하지만 이미 실행 중인 한글 프로그램을 찾아 제어하는 방법이 더 효율적인 경우가 많습니다.
실행 중인 한글 프로그램 찾기 코드 분석
다음은 실행 중인 한글 프로그램을 찾는 함수의 코드입니다:
def get_running_hwp():
"""실행 중인 한글 프로그램 중 가장 최근 인스턴스를 반환"""
context = None
running_coms = None
try:
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
max_value = -1
result_moniker = None
for moniker in monikers:
try:
name = moniker.GetDisplayName(context, moniker)
if name and name.startswith("!HwpObject"):
parts = name.split(".")
if len(parts) > 0:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except (ValueError, IndexError, pythoncom.com_error):
continue
if result_moniker:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
return win32.Dispatch(hwp_dispatch)
except pythoncom.com_error:
return None
except Exception:
return None
return None
이 함수의 동작 원리를 단계별로 살펴보겠습니다:
1. COM 객체 테이블 가져오기
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
`CreateBindCtx(0)`는 바인딩 컨텍스트를 생성합니다.
`GetRunningObjectTable()`은 현재 실행 중인 모든 COM 객체의 목록을 가져옵니다.
`EnumRunning()`은 실행 중인 객체들의 모니커(moniker)를 열거합니다.
모니커는 COM 객체를 식별하는 이름이라고 생각하면 됩니다.
2. 한글 프로그램 식별하기
for moniker in monikers:
try:
name = moniker.GetDisplayName(context, moniker)
if name and name.startswith("!HwpObject"):
parts = name.split(".")
if len(parts) > 0:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except (ValueError, IndexError, pythoncom.com_error):
continue
모든 모니커를 순회하면서 각 모니커의 표시 이름을 가져옵니다.
한글 프로그램의 모니커는 "!HwpObject"로 시작합니다.
여러 개의 한글 프로그램이 실행 중일 수 있으므로,
가장 최근에 실행된 인스턴스를 찾기 위해 모니커 이름의 마지막 숫자가 가장 큰 것을 선택합니다.
3. 한글 객체 반환하기
if result_moniker:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
return win32.Dispatch(hwp_dispatch)
찾은 모니커를 사용하여 실제 COM 객체를 가져옵니다.
`QueryInterface`를 통해 IDispatch 인터페이스를 요청합니다.
마지막으로 `win32.Dispatch`를 사용하여 파이썬에서 사용할 수 있는 디스패치 객체로 변환합니다.
모니커(moniker)는 COM 객체의 "주소"나 "이름"이라고 생각하면 됩니다. 한글 프로그램의 모니커는 "!HwpObject"로 시작하며, 여러 개의 한글 프로그램이 실행 중일 때 각각 다른 번호를 가집니다. 이 코드는 그 중 가장 큰 번호(가장 최근에 실행된)를 가진 한글 프로그램을 찾습니다.
한글 프로그램에 텍스트 삽입하기
실행 중인 한글 프로그램을 찾았다면, 이제 그 프로그램을 제어하여 텍스트를 삽입해 보겠습니다.
if hwp:
try:
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
print("텍스트 삽입 완료")
except Exception as e:
print(f"텍스트 삽입 실패: {e}")
else:
print("실행 중인 한글 프로그램 없음")
이 코드의 동작 원리를 살펴보겠습니다:
1. Action 객체 생성
action = hwp.CreateAction("InsertText")
한글 프로그램에서는 다양한 작업을 "Action"이라는 개념으로 제공합니다.
"InsertText"는 텍스트를 삽입하는 액션입니다.
2. 파라미터 설정
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
액션을 실행하기 위한 파라미터 집합을 생성합니다.
"Text" 파라미터에 삽입할 텍스트 "111"을 설정합니다.
3. 액션 실행
action.Execute(parameter_set)
설정한 파라미터로 액션을 실행합니다.
이 코드가 실행되면 현재 커서 위치에 "111"이라는 텍스트가 삽입됩니다.
한글 프로그램에는 "InsertText" 외에도 다양한 액션이 있습니다. 예를 들어 "TableInsert"(표 삽입), "CharShape"(글자 서식 변경), "ParagraphShape"(문단 서식 변경) 등이 있습니다. 한컴 개발자 포럼이나 API 문서를 참고하면 더 많은 액션을 찾을 수 있습니다.
전체 코드 분석 및 활용 방법
이제 전체 코드를 다시 살펴보고 어떻게 활용할 수 있는지 알아보겠습니다.
import pythoncom
import win32com.client as win32
def get_running_hwp():
"""실행 중인 한글 프로그램 중 가장 최근 인스턴스를 반환"""
context = None
running_coms = None
try:
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
max_value = -1
result_moniker = None
for moniker in monikers:
try:
name = moniker.GetDisplayName(context, moniker)
if name and name.startswith("!HwpObject"):
parts = name.split(".")
if len(parts) > 0:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except (ValueError, IndexError, pythoncom.com_error):
continue
if result_moniker:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
return win32.Dispatch(hwp_dispatch)
except pythoncom.com_error:
return None
except Exception:
return None
return None
# 메인 실행 부분
if __name__ == "__main__":
hwp = get_running_hwp()
if hwp:
try:
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
print("텍스트 삽입 완료")
except Exception as e:
print(f"텍스트 삽입 실패: {e}")
else:
print("실행 중인 한글 프로그램 없음")
코드 활용 방법
1. 문서 자동 생성: 템플릿을 기반으로 반복적인 문서를 자동으로 생성할 수 있습니다.
2. 대량 텍스트 처리: 여러 텍스트를 한 번에 삽입하거나 수정할 수 있습니다.
3. 서식 일괄 변경: 특정 조건에 맞는 텍스트의 서식을 일괄적으로 변경할 수 있습니다.
4. 데이터 추출 및 입력: 외부 데이터를 한글 문서에 자동으로 입력하거나, 한글 문서의 데이터를 추출할 수 있습니다.
코드 확장 예시
다음은 이 코드를 확장하여 다양한 작업을 수행하는 예시입니다:
# 텍스트 삽입 후 글자 서식 변경하기
def insert_and_format_text(hwp, text, font_name="맑은 고딕", font_size=10):
# 텍스트 삽입
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", text)
action.Execute(parameter_set)
# 글자 서식 변경
action = hwp.CreateAction("CharShape")
parameter_set = action.CreateSet()
parameter_set.SetItem("FaceNameHangul", font_name)
parameter_set.SetItem("Height", font_size * 100) # 한글에서는 크기를 100배로 지정
action.Execute(parameter_set)
return True
실제 업무에서는 위와 같은 기본 함수들을 조합하여 더 복잡한 자동화 작업을 수행할 수 있습니다. 예를 들어, 엑셀에서 데이터를 읽어와 한글 문서의 특정 위치에 삽입하거나, 문서 내의 특정 텍스트를 찾아 일괄 변경하는 등의 작업이 가능합니다.
이 포스팅이 파이썬으로 한글 자동화를 시작하는 데 도움이 되었길 바랍니다. 코드를 직접 실행해보고 자신의 업무에 맞게 응용해보세요!
[ 파이썬 관련 블로그 글 목록 ]
파이썬(Python) 블로그 목록