inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

미주를 거꾸로 찾고 싶습니다.

해결된 질문

1206

박민수

작성한 질문수 4

2

한글에 미주를 앞으로 찾아가는 방법은 강의를 통해 습득 하였는데

파이썬으로 문서를 자동화 하던 중 미주를 거꾸로 찾아 위치로 가야 할 경우가 생겼습니다ㅠ

한글 문서에서는 미주를 한 번 찾은 후 Ctrl + Q + L 을 누르면 이전미주 위치로 가는데

스크립트 녹화 상에서는 반영이 잘 안되어 질문합니다.

python 한컴오피스

답변 3

1

박민수

자세한 대답을 해 주셔서 감사합니다!!

한 번 시도 해 보고 다시 여쭤보겠습니다~

1

박민수

제가 오해의 소지가 있게 말씀 드린 것 같습니다 ㅠ

제가 여쭈고 싶은 내용은 본문 내용 어느 부분의 위치에서 바로 전 미주를 찾고 싶은 거였습니다.

그러니 예를 들어

1번 미주 2번 미주 (커서위치) 3번미주

이런 모양으로 있을 때 2번 미주위치로 이동하고 싶습니다.

2

일코

민수님 안녕하세요ㅎ
제가 질문을 오해했네요.

 

간단히는 hwp.FindCtrl()을 실행하시면 캐럿이 이전 컨트롤로 찾아가므로,
미주 외에 다른 컨트롤이 없다면, hwp.FindCtrl()도 적절한 대안일 수 있습니다.

image

단, FindCtrl은 인접한 컨트롤로 우선 찾아가므로
반복실행해야 하는 경우 Run("MoveLeft") 등을 먼저 실행해줘야 합니다.

 

좀 더 복잡한 문서(표나 각주 등 기타 컨트롤이 삽입되어 있는 경우)에는
아래 함수를 사용해 보셔도 좋을 것 같습니다.
제가 내공이 후달려 예쁘게 코드를 작성하지는 못했지만,
주석을 달아 두었으니 참고하시기 바랍니다.

def goto_prev_footnote():
    """
    현재 캐럿위치 전방에 위치한 미주 찾아가는 함수.
    캐럿 앞에 미주가 있으면 해당위치로 이동 후 True를 리턴
    캐럿 앞에 미주가 없으면 False를 리턴
    """
    start_pos = hwp.GetPos()  # 현재 캐럿위치 저장
    ctrl = hwp.LastCtrl  # 마지막 컨트롤부터 역순으로 순회하면서
    while ctrl:
        if (ctrl.CtrlID == "en"  # 해당 컨트롤이 "미주"이면서, 
                and (
                        # 미주의 문단번호가 캐럿위치보다 앞이거나
                        (ctrl.GetAnchorPos(0).Item("Para") < start_pos[1]) or
                        
                        # 캐럿과 동일문단인 경우, 미주가 앞에 위치하고 있다면
                        (ctrl.GetAnchorPos(0).Item("Para") == start_pos[1] and 
                         ctrl.GetAnchorPos(0).Item("Pos") < start_pos[2])
                )
        ):
            hwp.SetPosBySet(ctrl.GetAnchorPos(0))  # 캐럿을 해당 위치로 옮기고
            return True  # while문 종료
        ctrl = ctrl.Prev  # 조건에 부합하지 않으면 이전 컨트롤 탐색
    return False  # 캐럿 전방에 미주가 없는 경우 False 리턴

시연화면은 아래와 같습니다.

image

도움이 되었기를 바랍니다ㅎ

1

일코

민수님 안녕하세요?^^

문서의 마지막 미주로 이동하는 코드는 아래와 같습니다.

def 마지막_미주로_이동():
    ctrl = hwp.LastCtrl  # 마지막 컨트롤에서부터
    while ctrl:
        if ctrl.UserDesc == "미주":  # 마지막 미주 찾기
            hwp.SetPosBySet(ctrl.GetAnchorPos(0))  # 해당미주로 이동
            break  # 반복 종료
        ctrl = ctrl.Prev  # 미주가 아니면? 이전 컨트롤 탐색!
        
마지막_미주로_이동()

미주의 주석으로 이동하는 코드는 간단합니다.

hwp.HAction.Run("NoteModify")  # 미주의 노트로 이동


미주 노트 안에서 이전 노트로 이동하는 액션은 간단히

hwp.HAction.Run("NoteToPrev")

을 사용하시면 됩니다. (단, 각주와 미주를 구분하지는 않습니다.)

 

미주노트를 (번호를 제외하고) 추출하는 방법으로는 GetText가 대표적인데,

hwp.HAction.Run("SelectAll")  # 미주노트 전체선택
hwp.InitScan(option=0, Range=0xff)  # 선택범위로 탐색한정
_, text = hwp.GetText()  # 선택범위 텍스트 추출
hwp.ReleaseScan()  # 탐색 종료
print(text)

방식으로 추출하실 수 있습니다.

 

만약 각주는 제외하고 미주만 역순으로 추출해야 하는 경우라면
제일 먼저 보여드린 마지막_미주로_이동() 함수를 활용해서
미주마다 반복해서 노트로 이동하고 추출하시면 됩니다.

 

도움이 되었으면 좋겠습니다.
언제든 추가질문 남겨주세요ㅎ

 

<팁>

문서 내의 모든 미주만 별도의 문서로 추출하는 API도 최근 추가되었습니다.
사용방법은 아래와 같습니다.

def save_footnote(filepath):
    pset = hwp.HParameterSet.HSaveFootnote
    hwp.HAction.GetDefault("SaveFootnote", pset.HSet)
    pset.filename = filepath
    return hwp.HAction.Execute("SaveFootnote", pset.HSet)

save_footnote("C:\\Users\\User\\Desktop\\footnote.hwpx")

 

섹션7과 같은 수학 수식을 백지에서 시작할 때 어떻게 만들 수 있을까요?

0

76

1

hwp 병렬 작업시 클립보드 충돌문제

0

58

1

본문을 각주로 내리는 법

1

93

1

한글 자동화 삽도 삽입!!

1

384

2

한글 표 내부 위치 찾는 코드좀 알려주세요 ㅠㅠ

1

233

2

빈 문서를 새로 열때는 팝업이 안나오는데 기존 문서를 열면 팝업이 나옵니다

1

118

2

사무실 컴퓨터ㅠ

0

96

2

글자입력 여러번 실행기

0

67

1

현재 커서 문단에 아무런 내용이 없는지 확인하기

1

102

1

특정 스타일을 찾아 이동하는 방법

1

161

2

한/글 파일 open 시 '상위 버전에서...' 메세지 안 뜨게 하는 방법?

1

1108

1

win32com 으로 hwp 문자열 검색하기 문의

1

222

2

[응용] 엑셀문서 값을 필드에 입력하기 질

1

122

1

표 병합하기 관련

0

140

0

메타태그 삽입 자동화

0

191

1

스크립트 매크로 초기화 하고 싶습니다.

1

270

2

한글 창이 여러 개 존재할 때 pyhwpx 모듈로 접근하는 방법을 알고 싶습니다.

1

271

1

표안의 특정 필드에 있는 이미지를 복사하여 한글 외부에 저장하기

1

273

2

스타일 싹 다 지우고 바탕글로 통일하는 방법 문의드립니다.

1

283

0

하위의 여러 폴더 중 특정폴더의 사진만 추출하기

1

345

2

한글 수식을 자동으로 넣는 코드를 만들었는데, 수식 사이의 간격이 계속 벌어집니다.

1

655

1

보유 특허 검색 페이지에서 검색이 되지 않습니다.

1

137

1

hwp 페이지별 분할 저장하는 코드 관련 문의

0

446

0

한글 문서에 사용된 폰트명 추출

1

644

1