본문 바로가기
업무자동화/파이썬-아래아한글 자동화 응용

[QnA]한/글 교정부호(메모고침표) 자동삽입으로 깔끔한 주석 추가

by Martinii의 회사원코딩 2021. 5. 18.
안녕하십니까,
저는 ㅇㅇㅇㅇㅇ에 근무하고 있는
ㅇㅇㅇ이라고 합니다.

코딩 작업 중 막힌 부분이 있어 메일을 올리게 되었습니다.

현재 제가 만들고 있는 프로그램은,
문서(hwp 파일) 내에 특정 단어가 있는지 검색하고
특정 단어가 검색되면, 그 옆에 주석을 표기해주는 프로그램입니다.

예를 들어 부적절한 단어가 있다면,
그에 해당하는 적절한 좋은 용어를 제시해줌으로써
업무에 편의를 도모하려는 프로그램입니다.


현재까지는 한컴오피스 한글의 '찾아 바꾸기' 기능을 이용하여 작업하였고, 잘 작동됩니다.
현재까지의 코딩 내용은 다음과 같습니다.

```
data=[("가감","→더하고 빼기, 더하거나 빼기, 가감"),
        ("가건물","→임시 건물, 가건물"),
        ("가결의","→임시 결의"),
        ("가공","→영향을 미치다"),
        (후략),]

for (first,second) in data:
    hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet)
    option=hwp.HParameterSet.HFindReplace   
    option.FindString = " "+first   
    option.ReplaceString = " "+first+"("+second+")"   
    option.ReplaceCharShape.ShadeColor = hwp.RGBColor(255, 239, 153)   
    option.ReplaceCharShape.Bold = 1   
    option.IgnoreMessage = 1
    hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet)
```

예를 들어, 문서 내에 "가감"이라는 단어가 있을 경우에는 자동으로"가감(→더하고 빼기, 더하거나 빼기, 가감)"이라고 변환됩니다.

그런데 문제는 위 결과물이 다소 지저분해 보인다는 것입니다.
본문과 주석 문구가 이 뒤섞여 한줄로 주욱 기술되기 때문입니다.


이에, 한컴오피스 한글의 기능 중 교정 부호인 '메모 고침표'를 이용하려고 생각 중입니다.

그렇게 하면 본문 문서를 수정하지 않고, 주석 문구를 오른쪽 가장자리에 별도로 표시하게 되므로
보기에 깔끔할 것이라고 생각했기 때문입니다.
그런데..
그걸 어떻게 구현할지 모르겠습니다ㅠㅠ
'찾기'를 한 후 ESC를 눌러 메모 고침표를 다는 방식을 취해보았는데,
해당 문구에 해당하는 주석만 달리는 것이 아니라 '모든' 주석이 마구마구 달립니다ㅠㅠ
(위 코딩을 기준으로 한다면, '더하고 빼기, 더하거나 빼기, 가감', '임시 건물, 가건물', '임시 결의', '영향을 미치다'가 몽땅 메모 고침표로 생성됩니다)
이리저리 머리를 굴려, '찾기'의 결과값이 True인 경우만 메모 고침표를 생성하는 방법
등등을 생각해봤는데,
도저히 코딩하는 방법을 모르겠습니다ㅠㅠ


무작정 질문드리는 이메일에 죄송한 마음을 느끼며,
회사원 코딩님의 고견을 부탁드립니다!


ㅇㅇㅇㅇㅇㅇ ㅇㅇㅇ 올림.

 

메일로 직접 회신을 드리려다가, 코드 공유나 참고영상 등을 위해 블로그에 적어보았습니다.

우선 교정데이터는 편의를 위해 리스트 대신 사전 자료형으로 대체하겠습니다. (꼭 변경해야 하는 것은 아닙니다;)

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

 

그리고 법률개정안 문서는 아래와 같이 임의로 작성해보았습니다.

성의없이 만든 샘플문서..

전체 코드는 아래와 같습니다.

"""
데이터사전의 키에 해당하는 단어를 선택해서
메모고침표를 삽입하고, 그 안에 데이터사전의 대체텍스트를 입력함.
"""
import os

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

과정보기 = True

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


def 시작(과정보기=True):
    """
    아래아한글을 여는 함수.
    백그라운드에서 작업하려면 과정보기 파라미터를 False로 선택하면 됨
    :return: hwp 오브젝트
    """
    hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")  # 아래아한글 열기
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")  # 보안모듈 실행, 별도작업 필요
    hwp.XHwpWindows.Item(0).Visible = 과정보기  # 숨김해제(기본적으로 숨김상태에서 시작함)
    return hwp


def 찾아가기(단어):
    """
    파라미터로 입력된 "단어"로 이동하는 함수. 전방향 탐색.
    문서 전체 탐색이 완료되면 hwp.SelectionMode가 0이 됨.
    그 전까지는 계속해서 선택상태임(hwp.SelectionMode == 1)
    이를 활용해 한 바퀴 돌고 딱 마칠 수 있음.
    :param 단어: str 
    :return: None
    """
    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 메모고침표삽입(선택단어):
    """
    선택한 단어 범위에 메모고침표를 삽입하는 코드.
    한/글에서 일반 문자열을 삽입하는 코드와 크게 다르지 않다.
    :param 선택단어: str 
    :return: None
    """
    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__':  # 코드가 실행되는 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:  # 한바퀴 돌기 전까지는 1로 유지되다가, 처음위치로 돌아오면 0이 됨.
                단어위치[hwp.GetPos()] = 단어  # 위치튜플을 키로, 단어를 값으로 사전 생성
            else:  # 처음위치로 돌아왔으면
                break  # while문 종료

    for 위치 in sorted(단어위치.keys()):  # 메모고침표 인덱스가 위에서부터 차례대로 매겨질 수 있게 약간의 트릭 사용.
        hwp.SetPos(*위치)  # "위치"는 3개의 정수로 이루어진 튜플인데, 이를 언패킹(*)해서 바로 해당위치로 이동할 수 있음.
        for _ in range(len(단어위치[위치])): hwp.Run("MoveSelLeft")  # 단어길이만큼 왼쪽으로 선택이동(단어 선택).  
        메모고침표삽입(단어위치[위치])  # 선택한 범위에 메모고침표 삽입 

파이참에서 Ctrl-Shift-F10으로 위의 코드를 실행해보겠습니다.

실행결과는 아래와 같습니다.

위에서부터 고침표 번호가 매겨집니다.

아래는 대략 완성된 모습입니다. 해당 단어에 교정부호가 붙고, 우측에 메모처럼 고침표가 생성되었습니다.

이해가 안 되는 부분이나, 제안 등이 있다면

댓글이나 메일로 알려주시기 바랍니다.

 

감사합니다.

 

 

 


donaricano-btn

댓글0