본문 바로가기
코딩/자동화

파이썬을 이용해 한글 문서의 자간을 자동으로 조정하는 방법(win32com, 한글매크로)

by 나홀로코더 2021. 11. 25.
반응형

소개


한글 카테고리에 올린 이전 포스팅에서 한글매크로를 소개하면서 자간 조정을 좀더 편하게 하는 매크로를 예제로 들었다.

필자는 개인적으로 매우 유용하게 사용하고 있는 방법이지만, 키보드를 누르는 횟수만 좀 줄어들었을 뿐 여전히 한줄씩 조정하는 작업이 성가시게 느껴질 것이다.

문서 작성 중에는 자간을 맞추지 않고 그냥 두었다가 전체 문서의 자간을 한번에 맞추고 싶은 분들을 위해 필자가 만들어 사용 중인 스크립트를 공유한다.

처음엔 서너 줄로 시작했다가 여러 경우의 수를 하나씩 추가하다보니 세련되게 보이지는 않으나, 실제로 유용하게 활용하고 있고, 100페이지가 넘는 문서도 클릭 한번이면 알아서 편집해주는 기특한 녀석이다.


자간 조정 스크립트


전체 스크립트는 아래와 같고, 간단한 설명은 뒤에서 덧붙이겠다.

import win32com.client
import clipboard
import datetime

# 한글 인스턴스 생성
hwp = win32com.client.Dispatch('HWPFrame.HwpObject')
hwp.XHwpWindows.Item(0).Visible=True

# 파일 열기
hwp.Open("filename.hwp")

# 시작시간 저장
start = datetime.datetime.now()

# 문서 맨앞으로 이동
hwp.HAction.Run("MoveTopLevelBegin")

# 자간조정 시작
x = 0
while True:
    
    # 단락의 끝인지 체크하고 다음 줄로
    hwp.HAction.Run("MoveLineEnd")
    hwp.HAction.Run("MoveSelLeft")
    hwp.HAction.Run("Copy")
    a = clipboard.paste()
    if a == " " or a == ".":
        hwp.HAction.Run("MoveRight")
        x += 1
    else:    
        hwp.HAction.Run("MoveSelNextWord")
        hwp.HAction.Run("Copy")
        b = clipboard.paste()
        if a == b:
            hwp.HAction.Run("MoveRight")
            x +=1
    
    # 자간 조정이 필요한지 체크하고 자간 조정
        else:            
            if 2<= len(b) <= 3:
                x = 0
                hwp.HAction.Run("MoveUp")
                hwp.HAction.Run("MoveSelLineEnd")
                hwp.HAction.Run("CharShapeSpacingDecrease")
                hwp.HAction.Run("CharShapeSpacingDecrease")
                hwp.HAction.Run("CharShapeSpacingDecrease")
                hwp.HAction.Run("MoveLineBegin")
                print(hwp.KeyIndicator()[3],'쪽',hwp.KeyIndicator()[5],'줄 자간 줄임(▼)')
            else:
                hwp.HAction.Run("MoveLineBegin")
                hwp.HAction.Run("MoveSelPrevWord")
                hwp.HAction.Run("Copy")
                c = clipboard.paste()
                if len(c) == 1:
                    x = 0
                    hwp.HAction.Run("MoveSelLineBegin")
                    hwp.HAction.Run("CharShapeSpacingIncrease")
                    hwp.HAction.Run("CharShapeSpacingIncrease")
                    hwp.HAction.Run("CharShapeSpacingIncrease")
                    hwp.HAction.Run("MoveRight")
                    print(hwp.KeyIndicator()[3],'쪽',hwp.KeyIndicator()[5],'줄 자간 늘림(▲)')
    
    # 문서의 끝인지 체크
    if x > 15:
        bl = hwp.KeyIndicator()
        hwp.HAction.Run("MoveDown")
        al = hwp.KeyIndicator()
        if bl == al:
            print()
            end = datetime.datetime.now()
            time_passed = str(end - start).split('.')[0]
            print('종료', '\r\n소요시간:',time_passed)
            break

 

스크립트에 관한 간략한 설명

 

작동 방식은 간단하다.

 

우선, 스크립트가 실행되면, 문서의 첫 줄로 이동한다.

 

그런 다음 아래 동작을 반복한다.

 

    1. 줄의 끝으로 가서 단락의 끝인지를 확인한다.(마침표나 여백이 있는지 등을 검사)

 

    2. 단락의 끝이면 다음 줄로 넘어가고, 단락의 끝이 아니면 줄의 끝에서 다음 단어까지 문자의 개수를 확인한다.

 

    3. 문자의 개수가 2~3개이면(띄어쓰기 1개를 뺀 다음 줄의 문자가 1~2개이면) 자간을 줄인다.

 

    4. 그보다 문자가 많으면, 줄의 끝에서 이전 단어까지의 문자의 개수를 확인한다.

 

    5. 문자의 개수가 1개이면 자간을 늘린다.

 

    6. 작업 시작 시 변수 x를 0으로 두고, 자간 조정이 없이 루프가 돌 때마다 1씩 늘린다.

 

    7. x가 15보다 커지면, 문서의 끝에 도달한 것인지 확인하고, 문서의 끝에 도달하면 작업을 종료한다.

 

자간의 조정이 있을 때는 몇 쪽 몇째 줄에서 조정이 일어났는지 출력하며, 작업이 끝나면 총 소요 시간을 출력한다.

 

실행결과 예시

 

파이썬 공식 홈페이지에서 제공하는 "자습서" 페이지의 텍스트들을 한글 문서에다 붙여 넣은 채로 자간 조정 스크립트를 실행해보겠다.

 

실행 결과는 다음과 같다. 일부 놓친 부분은 있지만 대체로 잘 조정해줬다.

 

아래는 자간 조정을 하는 모습을 녹화한 것이다.

 

 

로그에 열심히 조정해준 흔적이 남아 있다.

1 쪽 4 줄 자간 늘림(▲)
1 쪽 5 줄 자간 줄임(▼)
1 쪽 13 줄 자간 늘림(▲)
1 쪽 16 줄 자간 줄임(▼)
1 쪽 17 줄 자간 줄임(▼)
1 쪽 17 줄 자간 줄임(▼)
1 쪽 18 줄 자간 줄임(▼)
1 쪽 22 줄 자간 늘림(▲)
1 쪽 22 줄 자간 줄임(▼)
1 쪽 24 줄 자간 늘림(▲)
1 쪽 25 줄 자간 늘림(▲)
1 쪽 27 줄 자간 줄임(▼)
1 쪽 28 줄 자간 줄임(▼)
1 쪽 32 줄 자간 줄임(▼)
1 쪽 35 줄 자간 늘림(▲)
1 쪽 35 줄 자간 줄임(▼)
1 쪽 40 줄 자간 줄임(▼)
1 쪽 41 줄 자간 줄임(▼)
2 쪽 2 줄 자간 줄임(▼)
2 쪽 3 줄 자간 줄임(▼)
2 쪽 8 줄 자간 줄임(▼)
2 쪽 10 줄 자간 늘림(▲)
3 쪽 3 줄 자간 줄임(▼)
3 쪽 7 줄 자간 줄임(▼)
3 쪽 7 줄 자간 줄임(▼)
3 쪽 10 줄 자간 줄임(▼)
3 쪽 12 줄 자간 줄임(▼)
3 쪽 23 줄 자간 줄임(▼)
3 쪽 23 줄 자간 줄임(▼)
3 쪽 26 줄 자간 줄임(▼)
3 쪽 27 줄 자간 줄임(▼)
3 쪽 29 줄 자간 줄임(▼)
3 쪽 36 줄 자간 줄임(▼)
3 쪽 36 줄 자간 줄임(▼)
3 쪽 37 줄 자간 줄임(▼)
3 쪽 40 줄 자간 줄임(▼)
3 쪽 40 줄 자간 줄임(▼)
4 쪽 6 줄 자간 줄임(▼)
4 쪽 6 줄 자간 줄임(▼)

종료 
소요시간: 0:00:35

 

자간조정 전과 후의 한글파일도 첨부한다.

파이썬 자습서_조정 전.hwp
0.08MB
파이썬 자습서_조정 후.hwp
0.08MB

 

마무리


코드를 작성한 방법에 대해 좀더 알고 싶다면 앞서 소개한 win32com을 활용해 아래아한글 다루는 방법, 한글매크로 코드를 파이썬에서 실행하는 방법을 참조하기 바란다.

이 스크립트는 필자가 업무상 작성하는 특정 문서에서 원활히 작동할 정도로만 짜여져 있다.

따라서 모든 유형의 문서에서 원활하게 작동하리라고 장담할 수 없으며, 필요한 경우 적절히 편집하거나, 위에 설명한 아이디어를 참고해 스스로 작성해서 사용하시면 되겠다.

코드가 길고 복잡해 보여도 위의 게시글 두 개만 읽고 나면 여러 경우의 수에 맞게 충분히 스스로도 작성할 수 있을 것이다.

반응형

댓글