안녕하세요? 강의에서 예문으로 "통칙"이 있는데 제가 하고 싶은 것은 제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파일 : 건축물관리법시행령(법제처 다운로드, 부칙 삭제 등)
pyinstaller -F 로 컴파일한 실행파일
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
각각의 셀너비, 높이를 다르게 표를 생성하는 코드 (0) | 2020.12.06 |
---|---|
현재 셀의 사이즈 알아내기/변경하기 (0) | 2020.11.30 |
2019년 파이콘 참석영상(코알못 직장인) (0) | 2020.08.17 |
댓글