[ 한글 자동화 ] 파이썬으로 한글 문서 내 표 개수 세기: 초보자도 쉽게 따라하는 방법
한글 문서 자동화의 필요성
업무나 학교 과제를 하다 보면 한글 문서를 자동으로 처리해야 할 때가 있습니다.
특히 여러 문서에서 특정 정보를 추출하거나,
반복적인 작업을 자동화하고 싶을 때 파이썬을 활용하면 매우 편리합니다.
오늘은 그중에서도 '한글 문서에 표가 몇 개 있는지 자동으로 세는 방법'에 대해 알아보겠습니다.
이 기능은 문서 분석, 통계 작업, 또는 문서 구조를 파악할 때 유용하게 사용될 수 있습니다.
필요한 준비물
이 작업을 위해 필요한 것들을 먼저 준비해 봅시다:
1. 소프트웨어 준비
- 파이썬: 최신 버전의 파이썬이 설치되어 있어야 합니다. 아직 설치하지 않았다면 파이썬 공식 웹사이트에서 다운로드할 수 있습니다.
- 한글(한글과컴퓨터): 한글 프로그램이 설치되어 있어야 합니다.
- pywin32 라이브러리: 파이썬에서 윈도우 프로그램을 제어하기 위한 라이브러리입니다. 명령 프롬프트에서
pip install pywin32
명령어로 설치할 수 있습니다.
2. 테스트용 한글 문서
표가 몇 개 포함된 한글 문서를 준비합니다.
테스트를 위해 직접 문서를 만들거나, 기존 문서를 사용해도 됩니다.
예를 들어, 아래 이미지처럼 표가 3개 포함된 문서를 만들어 봅시다.
테스트용 문서는 간단하게 만드는 것이 좋습니다. 표의 크기나 내용은 중요하지 않으니, 빈 표를 몇 개 삽입해도 충분합니다. 한글에서 표를 삽입하려면 '입력 > 표 > 표 만들기'를 선택하면 됩니다.
한글 자동화 기본 개념 이해하기
본격적인 코딩에 앞서, 한글 자동화의 기본 개념을 간단히 이해해 봅시다.
1. OLE Automation이란?
OLE Automation(Object Linking and Embedding Automation)은
윈도우 프로그램들이 서로 통신하고 제어할 수 있게 해주는 기술입니다.
쉽게 말해, 파이썬에서 한글 프로그램을 원격 조종할 수 있게 해주는 기술이라고 생각하면 됩니다.
한글 프로그램은 이 OLE Automation을 지원하기 때문에, 파이썬에서 한글 문서를 열고, 읽고, 수정하는 등의 작업이 가능합니다.
2. 한글 문서의 구조
한글 문서는 텍스트뿐만 아니라
표, 그림, 도형 등 다양한 요소들을 포함할 수 있습니다.
이러한 요소들을 한글에서는 '컨트롤(Control)'이라고 부릅니다.
한글 문서 내의 모든 컨트롤은 서로 연결된 목록(linked list) 형태로 관리됩니다.
이 목록의 첫 번째 컨트롤을 가져오는 속성이 'HeadCtrl'이고,
마지막 컨트롤을 가져오는 속성이 'LastCtrl'입니다.
각 컨트롤은 'Next' 속성을 통해 다음 컨트롤로,
'Prev' 속성을 통해 이전 컨트롤로 이동할 수 있습니다.
그리고 각 컨트롤의 종류는 'CtrlID' 속성으로 구분할 수 있습니다.
한글 문서를 기차라고 생각해 봅시다. 기차의 맨 앞 칸이 HeadCtrl, 맨 뒤 칸이 LastCtrl입니다. 각 칸(컨트롤)은 Next와 Prev로 연결되어 있고, 칸의 종류(표, 그림 등)는 CtrlID로 알 수 있습니다. 표는 'tbl'이라는 ID를 가지고 있습니다.
실행 중인 한글 프로그램에 연결하기
이제 파이썬에서 실행 중인 한글 프로그램에 연결하는 방법을 알아봅시다.
1. ROT(Running Object Table) 이해하기
ROT(Running Object Table)는 현재 실행 중인 모든 OLE 객체의 목록을 관리하는 테이블입니다.
파이썬에서 이 테이블에 접근하여 실행 중인 한글 프로그램을 찾고 제어할 수 있습니다.
2. 연결 코드 작성
실행 중인 한글 프로그램에 연결하는 코드는 다음과 같습니다:
import pythoncom
import win32com.client as win32
def get_running_hwp():
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
max_value = -1
result_moniker = None
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
if name.startswith("!HwpObject"):
parts = name.split(".")
try:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except ValueError:
continue
if result_moniker is not None:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
hwp = win32.Dispatch(hwp_dispatch)
return hwp
return None
# 실행 중인 한글 프로그램에 연결
hwp = get_running_hwp()
이 코드는 다음과 같은 단계로 작동합니다:
- ROT에 접근하여 현재 실행 중인 모든 객체의 목록을 가져옵니다.
- "!HwpObject"로 시작하는 이름을 가진 객체들을 찾습니다(이것이 한글 프로그램입니다).
- 여러 한글 인스턴스가 실행 중일 경우, 인스턴스 번호가 가장 큰 것(가장 최근에 실행된 것)을 선택합니다.
- 선택된 한글 인스턴스에 연결하여 제어할 수 있는 객체(hwp)를 반환합니다.
이 코드는 조금 복잡해 보일 수 있지만, 간단히 말하면 "현재 실행 중인 한글 프로그램을 찾아서 연결해 주세요"라고 컴퓨터에게 지시하는 것입니다. 이 코드는 그대로 복사해서 사용하면 되며, 내부 동작을 완전히 이해하지 못해도 괜찮습니다.
한글 문서 내 표 개수 세기
이제 한글 프로그램에 연결했으니, 문서 내의 표 개수를 세는 함수를 작성해 봅시다.
1. 표 개수 세는 함수 작성
표 개수를 세는 함수는 다음과 같이 작성할 수 있습니다:
def get_table_count(hwp):
table_count = 0
ctrl = hwp.HeadCtrl
while ctrl:
if ctrl.CtrlID == "tbl":
table_count += 1
ctrl = ctrl.Next
return table_count
이 함수의 작동 방식은 다음과 같습니다:
table_count = 0
: 표의 개수를 저장할 변수를 0으로 초기화합니다.ctrl = hwp.HeadCtrl
: 문서의 첫 번째 컨트롤을 가져옵니다.while ctrl:
: 컨트롤이 존재하는 동안 반복합니다.if ctrl.CtrlID == "tbl":
: 현재 컨트롤이 표인지 확인합니다. 표의 CtrlID는 "tbl"입니다.table_count += 1
: 표라면 개수를 1 증가시킵니다.ctrl = ctrl.Next
: 다음 컨트롤로 이동합니다.return table_count
: 최종 표 개수를 반환합니다.
2. 함수 실행 및 결과 출력
이제 작성한 함수를 실행하고 결과를 출력해 봅시다:
table_count = get_table_count(hwp)
print(f"현재 문서에서 표의 개수: {table_count}개")
이 코드는 마치 책의 첫 페이지부터 마지막 페이지까지 넘기면서 표가 있는지 확인하는 것과 같습니다. 표를 발견할 때마다 카운터를 1씩 증가시키고, 모든 페이지를 확인한 후 최종 카운트를 알려줍니다.
전체 코드 및 실행 결과
지금까지 작성한 코드를 모두 합치면 다음과 같습니다:
import pythoncom
import win32com.client as win32
def get_running_hwp():
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
max_value = -1
result_moniker = None
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
if name.startswith("!HwpObject"):
parts = name.split(".")
try:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except ValueError:
continue
if result_moniker is not None:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
hwp = win32.Dispatch(hwp_dispatch)
return hwp
return None
def get_table_count(hwp):
table_count = 0
ctrl = hwp.HeadCtrl
while ctrl:
if ctrl.CtrlID == "tbl":
table_count += 1
ctrl = ctrl.Next
return table_count
# 실행 중인 한글 프로그램에 연결
hwp = get_running_hwp()
if hwp:
# 표 개수 세기
table_count = get_table_count(hwp)
print(f"현재 문서에서 표의 개수: {table_count}개")
else:
print("실행 중인 한글 프로그램을 찾을 수 없습니다.")
실행 결과
이 코드를 실행하면 다음과 같은 결과가 출력됩니다:
현재 문서에서 표의 개수: 3개
이는 우리가 준비한 테스트 문서에 표가 3개 있다는 것을 정확히 보여줍니다.
추가 팁: 표 속성에 따른 차이점
한글에서 표는 '글자처럼 취급' 옵션을 설정할 수 있습니다.
이 옵션이 표 개수를 세는 데 영향을 미치는지 알아봅시다.
1. '글자처럼 취급' 옵션이란?
한글에서 표를 삽입할 때 '글자처럼 취급' 옵션을 설정할 수 있습니다.
이 옵션을 켜면 표가 텍스트 흐름에 따라 이동하고, 끄면 표의 위치를 고정할 수 있습니다.
2. 옵션에 따른 표 개수 세기 결과
테스트 결과, '글자처럼 취급' 옵션의 설정 여부는 표 개수를 세는 데 영향을 미치지 않습니다.
즉, 이 옵션을 켜든 끄든 모든 표는 CtrlID가 "tbl"인 컨트롤로 인식되어 정확히 개수가 세어집니다.
한글 내부에서는 '글자처럼 취급' 옵션이 표의 레이아웃과 이동 방식에만 영향을 미치고, 표의 기본 속성(CtrlID가 "tbl"인 컨트롤)은 변경되지 않습니다. 따라서 어떤 옵션을 사용하든 모든 표는 정확히 개수가 세어집니다.
마무리 및 추가 학습 자료
이번 포스팅에서는 파이썬을 사용하여 한글 문서 내의 표 개수를 자동으로 세는 방법을 알아보았습니다.
실행 중인 한글 프로그램에 연결하고,
문서 내의 모든 컨트롤을 순회하면서 표(CtrlID가 "tbl"인 컨트롤)의 개수를 세는 방법을 배웠습니다.
이 기술은 단순히 표 개수를 세는 것뿐만 아니라, 한글 문서를 자동화하는 다양한 작업에 활용할 수 있습니다.
예를 들어, 표의 내용을 추출하거나, 특정 조건에 맞는 표만 찾거나, 표의 스타일을 일괄 변경하는 등의 작업이 가능합니다.
[ 파이썬 관련 블로그 글 목록 ]
파이썬(Python) 블로그 목록