안녕하세요?파이썬으로아래아한글문서자간자동조정프로그램을만들어보았습니다클리앙
파이썬으로 아래아한글 작업을 자동화하는 예제들 중에
입문용으로 적당한,
"자간 자동조정 프로그램"의 소스코드를 공개해봅니다.
업무자동화 분야를 제법 오랫동안 공부하고
강의를 해 본 입장에서,
아래아한글 API는
타 오피스 프로그램에 비하면
러닝커브가 시종일관 완만한 편에 속하는 것 같습니다.
(물론... 아주 고급 기능까지 자동화하지 않는 선에서요.)
간단한 수작업 프로세스를 구현하는 경우에는
"스크립트 매크로 녹화"기능 덕분에
쉽고 빠르게 코드로 옮겨 실행할 수 있고요.
스크립트매크로를 파이썬에서 실행하면
파이썬의 강력한 모듈들을 활용할 수 있게 되죠.
단순 업무자동화를 넘어서
ChatGPT나 Dall-E API를 연동해서 문서를 작성할 수도 있고요.
(마침 오늘 ChatGPT API가 공개되었더라고요.)
자간조정 작업은
눈도 많이 굴려야 하고, 손이 많이 가는데다,
문서 분량에 비례해서 다소 많은 시간을 잡아먹는
아이러니한 단순업무입니다.
정작 자간조정 따위로
보고서 퀄리티는 그다지 높아지지 않는데,
팀장님들이 빨간펜으로 지적하기 가장 쉬운 먹잇감이기도 하지요ㅜㅜㅜㅜㅜㅜㅜㅜㅜ
서론이 너무 길었네요.
시연화면을 먼저 보여드리고,
녹화 2023 03 02 11 16 38 471 - YouTube
다소 지루한 소스코드 전체를 먼저 보여드려봅니다.
한/글의 스크립트매크로를 써 보신 분들은
대부분의 코드가 익숙할 거라고 생각합니다.
import os # 파일 경로를 다루기 위한 모듈from tkinter.filedialog import askopenfilenames # 파일 선택창을 띄우기 위한 모듈import win32com. client as win32 # 아래아한글을 열기 위한 모듈def 한글_시작(): """ 아래아한글을 시작하는 함수 """ hwp = win32.Dispatch("hwpframe.hwpobject") # 한/글 실행 # hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") # 한/글 실행 hwp.XHwpWindows.Item(0).Visible = True # 한/글 프로그램 백그라운드 해제 hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") # 보안모듈 등록 return hwpdef 파일선택(): """ 파일선택 함수 """ filelist = askopenfilenames(title="자간을 조정할 한/글문서를 모두 선택해주세요.", initialdir=os.getcwd(), filetypes=[("한/글 파일", "*.hwp *.hwpx")]) return filelistdef 현재선택영역_글자수(): """ 자간자동조정 함수에서 라인 끝에 걸쳐진 단어의 앞뒤길이를 각각 계산하기 위함. """ hwp.InitScan(option=None, Range=0xff, spara=None, spos=None, epara=None, epos=None) # 선택한 범위 탐색시작 _, text = hwp.GetText() # 텍스트 추출 hwp.ReleaseScan() # 탐색종료 return len(text) # 추출한 텍스트의 글자수 리턴def 자간자동조정(): """ 모든 라인을 순회하면서 끝에 걸쳐친 단어를 탐색함. 잘린 단어의 앞이 길면 라인 전체의 자간을 줄이고, 잘린 단어의 뒤가 길면 라인 전체의 자간을 늘임. 한 줄 문단이 되거나 걸쳐진 단어가 없으면 종료. """ count = 0 while True: hwp.Run("MoveLineEnd") # 라인의 끝으로 이동해서 hwp.Run("MoveSelWordBegin") # 끝에 걸쳐진 단어의 앞부분만 선택 if count >= 15: print("15% 이상 자간조정으로, 원상복구함") for _ in range(count): hwp.Run("Undo") 앞부분길이 = 현재선택영역_글자수() # 잘린 단어 앞부분 글자수 확인 if 앞부분길이 == 0: # 단어가 잘려있지 않으면 다음 라인으로 넘어감 break hwp.Run("MoveSelWordEnd") # 다음 라인으로 넘어간 부분 선택 뒷부분길이 = 현재선택영역_글자수() # 잘린 단어 뒷부분 글자수 확인 if not (앞부분길이 and 뒷부분길이): # 한 줄 문단이면 넘어감 hwp.Run("Cancel") # 범위선택 해제 hwp.Run("Cancel") # 범위선택 해제 break hwp.Run("MoveWordBegin") hwp.Run("MoveLineEnd") hwp.Run("MoveSelLineBegin") # 라인 전체 선택해서 if 앞부분길이 >= 뒷부분길이: # 잘린 글자 앞부분이 길면? hwp.Run("CharShapeSpacingDecrease") # 라인 자간 -1% else: # 잘린 글자 뒷부분이 길면? hwp.Run("CharShapeSpacingIncrease") # 라인 자간 +1% count += 1 hwp.Run("Cancel")def 컨트롤_내부_자간조정(): """ 표나 글상자 등 텍스트가 들어가는 모든 영역의 자간을 조정하기 위함 """ area = 1 # 본문 외 영역(표, 각주미주, 글상자, 도형 등) while True: area += 1 hwp.SetPos(area, 0, 0) # 해당 영역으로 이동해서 if hwp.GetPos()[0] == 0: # 영역이동 중 본문으로 돌아오면 break # 작업끝. while True: 시작위치 = hwp.GetPos() 자간자동조정() # 영역 첫 번째 라인 자간조정 하고, hwp.Run("MoveLineEnd") hwp.Run("MoveNextChar") # 다음 라인으로 넘어감 if hwp.GetPos()[0] != 0 and hwp.GetPos()[0] >= area: area = hwp.GetPos()[0] print(area) if hwp.GetPos() == 시작위치: break # area += 1 # 다음 영역으로 넘어감def 끝위치추출(): """ 본문 탐색 while문의 종료 조건으로 "문서 끝에 도착하면 반복종료"를 구현하기 위해 문서 끝 위치를 미리 추출해 둠 """ hwp.Run("MoveDocEnd") # 문서 끝으로 이동한 후 end_pos = hwp.GetPos() # 문서 끝 위치(좌표) 저장 hwp.Run("MoveDocBegin") # 다시 문서 처음으로 이동 return end_pos # 저장한 좌표 리턴if __name__ == '__main__': hwp = 한글_시작() # 아래아한글 실행 파일목록 = 파일선택() # 자간 자동조정할 문서 전부 선택 for 파일 in 파일목록: # 문서 하나씩 if 파일.endswith("x"): 확장자 = "hwpx" else: 확장자 = "hwp" hwp.Open(파일, Format=확장자.upper(), arg="") # 한/글에서 열어서 끝위치 = 끝위치추출() # 본문 자간조정 while hwp.GetPos() != 끝위치: 자간자동조정() hwp.Run("MoveLineEnd") hwp.Run("MoveNextChar") # 표 및 글상자 자간조정 컨트롤_내부_자간조정() print("자간조정 작업 끝!") hwp.SaveAs(Path=hwp.Path.replace(f".{ 확장자}", f"(자간조정).{ 확장자}"), Format=hwp.XHwpDocuments.Item(0).Format, arg="")
한/글을 열거나 파일을 선택하는 함수를 제외하면
단 네 개의 함수를 구현해서 프로그램을 완성했습니다.
함수별로 구체적으로 잘라 설명드리면
글이 너무 길어지는 것 같아
각 라인 옆에 주석을 달아 놓았습니다.
(# 뒷부분이 모두 주석입니다.)
컴파일한 실행파일 (.exe)다운받기
실습용 예시문서 다운받기
pyinstaller로 소스코드를 컴파일했는데,
혹시 바이러스가 검출된다는 메시지가 뜨면
무시해 주시길 바랍니다ㅜㅜㅜ
유용하게 써주시면 더더욱 감사하겠고,
테스트해보신 후 예외케이스를 발견하시는 경우
댓글이나 메일(martinii.fun@지메일.com)로 간략히 알려주시면
인프런 아래아한글 자동화 강의(2만원 상당) 무료수강권과,
보완한 소스코드 및 프로그램을 송부드리겠습니다.
감사합니다.
행복한 하루 되세요!!
<3월 3일까지, 강사 생일맞이 인프런 강의 95% 할인쿠폰 대방출 >
인프런 "파이썬+아래아한글 업무자동화" 강의가 개설 두 달째,
감사하게도 80여분의 수강과 함께
평점 만점(5.0/5.0)을 달성 중입니다.
2월 26일, 강사의 마흔번째 생일을 맞아 일주일간 95% 할인된 가격에
아래아한글 업무자동화 입문강의를 수강하실 수 있도록
아래의 쿠폰을 무한정 수량으로 배포합니다.
(인프런에서 이런 할인 싫어할까요...)
9335-01b47712222e
정부부처, 공공기관 및 민간 교육기관(학원) 분들,
특히 업무를 위해 아래아한글을 지독하게 많이 사용하시는
분들에게는 업무를 효율화하는 데 매우 큰 도움이 됩니다.
특히 최근에는 실제 적용사례와 질문 위주로
동영상 강의를 수시 업데이트하고 있어
업무에 자동화를 적용하고자 하는 분들에게
좋은 레퍼런스가 될 것으로 생각합니다.
강의링크는 아래에 붙여둡니다.
그럼 행복한 하루 보내세요^^
https://inf.run/MiK8