안녕하세요?
파이썬으로 아래아한글 작업을 자동화하는 예제들 중에
입문용으로 적당한,
"자간 자동조정 프로그램"의 소스코드를 공개해봅니다.
업무자동화 분야를 제법 오랫동안 공부하고
강의를 해 본 입장에서,
아래아한글 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 hwp
def 파일선택():
"""
파일선택 함수
"""
filelist = askopenfilenames(title="자간을 조정할 한/글문서를 모두 선택해주세요.",
initialdir=os.getcwd(),
filetypes=[("한/글 파일", "*.hwp *.hwpx")])
return filelist
def 현재선택영역_글자수():
"""
자간자동조정 함수에서
라인 끝에 걸쳐진 단어의
앞뒤길이를 각각 계산하기 위함.
"""
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
정부부처, 공공기관 및 민간 교육기관(학원) 분들,
특히 업무를 위해 아래아한글을 지독하게 많이 사용하시는
분들에게는 업무를 효율화하는 데 매우 큰 도움이 됩니다.
특히 최근에는 실제 적용사례와 질문 위주로
동영상 강의를 수시 업데이트하고 있어
업무에 자동화를 적용하고자 하는 분들에게
좋은 레퍼런스가 될 것으로 생각합니다.
강의링크는 아래에 붙여둡니다.
그럼 행복한 하루 보내세요^^
감사합니다. 행복한 하루 되세요!!^^
/Vollago
여튼 이른아침 댓글 넘 감사합니다. 행복한 하루 되세요!!^^
댓글 감사합니다. 행복한 하루 되세요^^
행복한 하루 되세요!ㅎ
스킬이 어쩌고를 떠나서, 많이 써주시는 프로그램이 좋은 프로그램인 것 같습니다.
좋게 봐주셔서 감사합니다^^ 행복한 하루 되세요!!
감사하고 죄송합니다. 초반 이론이 굉장히 지루합니다..
요점만 후딱 읽으시고 나서, taligent님이 자동화하고자 하는 업무를 하나 알려주시면
짤막한 강의영상을 맞춤형으로 만들어서 제공해드리겠습니다.
그리고 생축 감사합니다ㅎㅎㅎㅎ 행복한 하루 되세요^^
코딩은 그럭저럭 하게 되었는데, 제가 아이디어가 많이 부족합니다.
(위 프로그램도 어느 커뮤니티 분의 질문 덕분에 제작하게 되었습니다.)
또 자동으로 처리했으면 하는 업무 있으면 언제든지 자유롭게 말씀해주세요!ㅎ
한 번 더 게시판에 공유하도록 하겠습니다^^
행복한 하루 되세요!!!
안그래도 자간조정 프로세스가 "띄어쓰기" 하나에만 의존하다 보니
문서가 심하게 들쭉날쭉해지는 경향이 있습니다.
남겨주신 댓글들 참고해서 조만간 보완을 해보겠습니다ㅎㅎ
감사합니다. 행복한 하루 되세요^^
혹시 수강하시게 되면, 꼭 하늘아래서님이 자동화하고 싶은 업무 하나 알려주세요!
맞춤형 짤막한 강의 업로드해놓을게요ㅎ
행복한 하루 되세요^^
감사히 사용하겠습니다.
(예문에서는 이 부분이 좀 어색하네요. )
그리고, 두 번째 라인은 테스트케이스를 위해 임의로 강제줄바꿈을 넣어 둔 상태입니다. ("모든"↓)
유용하게 써주시면 감사하겠습니다^^
행복한 하루 되세요!
참, 그리고 이 프로그램도 잘린 단어 앞뒤 길이를 재서 늘이거나 줄이거나 두 가지 다 쓰기는 합니다^^;
감사합니다.
댓글 남겨주셔서 감사해요ㅎ 행복한 하루 되세요^^
정말 유용할 것 같습니다. 열심히 배워서 잘 쓰겠습니다!!
격무에 너무 에너지 허비하지 마시고, 행복한 하루 되세요!!ㅎㅎㅎ
강의 들어보시면 "그럼 그렇지.." 싶으실 수도 있는데ㅜ
초반 지루한 부분은 후딱후딱 넘어가시고,
별님이 자동화하고 싶은 업무를 하나 알려주시면
해당 내용으로 짤막한 맞춤강의 챕터를 하나 만들어드릴게요.
제가 스킬은 좀 붙은 것 같은데, 아직도 아이디어가 꽝이어서
도와주시면 감사하겠습니다^^
행복한 하루 되세요!
파이썬 이제 시작한 사람인데.. 이런걸 만들 수 있는 것이군요!
파이썬이 비하되는 것 같아 마음이 무겁습니다.
이런 것 말고도 정말 수많은 것들을 파이썬으로 하실 수 있습니다.
업무자동화는 극히 일부분이지만,
일과 중에 한/글이나 엑셀을 많이 사용하신다면
업무자동화를 배워보셔도 좋을 것 같습니다.
가슴 두근거리는 댓글 감사합니다.
행복한 하루 되세요^^
코드를 몇 시간 동안 짜고 앉아도, 봐주는 이가 없으면 무용지물인데
이렇게 격하게 반응해주셔서 몸둘 바를 모르겠습니다.
예쁜 댓글 넘 감사합니다^^ 행복한 하루 되세요!!!
"간단한데 하기 싫은 업무"가 은근히 사람 힘을 뺏는 업무 같아요^^;
수강 감사드려요ㅎ
모든 챕터를 다 보실 필요는 없고,
초반 기초만 후다닥 읽으신 다음에
깊은바람님이 자동화하고 싶으신 업무를 나중에 알려주시면
텍스트로든 영상으로든 맞춤형 챕터를 하나 만들어 추가해드릴게요.
(대신 예시문서는 공개 가능한 걸로^^)
멋진 댓글 달아주셔서 감사합니다.
편안한 밤 되세요!!!ㅎ
광고성이 다분한 글이라, 비방이나 차단을 당할 줄 알았는데
따뜻하게 댓글 남겨주셔서 제가 도리어 감사합니다ㅜ
저도 누군가에게 따뜻한 사람이 되기 위해 앞으로 노력하겠습니다.
행복한 하루 되세요^^
격하게 반응해주셔서 감사합니다.
한 번 더 놀라실 수 있게, 더 좋은 자동화 꼭지 생기면
강좌게시판에 남겨보겠습니다.
행복한 하루 되세요^^
(역시 업무 DRM 환경에선 안되는 듯 합니다. ㅠㅜ)
아이고, 이게 뭐라고 잘 보았다고 따뜻한 댓글을 남겨주셔서..
넘 감사합니다^^ 저도 마음이 훈훈해집니다ㅎ
행복한 하루, 편안한 밤 보내세요!!ㅎㅎㅎ
바이러스 관련 해결방법을 찾아보고 댓글로 알려드리겠습니다^^
행복한 하루 되세요!
다만 저희 일터 정책상 업무망에 반입할 방법이 없..
과기정통부나 행안부 근무하시는 서기관 분들께도 직접 출장 가서 자료전송으로 넣어 드린 적이 있었거든요.
그리고 저도 공기업 7년 정도 근무하면서, 파이썬, 파이참 깔고 온갖 모듈 설치해서 업무 많은 부분을 자동화한 경험이 있습니다.
외부망은 Read only고요 ㄷㄷㄷ
방법은 뭐.....찾아야겠죠 :)
1. 자료전송 하실 때 ".exe"를 ".ex" 나 ".hwp" 등으로 확장자만 변경하신 후,
다른 문서파일 하나랑 같이 압축해서 자료전송 해보세요^^
2. 보안툴 때문에 윈도우탐색기에서 확장자 변경이 안 되면
해당 폴더에서 커맨드프롬프트 여신 다음에
"rename 파일명.exe 파일명.hwp" 식으로 커맨드 실행하시면 변경될 거예요.
(이런 거 알려드려도 되나.... 싶네요..)
.zzz .www 이렇게 넣어도 다아 잡더라고요.
잘 쓰겠습니다
써주는 사람이 있으면, 코딩 하는 사람 입장에서 가장 보람을 느끼게 되는 것 같습니다.
이 느낌, 중독돼버릴 것 같네요ㅎㅎㅎ
따뜻한 댓글 감사합니다.
행복한 하루, 편안한 밤 되세요^^
정작 MS Office 는 자기들 기술임에도 아래아 한글에 비하면 API 지원이 너무 빈약하죠.
그래도 고생 좀 하셨겠습니다. ^^
한 가지 섭섭한 점은, 이 정도 수준의 매크로(요즘은 RPA라고들 부르는?) 기능이
무려 15년 쯤? 전부터 완성되어 있었는데,
그 오랜 세월 동안 그룹웨어나 솔루션 개발자들 위주로만 사용되어 왔다는 점입니다.
그나마 파이썬 덕분에
직장인들이 개개인의 소규모 업무를 자동화할 수 있는 시대가 오고 있는 것 같습니다.
여튼 댓글 감사합니다^^ 즐건하루 되세요!
찐블루님을 포함해서 오늘 수강신청해주신 분들이 많아서 기쁨 반 긴장 반입니다.
수강 팁을 드리면,
1. 앞부분 텍스트+움짤 파트는 빠르게 읽고 넘어가시고 (나중에 돌아와서 찾아볼 셈 치고)
2. 동영상 강의는 찐블루님 업무와 관계가 없겠다 싶으면 안 들으셔도 됩니다.
3. 질문게시판에 찐블루님의 업무 중 자동화하고 싶은 내용을 대략 알려주시거나
메일로 예시문서와 함께 설명을 보내주시면, 해당 강의를 짤막하게 영상으로 만들어서
업데이트를 해 놓겠습니다.
부디 좋은 경험 하시게 되기를 바라겠습니다^^
감사합니다. 행복한 하루 되세요!!ㅎㅎㅎ
텍스트+움짤 콘텐츠가 다소 호불호가 있는 것 같어서ㅜ
지금 런칭예정인 파이썬+엑셀 강의는 전부 동영상으로만 제공할 예정입니다ㅋ
(사실 처음으로 움짤에 긍정적인 피드백을 주셨어요^^)
감사합니다. 인면조님도 행복한 하루 보내세요ㅎㅎㅎ
남겨주신 댓글 읽고 너무 기쁩니다^^
아무리 코드를 잘 짜놓아도
써주는 이가 없고 봐주는 이가 없으면
무용지물인데
이렇게 긍정적인 반응들 주셔서
오늘 하루종일 두근두근 했답니다ㅎ
감사합니다.
밤구름님도 행복한 하루 되세요^^
짝짝짝!!!
오늘 하루 정말 크나큰 관심과 사랑을 주셔서 넘 행복합니다.
다음에도 좋은 아이디어로 업무자동화 프로그램 짜서
한 번 더 공유하겠습니다^^
맥피아님도 행복한 하루 보내세요!!ㅎ
저를 믿고 팍 질러주셔가지고.. 몸둘 바를 모르겠습니다.
제 모든 강의를 정주행하실 필요는 없습니다.
앞부분 텍스트는 빠르게 읽고 넘어가시면 되고,
후반부 동영상 강의는 업무와 연관이 없으면 굳이 보실 필요가 없을 것 같습니다.
나중에, "이런 업무도 자동화할 수 있을까?" 라는 생각이 드시면
질문게시판에 한 번 남겨주세요. 기왕이면 샘플문서도 같이요.
그럼 제가 구체적으로 맞춤형으로 짤막한 강의영상을 하나 만들어드릴게요.
꼭 남겨주세요^^
행복한 하루 되세요!
감사의 마음과 함께 수강 신청도 하였습니다.
아름다운 댓글 감사합니다. 신세계라고 불러주시니 몸둘 바를 모르겠습니다.
본문에는 러닝커브가 완만하다고 적어 두었지만,
파이썬 기초부터 아래아한글 자동화까지는 시간도 다소 걸리고
또 지루한 과정을 조금씩 넘어야 하는 것 같습니다.
직접 자기 업무를 코드로 자동화해보는 경험이
그나마 활력소가 되는 것 같아서
강의 수강해주신 분들께는 맞춤형으로
짤막한 강의를 만들어드립니다.
강의 새소식 게시판 참고하시고
메일이나 질문게시판으로
자동화하고 싶은 내용을 꼭 알려주세요ㅎ
답변영상으로 공부하시면 동기부여가 조금 더 잘 되지 않을까 생각합니다^^
행복한 하루 되세요!!
솔직히 코드 작성할 때는 "수고한다"는 느낌이 조금 있었는데,
이렇게 따뜻하게 반응해주시고, 긍정적인 피드백 주시고,
또 많은 분들이 수강을 해주셔서
오늘 하루종일 너무 행복했습니다.
이런 수고라면 매일이라도 할 수 있겠어요^^
감사합니다. 행복한 하루 되세요!!ㅎ
수강신청해주시고, 기분좋은 댓글 남겨 주셔서
오히려 제가 감사합니다!
꼭 강의 질문게시판이나 메일로
마법사3님이 자동화하고 싶은 업무를 알려주세요^^
제가 맞춤형으로 짤막한 강의챕터 하나 만들어드릴게요.
행복한 하루 되세요^^
엑셀 VBA로 한글을 만드는 자료를 공개하신 블로그를 보고 열심히 공부하다가,,,,하다가... ㅠㅠ
이번엔 제대로 공부해보고 싶습니다.
쿠폰 사용하여 등록하였습니다.
감사합니다.
조만간 엑셀 강의도 런칭하게 될 것 같은데,
역시 가장 많이 활용하는 업무자동화 프로젝트는
엑셀-아래아한글 연동인 것 같습니다.
수강해주셔서 감사합니다!ㅎ
편안한 밤 되세요^^
아래아한글 자동화는 사실 파이썬 기본문법 정도만 알고 있으면 구현이 크게 어렵지 않습니다.
파이썬 기초와 병행해서 학습하시는 방식을 추천드립니다^^
기분좋아지는 댓글 감사합니다.
편안한 밤 되세요!ㅎㅎ
그리고 카피라이트가 어떻게 되는지 명시해 주시면 감사하겠습니다. 직원들에게 널리 공유하고 싶습니다.
+ 의견
1. hwpx 파일은 지원이 안되네요. 같은 내용을 형식을 바꿔 저장해 보며 확인했습니다.
2. 위에 이야기 나온 것 처럼 가운데점, 하이픈, 괄호 등을 기준으로 끊으면 좀 더 좋아질 것 같습니다.
1. 헉, 이 부분은 제 코드에 버그가 있었습니다.
문서를 열 때 포맷을 "HWP"로 고정해놔서 발생한 오류로 보입니다.
소스코드와 첨부파일 모두 수정해놓았습니다^^
2. 인사이트 감사합니다. 역시 스킬이 99%라도 1%의 아이디어가 없으면 도루묵인 것 같습니다.
무쟈게 잘 사용하겠습니다~