자동화 하다 보면 이런 상황을 종종 만납니다.
특정 위치, 혹은 특정 문구를 가진 구간을 선택해서 "진하게"를 적용해야 하는데,
일괄적으로 모든 검색구간에 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)
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
파이썬으로 "제?조(조항명)"을 "제?조[조항명]"으로 수정하기 (0) | 2020.12.08 |
---|---|
[자동화문의] 표 안에 이미지 넣는 작업 (6) | 2020.12.06 |
각각의 셀너비, 높이를 다르게 표를 생성하는 코드 (0) | 2020.12.06 |
댓글