본문 바로가기
아래아한글 자동화/pyhwpx 사용법

[예제] 특정 단어들에다 메모교정표 삽입하기

by 일코 2023. 12. 6.

pyhwpx는
win32 기반의 한/글 오토메이션 API 명령어의 복잡성을 보완하고자
업무자동화에 사용되는 여러 가지 상위기능들을 메서드로 제공합니다.

아래와 같은 문서가 있을 때,

아래와 같은 교정단어 사전을 통해
교정하고자 하는 단어에 메모고침표를 달아주는 것이 목표입니다.

# 교정대상 단어 예시자료(dict)
word_dict = {
    "가감": "→더하고 빼기, 더하거나 빼기",
    "가건물": "→임시 건물",
    "가결의": "→임시 결의",
    "가공": "→영향을 미치다",
}

결과물이 대략 다음과 같을 때,

기존 win32com과 한/글 오토메이션 API를 사용한 전통적인(?) 코드는 대략 아래와 같습니다.

import os

import win32com.client as win32
from tkinter import Tk
from tkinter.filedialog import askopenfilename


과정보기 = True

데이터 = {"가감": "→더하고 빼기, 더하거나 빼기, 가감",
       "가건물": "→임시 건물, 가건물",
       "가결의": "→임시 결의",
       "가공": "→영향을 미치다"}


def 시작(과정보기=True):
    hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    hwp.XHwpWindows.Item(0).Visible = 과정보기
    return hwp


def 찾아가기(단어):
    hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet)
    hwp.HParameterSet.HFindReplace.ReplaceString = ""
    hwp.HParameterSet.HFindReplace.FindString = 단어
    hwp.HParameterSet.HFindReplace.Direction = hwp.FindDir("Forward")
    hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
    hwp.HParameterSet.HFindReplace.FindType = True
    hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet)


def 메모고침표삽입(선택단어):
    hwp.HAction.Run("InsertFieldRevisionChagne")
    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = 데이터[선택단어]
    hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HAction.Run("CloseEx")


if __name__ == '__main__':
    root = Tk()
    문서 = askopenfilename(title="교정할 HWP문서를 선택하세요.", initialdir=os.getcwd())
    root.destroy()
    hwp = 시작(과정보기)
    hwp.Open(문서)

    단어위치 = dict()
    for 단어 in 데이터:
        hwp.MovePos(2)
        while True:
            찾아가기(단어)
            if hwp.SelectionMode:
                단어위치[hwp.GetPos()] = 단어
            else:
                break

    단어위치keys = sorted(단어위치.keys(), reverse=True)
    for 위치 in 단어위치keys:
        hwp.SetPos(*위치)
        for _ in range(len(단어위치[위치])):
            hwp.Run("MoveSelLeft")
        메모고침표삽입(단어위치[위치])

(tkinter GUI 관련한 다섯 줄을 빼고도) 60라인 정도입니다.

근데 pyhwpx를 사용하면
아래와 같이 작성하실 수 있습니다.

"""
문서 안에 해당 용어가 몇 번 출현하는지만 세고,
for문을 통해 해당 횟수만큼만 "찾아서 메모 추가하기"를 실행
"""

from pyhwpx import Hwp


word_dict = {
    "가감": "→더하고 빼기, 더하거나 빼기",
    "가건물": "→임시 건물",
    "가결의": "→임시 결의",
    "가공": "→영향을 미치다",
}


hwp = Hwp()
hwp.open("ㅇㅇ 가감 ㅇㅇ.hwp")


content = hwp.get_text_file()
for word in word_dict.keys():
    count = content.count(word)
    for i in range(count):
        hwp.find(word, "Backward")  # 캐럿 위쪽으로 탐색
        hwp.insert_memo(word_dict[hwp.get_selected_text()])

이를테면
find, insert_memoget_selected_text 같은
범용 함수를 메서드로 미리 정의하여 제공하는 방식입니다.

현재 지속적으로 다양한 메서드를 기획하고 선별해서 추가하고 있습니다.
("범용"의 범위가 어디까지인지 정의하는 게 쉽지는 않네요.)

마음 같아선 matplotlib+seaborn이나 keras+tensorflow의 관계처럼
win32와 당당히 병행할 수 있는 훌륭한 모듈을 만들어내고 싶습니다.

많은 관심 부탁드립니다.

pip install pyhwpx
명령어로
간편히 설치하실 수 있습니다.

 

댓글