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

현재 위치 글자모양에 "진하게"가 적용되어 있는지 확인하는 방법

by 일코 2020. 12. 7.

자동화 하다 보면 이런 상황을 종종 만납니다. 

특정 위치, 혹은 특정 문구를 가진 구간을 선택해서 "진하게"를 적용해야 하는데,
일괄적으로 모든 검색구간에 hwp.Run("CharShapeBold")를 실행해버리면
기존에 진하게 되어 있던 구간들은 모두 "진하게"가 풀려버리잖아?

이런 경우 해결하는 방법입니다.

우선 코드실행 화면은 아래와 같습니다.

조항번호 재정렬 및 조항명 진하게 하는 코드 실행화면

조항번호 재정렬 및 조항명 진하게 하는 코드 실행화면(움짤)

현재 캐럿이 위치해 있는 글자 혹은 선택영역의 속성적용여부를 알아내는 코드는 아래와 같습니다.

Act = hwp.CreateAction("CharShape")  # "글자모양" 액션 생성
Set = Act.CreateSet()  # 해당 세트 생성
Act.GetDefault(Set)  # 세트 초기화(Set의 파라미터에 현재 문서의 값을 적용)
print(Set.Item("Bold"))  # 1이면 "진하게", 0이면 "보통", None이면 "일부 진하게"

위 코드의 "CharShape" 문자열이나, "Bold" 등 액션아이디나 아이템아이디 문자열을 어떻게 찾는지 문의 주셨는데,

1. 저는 공식문서 Action Table.hwp 에서 "글자 모양" 또는 "글자모양"을 검색해서 "CharShape"을 찾고,

2. 공식문서 ParameterSet Table.hwp을 열어서 "CharShape"로 검색해서 "Bold" 아이템을 찾습니다.

틈틈이 검색하다 보면 공식문서 찾는 게 익숙해지고, 속도도 빨라집니다.

하여튼, 위 코드를 적용해서 업데이트한 "조항 재정렬 및 진하게" 코드는 아래와 같습니다.

from tkinter import Tk
from tkinter.filedialog import askopenfilename
import re
import win32com.client as win32


######################## 이 부분이 업데이트됨 #############################
def 조항제목진하게():
    Act = hwp.CreateAction("CharShape")  # 액션테이블에서 "글자 모양" 검색, 액션아이디에서 "CharShape" 찾음
    Set = Act.CreateSet()  # 세트 생성
    Act.GetDefault(Set)  # 세트 초기화(Set의 파라미터에 현재 문서의 값을 적용)
    if Set.Item("Bold") == 1:  # 파라미터셋테이블에서 "CharShape" 검색, 아이템아이디에서 "Bold" 찾음
        return
    else:
        hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet)
        hwp.HParameterSet.HFindReplace.FindString = ")"
        hwp.HParameterSet.HFindReplace.Direction = hwp.FindDir("Forward")
        hwp.HParameterSet.HFindReplace.IgnoreMessage = 1
        hwp.HParameterSet.HFindReplace.FindType = 1
        hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet)
        hwp.HAction.Run("MoveRight")
        hwp.HAction.Run("MoveLeft")
        hwp.HAction.Run("MoveSelLineBegin")
        hwp.HAction.Run("CharShapeBold")
        hwp.HAction.Run("MoveLineBegin")
###########################################################################

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"제{조항번호}조("):
                hwp.MovePos(201)  # moveScanPos : GetText() 실행 후 위치로 이동한다.
                조항제목진하게()  ########################### 이렇게 한 줄 삽입
                조항번호 += 1
                continue
            elif re.match(r"^제\d+조\(?", text[1]) and not text[1].startswith(f"제{조항번호}조("):
                hwp.MovePos(201)  # moveScanPos : GetText() 실행 후 위치로 이동한다.
                조항제목진하게()  ############################# 또 이렇게 한 줄 삽입
                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)

댓글