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

조항 재정렬하기("제?조(조항명)"의 경우)

by 일코 2020. 12. 6.

안녕하세요? 강의에서  예문으로 "통칙"이 있는데 제가 하고 싶은 것은 제1조, 제2조 제3조등이 쭉....수십개 있습니다. 그 중 예로 제3조와 제 4조 사이에 한 두개의 조항이 추가되면 이후 끝까지 조번호가 바뀌는 작업을 일일이 손으로 했습니다. 한글에서 스크립트 작성을 해 봐도 이것이 자동으로 할 수 없기에. 파이썬을 사용하면, 가능할지. 선생님의 강의를 보고는 통칙 예제가 있어 감히 조언 받고자 문의 드립니다. 이 글 보실런가 모르겠지만...꼭 보시고...도움 주시면 정말 고맙겠습니다. 제 메일은 xxx123@xavier.com 입니다. 감사합니다.

라는 문의메일을 며칠 전에 받았습니다.

저도 예전 부서에서 기술기준 검토업무를 한 적이 있어서 이런 업무를 맡은 적이 있었습니다. 당시에는 몇조 뿐만 아니라 항이나 호, 반괄호까지 전부 훑어야 했고, 조문 내에 타 조문을 인용하는 게 참 많아서.. 조문번호가 바뀜에 따라 인용조문 번호도 바꾸는... 하여튼 귀찮은 일을 날로해먹으려는 엄청난 욕망이 저를 사로잡고 있었습니다.

하여튼 이번에 도움 드린 코드는 아래와 같습니다.

1. tkinter로 해당 hwp 파일을 선택한다.

2. "제?조("로 시작하는 부분을 정규식으로 찾아서

3. 기존 번호는 무시하고 차례대로 "제1조(", "제2조(" 식으로 모두 찾아 바꾼다.

구현영상은 아래와 같고,

아래에 전체 코드를 적어두었습니다.

업무에 필요하신 분들은 참고해 주시기 바랍니다.

조항재정렬하기 코드실행화면(움짤)

 

조항 재정렬 코드 실행화면 동영상
from tkinter import Tk
from tkinter.filedialog import askopenfilename
import re
import win32com.client as win32


def hwp_find_replace(find_string, replace_string):
    hwp.Run("MoveSelNextWord")
    hwp.HAction.GetDefault("ExecReplace", hwp.HParameterSet.HFindReplace.HSet)  # 한/글 특성상 부득이하게 두두번번 실실행행
    hwp.HParameterSet.HFindReplace.Direction = hwp.FindDir("Forward")
    hwp.HParameterSet.HFindReplace.FindString = find_string
    hwp.HParameterSet.HFindReplace.ReplaceString = replace_string
    hwp.HParameterSet.HFindReplace.ReplaceMode = 1
    hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
    hwp.HParameterSet.HFindReplace.FindType = 1
    hwp.HAction.Execute("ExecReplace", hwp.HParameterSet.HFindReplace.HSet)
    hwp.HAction.GetDefault("ExecReplace", hwp.HParameterSet.HFindReplace.HSet)
    hwp.HParameterSet.HFindReplace.Direction = hwp.FindDir("Forward")
    hwp.HParameterSet.HFindReplace.FindString = find_string
    hwp.HParameterSet.HFindReplace.ReplaceString = replace_string
    hwp.HParameterSet.HFindReplace.ReplaceMode = 1
    hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
    hwp.HParameterSet.HFindReplace.FindType = 1
    hwp.HAction.Execute("ExecReplace", hwp.HParameterSet.HFindReplace.HSet)
    hwp.Run("Cancel")


def hwp_init(filename):
    hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    hwp.Open(filename)
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.HAction.Run("FrameFullScreen")
    return hwp


def hwp_replace(hwp):
    hwp.InitScan()
    조항번호 = 1
    while True:
        text = hwp.GetText()
        if text[0] == 1:
            break
        else:
            if re.match(r"^제\d+조\(?", text[1]) and text[1].startswith(f"제{조항번호}조("):
                조항번호 += 1
                continue
            elif re.match(r"^제\d+조\(?", text[1]) and not text[1].startswith(f"제{조항번호}조("):
                hwp.MovePos(201)  # moveScanPos : GetText() 실행 후 위치로 이동한다.
                hwp.HAction.Run("MoveLineBegin")
                hwp_find_replace(re.match(r"^제\d+조\(?", text[1]).group(0), f"제{조항번호}조(")
                조항번호 = 1
                hwp.InitScan()
            else:
                pass
    hwp.ReleaseScan()
    hwp.MovePos(2)


if __name__ == '__main__':
    root = Tk()
    filename = askopenfilename()
    root.destroy()

    hwp = hwp_init(filename=filename)
    hwp_replace(hwp)

 

 

억지로 구조화한다고 함수도 막 만들고, main 부분도 만들었는데, 우리 회사원들에게는 오히려 복잡해 보일 수 있을 것 같습니다ㅜ.. 욕심 같아서는 추가설명드릴 부분이 참 많은데, 본문이 길어질까봐 생략합니다. 혹시 이해가 안 되시는 부분이 있으면 언제든 댓글 남겨주시기 바랍니다.

감사합니다.

행복한 하루 되세요!!

 


영상 속 HWP파일 : 건축물관리법시행령(법제처 다운로드, 부칙 삭제 등)

[예시]건축물관리법 시행령(대통령령)(제31194호)(20201204).hwp
0.31MB

pyinstaller -F 로 컴파일한 실행파일

조항번호정렬.zip
1.05MB
조항번호정렬.z01
10.00MB

댓글