인프런 커뮤니티 질문&답변

이상하님의 프로필 이미지
이상하

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

글자속성 변경하기

특정 범위 서체 변경하기 (글자속성변경하기)

해결된 질문

작성

·

40

1

안녕하세요? 조금씩 천천히 강의를 따라가고 있습니다 ^^

 

글자속성 변경하기 챕터에서

특정 범위의 서체 변경하기를 따라 해 보고 있는데요.

 

빈문서를 만들고,

텍스트를 입력한 다음,

블럭을 설정하고,

charshape = True를 입력하고,

실행시키면

화면에 나오는 것처럼 글자 속성이 변하지 않네요.

image.png

 

참고로 저는 Visual Studio Code로 작업을 하고 있습니다.

추측으로는,

열어 놓은 한글 파일에 접근할 수 있어야 하고

블럭설정한 부분을 읽어야 하는 것 같은데,

이 코드는 빠져 있는 건가요?

멋진 강의 감사합니다! ^^

 

 

 

답변 2

1

이상하님의 프로필 이미지
이상하
질문자

일상의 코딩님. 친절한 답변 정말 감사드립니다!! 한 줄기 빛이 보이는 느낌이네요. 다시 한번 복습해 보고 pyhwpx도 사용해 보겠습니다. 답변 감사합니다 ^^

1

일코님의 프로필 이미지
일코
지식공유자

상하님, 안녕하세요?

우선, XHwpCharacterShape은

현재 커서 위치 또는 선택영역의 글자속성을 조회하거나 변경할 수 있습니다.

아래는 그 예시입니다.

import win32com.client as win32


hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
# 아래아한글 빈 창이 열림


charshape = hwp.XHwpDocuments.Item(0).XHwpCharacterShape
# 다 타이핑하기 귀찮아서 charshape이라는 변수로 만들어놓음


charshape.Bold = True
pset = hwp.HParameterSet.HInsertText
pset.Text = "Hello world!\r"  # \r은 엔터
hwp.HAction.Execute("InsertText", pset.HSet)
# 두꺼운 글자 입력


charshape.Bold = False
pset = hwp.HParameterSet.HInsertText
pset.Text = "Hello world!\r"
hwp.HAction.Execute("InsertText", pset.HSet)
# 얇은 글자 입력


hwp.Run("SelectAll")
charshape.Italic = True
hwp.Run("Cancel")
# 모두 선택 후 이탤릭 적용

 

단락별로 실행결과를 보여드리기 위해 jupyter로 실행했습니다.

녹화_2024_08_30_07_42_39_98.gif

 

다만, 직접 열어놓은 한/글 창에 파이썬으로 접근하기 위해서는
아래와 같이 다소 긴 코드를 입력해야 합니다.

import win32com.client as win32
import pythoncom


hwp = None
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()

for moniker in monikers:
    name = moniker.GetDisplayName(context, moniker)
    if name.startswith('!HwpObject.'):
        obj = running_coms.GetObject(moniker)
        hwp = win32.gencache.EnsureDispatch(
            obj.QueryInterface(pythoncom.IID_IDispatch))
        hwp.XHwpWindows.Active_XHwpWindow.Visible = True

if not hwp:
    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    hwp.XHwpWindows.Active_XHwpWindow.Visible = True

 

위 코드를 실행하면 현재 실행되어 있는 한/글 문서에 hwp라는 변수로 접근 가능하게 되고
작성해두신 자동화 코드를 이어서 실행하시면 됩니다.

녹화_2024_08_30_07_49_46_411.gif

 

참고로,

API나 win32com 특성상 코드가 굉장히 길기 때문에

제가 미리 짜둔 코드를 간편하게 활용하실 수 있도록

pyhwpx라는 파이썬 모듈을 제작하여 배포하고 있습니다.

(`pip install pyhwpx`로 설치 가능합니다.)

 

win32com으로 생성하는 hwp 객체와 거의 동일한 인터페이스에

(내부적으로는 거의 모두 오토메이션API로 돌아가기 때문입니다.)

몇 가지 편리한 기능을 추가하였으니,

 

pyhwpx를 사용해보실 것을 추천드립니다.

예를 들어 위의 코드는 아래처럼 실행하실 수 있습니다.

녹화_2024_08_30_07_57_07_924.gif

 

도움이 되었길 바랍니다.

궁금한 점 있으면 언제든 질문 남겨주세요!

 

행복한 하루 되세요^^

이상하님의 프로필 이미지
이상하

작성한 질문수

질문하기