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

[최종]아래아한글 문서교정 기능을 파이썬으로 구현해보기

by 일코 2022. 2. 1.

이전 포스팅에서는 메일머지로...

이전 포스팅에서는

메일머지를 활용한 엑셀문서 교정DB를

한/글 문서에 적용하는 방법에 대해 알아보았습니다.

 

한/글 문서의 단순교정 매크로를 메일머지로!!??

원문 출처는 폴리텍대학 서울강서캠퍼스 출판디자인과 | 아래한글 단순 교정 매크로 - Daum 카페 아래한글 단순 교정 매크로 단순 교정 매크로 작성 방법에 대하여 !--[if !supportEmptyParas]--!--[endif]--

martinii.fun

 

조금 의외의 방법으로 느껴지실 수도 있지만

외부 프로그램을 활용하지 않고,

메일머지와 스크립트매크로만 활용해서

전체 찾아바꾸기를 구현하신 분의 노하우를 공유했습니다.


이번 포스팅에서는 파이썬으로!

이번에는 조금 더 쉽고 간단하게

파이썬으로 스크립트매크로 함수를 만들어서

작업하는 방법을 보여드리겠습니다.

 

우선 엑셀 교정표 파일은 아래와 같습니다.

따라해보고 싶은 분들은 아래 첨부된 엑셀파일을 다운로드해주시기 바랍니다.

예시입니다.
교정리스트.xlsx
0.01MB


교정할 한글 문서는 아래와 같습니다.

교정할 한/글 문서 예시입니다.
오빠는_아무_것도_몰라.hwp
0.02MB


파이썬에서 함수로 래핑할 기능은 두 가지,

①교정표 엑셀파일을 파이썬으로 불러오는 함수

②한/글 찾아바꾸기 함수입니다. (찾아바꾸기는 지난 포스팅에서 스크립트로 진행해본 적 있었죠.)

 

하나씩 구현해본 후에 전체 프로그램을 만들어보겠습니다.

 

1. 엑셀파일을 파이썬 dict 자료형으로 불러오기

엑셀파일도 한/글을 불러올 때와 동일하게 pywin32 모듈을 이용해봅시다.

데이터를 파이썬 사전자료형으로 옮겨오는 전체 코드는 아래와 같습니다.

import win32com.client as win32

엑셀 = win32.gencache.EnsureDispatch("Excel.Application")
엑셀.Visible = True
워크북 = 엑셀.Workbooks.Open(r"C:\Users\smj02\Desktop\교정리스트.xlsx")
워크시트 = 워크북.Worksheets(1)

교정데이터 = 워크시트.UsedRange()[1:]  # 제목행은 제외하고 두 번째 행부터
교정사전 = {i: j for i, j in 교정데이터}

엑셀.Quit()

조금씩 실행하면서 결과가 올바른지 확인해봅시다.

엑셀을 열고 교정표 파일을 열었습니다.
UsedRange로 튜플 데이터를 받았습니다. 제목행을 제외하기 위해 [1:] 인덱싱을 했습니다. 
교정사전을 dict 자료형으로 생성했습니다.

교정사전은 아래와 같이 dict 자료형으로 생성되었습니다.

>>> 교정사전

{'아무 것 ': '아무것',
 '알아 주': '알아주',
 '알아 줘': '알아줘',
 '알아 줬': '알아줬',
 '알아 줄': '알아줄',
 '필요없': '필요 없'}

자료형을 찬찬히 읽어보시면,

찾을 값이 "키"로, 변경할 값이 "값"으로 지정된 게 보이시죠?

for문을 돌릴 때 교정사전.items()를 사용하면 아주 수월하겠네요.

>>> 교정사전.items()

dict_items([('아무 것 ', '아무것'), 
            ('알아 주', '알아주'), 
            ('알아 줘', '알아줘'), 
            ('알아 줬', '알아줬'), 
            ('알아 줄', '알아줄'), 
            ('필요없', '필요 없')])

사전.items() 메서드는 0번 인덱스를 "키", 1번 인덱스를 "값"으로 하는 튜플 리스트라는 걸 기억해 두시기 바랍니다.


2. 찾아바꾸기 함수 만들기

찾아바꾸기 함수는 직전 포스팅에서도 간단히 다루었지만,

스크립트 녹화에서부터 파이썬 함수를 만드는 과정까지 상세히 보여드리겠습니다.

 

① 스크립트 녹화를 시작합니다. (Shift-Alt-H)

 

② 찾아바꾸기를 한 번 실행합니다. (Ctrl-H)

어휘 뿐만 아니라, 음영도 변경할 예정입니다.

 

③ 스크립트 녹화를 종료합니다. (Shift-Alt-X)

 

④ 녹화된 스크립트를 클립보드로 복사합니다. (Shift-Alt-L)

 

⑤ 복사한 스크립트를 파이참 편집창에 붙여넣고, 문법에 맞게 수정합니다.

 

편집 전의 자바스크립트 함수는 아래와 같습니다.

function OnScriptMacro_script5() {
    HAction.Run("Cancel");
    HAction.GetDefault("AllReplace", HParameterSet.HFindReplace.HSet);
    with (HParameterSet.HFindReplace) {
        MatchCase = 0;
        AllWordForms = 0;
        SeveralWords = 0;
        UseWildCards = 0;
        WholeWordOnly = 0;
        AutoSpell = 1;
        Direction = FindDir("AllDoc");
        IgnoreFindString = 0;
        IgnoreReplaceString = 0;
        FindString = "아무 것";
        ReplaceString = "아무것";
        ReplaceCharShape.ShadeColor = RGBColor(255, 132, 58);
        ReplaceMode = 1;
        IgnoreMessage = 1;
        HanjaFromHangul = 0;
        FindJaso = 0;
        FindRegExp = 0;
        FindStyle = "";
        ReplaceStyle = "";
        FindType = 1;
    }
    HAction.Execute("AllReplace", HParameterSet.HFindReplace.HSet);
}

 

편집 후의 파이썬 스크립트는 아래와 같습니다.

hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet)
hwp.HParameterSet.HFindReplace.MatchCase = 0
hwp.HParameterSet.HFindReplace.AllWordForms = 0
hwp.HParameterSet.HFindReplace.SeveralWords = 0
hwp.HParameterSet.HFindReplace.UseWildCards = 0
hwp.HParameterSet.HFindReplace.WholeWordOnly = 0
hwp.HParameterSet.HFindReplace.AutoSpell = 1
hwp.HParameterSet.HFindReplace.Direction = hwp.FindDir("AllDoc")
hwp.HParameterSet.HFindReplace.IgnoreFindString = 0
hwp.HParameterSet.HFindReplace.IgnoreReplaceString = 0
hwp.HParameterSet.HFindReplace.FindString = "아무 것"
hwp.HParameterSet.HFindReplace.ReplaceString = "아무것"
hwp.HParameterSet.HFindReplace.ReplaceCharShape.ShadeColor = hwp.RGBColor(255, 132, 58)
hwp.HParameterSet.HFindReplace.ReplaceMode = 1
hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
hwp.HParameterSet.HFindReplace.HanjaFromHangul = 0
hwp.HParameterSet.HFindReplace.FindJaso = 0
hwp.HParameterSet.HFindReplace.FindRegExp = 0
hwp.HParameterSet.HFindReplace.FindStyle = ""
hwp.HParameterSet.HFindReplace.ReplaceStyle = ""
hwp.HParameterSet.HFindReplace.FindType = 1
hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet)

 

길어 보이지만 아래처럼 함수로 정의하기만 하면 매번 한 줄로 호출할 수 있게 됩니다.

def 한글_찾아바꾸기(찾을말, 바꿀말, r, g, b):
    hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet)
    hwp.HParameterSet.HFindReplace.MatchCase = 0
    hwp.HParameterSet.HFindReplace.AllWordForms = 0
    hwp.HParameterSet.HFindReplace.SeveralWords = 0
    hwp.HParameterSet.HFindReplace.UseWildCards = 0
    hwp.HParameterSet.HFindReplace.WholeWordOnly = 0
    hwp.HParameterSet.HFindReplace.AutoSpell = 1
    hwp.HParameterSet.HFindReplace.Direction = hwp.FindDir("AllDoc")
    hwp.HParameterSet.HFindReplace.IgnoreFindString = 0
    hwp.HParameterSet.HFindReplace.IgnoreReplaceString = 0
    hwp.HParameterSet.HFindReplace.FindString = 찾을말
    hwp.HParameterSet.HFindReplace.ReplaceString = 바꿀말
    hwp.HParameterSet.HFindReplace.ReplaceCharShape.ShadeColor = hwp.RGBColor(r, g, b)
    hwp.HParameterSet.HFindReplace.ReplaceMode = 1
    hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
    hwp.HParameterSet.HFindReplace.HanjaFromHangul = 0
    hwp.HParameterSet.HFindReplace.FindJaso = 0
    hwp.HParameterSet.HFindReplace.FindRegExp = 0
    hwp.HParameterSet.HFindReplace.FindStyle = ""
    hwp.HParameterSet.HFindReplace.ReplaceStyle = ""
    hwp.HParameterSet.HFindReplace.FindType = 1
    hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet)

⑥ 위 함수를 테스트해보겠습니다.

먼저 한/글을 열고 파일을 불러왔습니다.

정의한 함수를 실행해보겠습니다.

찾아바꾸기가 잘 실행되네요.


3. 파이썬 프로그램 완성하기

위의 두 가지 기능과 for문 등을 활용해서 교정표 적용하기 프로그램을 만들어보았습니다.

간단히 tkinter로 파일을 선택하는 GUI를 넣었는데, 이 부분에 대한 설명은 생략하겠습니다.

 

최종 실행화면은 아래와 같습니다.

의도대로 잘 작동하네요. 끝.

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

import os  # 파일과 폴더이름을 다루기 편한 모듈
from tkinter import Tk  # 내장 GUI, 실행이 간편함
from tkinter.filedialog import askopenfilename  # 2개의 파일 선택창
import win32com.client as win32


def 교정사전_불러오기(엑셀파일):
    엑셀 = win32.gencache.EnsureDispatch("Excel.Application")
    엑셀.Visible = True
    워크북 = 엑셀.Workbooks.Open(엑셀파일)
    워크시트 = 워크북.Worksheets(1)

    전체값 = 워크시트.UsedRange()[1:]  # 제목행 제외
    교정사전 = {i: j for i, j in 전체값}
    엑셀.Quit()
    return 교정사전.items()


def 한글_열기(한글파일, visible=True):
    한글 = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    한글.XHwpWindows.Item(0).Visible = visible
    한글.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    한글.Open(한글파일)
    return 한글


def 한글_찾아바꾸기(찾을말, 바꿀말, r, g, b):
    한글.HAction.GetDefault("AllReplace", 한글.HParameterSet.HFindReplace.HSet)
    한글.HParameterSet.HFindReplace.AutoSpell = 1
    한글.HParameterSet.HFindReplace.Direction = 한글.FindDir("AllDoc")
    한글.HParameterSet.HFindReplace.FindString = 찾을말
    한글.HParameterSet.HFindReplace.ReplaceString = 바꿀말
    한글.HParameterSet.HFindReplace.ReplaceCharShape.ShadeColor = 한글.RGBColor(r, g, b)
    한글.HParameterSet.HFindReplace.ReplaceMode = 1
    한글.HParameterSet.HFindReplace.IgnoreMessage = 1
    한글.HParameterSet.HFindReplace.FindType = 1
    한글.HAction.Execute("AllReplace", 한글.HParameterSet.HFindReplace.HSet)


if __name__ == '__main__':
    root = Tk()  # GUI 실행하고
    엑셀파일_경로 = askopenfilename(title="교정표 엑셀 파일을 선택해주세요.",
                              initialdir=os.getcwd(),
                              filetypes=[("엑셀파일", "*.xls *.xlsx *.hcell")])
    
    한글파일_경로 = askopenfilename(title="교정한 한/글 파일을 선택해주세요.",
                              initialdir=os.getcwd(),
                              filetypes=[("아래아한글파일", "*.hwp *.hwpx")])
    root.destroy()  # GUI 종료

    교정사전 = 교정사전_불러오기(엑셀파일_경로)
    한글 = 한글_열기(한글파일_경로)
    for i, j in 교정사전:
        한글_찾아바꾸기(i, j, 255, 132, 58)

 

여러분의 PC에서도 잘 실행될는지요?

pyinstaller로 컴파일해서 업로드해봅니다. (pyinstaller -F -w 엑셀교정표적용프로그램.py)

12메가 조금 넘네요.

엑셀교정표적용프로그램.zip
12.68MB

 

마치며

프로그램 제작과 튜토리얼 제작은

확실히 다른 분야입니다.

이대로 사용하기에는 손보고 싶은 부분이 너무 많은데

코드가 길어지면 이해하기도 어려워지는 것 같고요.

예외처리 등 보태고 싶은 부분이 많지만

코드도 모두 공개해 두었으니

살도 붙여보고 군더더기도 빼 보고 하면서

여러분의 업무자동화에 자유롭게 적용해 보시길 바랍니다.

 

이걸로 단순교정 관련 튜토리얼 시리즈를 마치겠습니다.

수고하셨습니다.

댓글