강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của jeouspark8405227630
jeouspark8405227630

câu hỏi đã được viết

Công thức tự động hóa Python-아래아한글 cần thiết cho nhân viên văn phòng

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

Đã giải quyết

Viết

·

1.1K

2

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

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

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

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

python한컴오피스

Câu trả lời 3

1

jeouspark8405227630님의 프로필 이미지
jeouspark8405227630
Người đặt câu hỏi

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

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

1

jeouspark8405227630님의 프로필 이미지
jeouspark8405227630
Người đặt câu hỏi

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

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

그러니 예를 들어

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

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

ilco님의 프로필 이미지
ilco
Người chia sẻ kiến thức

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

 

간단히는 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

ilco님의 프로필 이미지
ilco
Người chia sẻ kiến thức

민수님 안녕하세요?^^

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

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")

 

Hình ảnh hồ sơ của jeouspark8405227630
jeouspark8405227630

câu hỏi đã được viết

Đặt câu hỏi