inflearn logo
강의

Course

Instructor

Essential Python-Hwp Automation Recipes for Office Workers

How to display a Korean/English program written in Python on the screen

[제목 차례] 별로 파일로 저장하기

Resolved

945

guk Jin Lee

1 asked

1

한글 파일에 [제목 차례] 단위별로 블럭을 지정하여 별도의 파일로 저장하려 합니다.

한컴오피스 한컴오피스 python

Answer 1

1

ilco

국진님, 안녕하세요?^^

말씀하신 기능은 <찾아가기(단축키:Alt-G)> 기능으로 간단히 구현하실 수 있습니다.

다음 제목 차례로 이동하는 파이썬 코드는 아래와 같습니다.

hwp.HAction.GetDefault("Goto", hwp.HParameterSet.HGotoE.HSet)
hwp.HParameterSet.HGotoE.HSet.SetItem("DialogResult", 60)
hwp.HParameterSet.HGotoE.SetSelectionIndex = 5
hwp.HAction.Execute("Goto", hwp.HParameterSet.HGotoE.HSet)

 

다만 추가로 유의하셔야 할 사항이 세 개 있는데,

  1. while문으로 반복을 돌리시는 경우, 마지막 제목차례에서 실행시 "처음 제목차례로 이동할까요?"라는 팝업이 뜹니다. 이에 대비하기 위해 hwp.SetMessageBoxMode를 이용해 팝업을 처리해주셔야 합니다.

  2. 위 방법만 적용하여 코딩하면 제목 차례 찾기가 무한정 실행되어버립니다. 이를 중단하는 방법 중 제가 주로 사용하는 방법은 찾아가기를 함수로 만든 후, hwp.HAction.Execute 라인 앞에 return을 추가하는 것입니다. 그러면 마지막 제목차례에서 실행시 False를 리턴하므로 while문의 조건으로도 적당합니다.

  3. 위 찾아가기 명령은 다음 제목차례 으로만 이동합니다. 때문에 동일 코드를 여러 번 반복실행해도 다음 제목차례로 넘어가지 않습니다. 캐럿을 우측이나 라인/문단 끝으로 옮기는 코드를 추가로 넣어주셔야 합니다.

 

위 유의사항을 토대로 제가 짜본 코드는 아래와 같습니다.

import os

import win32com.client as win32


def 한글_시작():
    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    return hwp


def 다음제목차례로_이동():
    hwp.Run("MoveLineEnd")
    hwp.HAction.GetDefault("Goto", hwp.HParameterSet.HGotoE.HSet)
    hwp.HParameterSet.HGotoE.HSet.SetItem("DialogResult", 60)
    hwp.HParameterSet.HGotoE.SetSelectionIndex = 5
    return hwp.HAction.Execute("Goto", hwp.HParameterSet.HGotoE.HSet)


def 제목차례영역_추출():
    total_blocks = []
    this_block = []
    hwp.Run("MoveDocBegin")
    hwp.SetMessageBoxMode(0x22222)
    while 다음제목차례로_이동():
        if len(this_block) == 1:
            this_block.append(hwp.GetPos())
            total_blocks.append(this_block)
            this_block = []
        hwp.Run("MoveRight")  # [제목 차례]는 빼고
        this_block.append(hwp.GetPos())
    hwp.SetMessageBoxMode(0xfffff)
    hwp.Run("MoveDocEnd")
    this_block.append(hwp.GetPos())
    total_blocks.append(this_block)
    return total_blocks


def 현재라인추출():
    hwp.InitScan(Range=0x22)
    _, text = hwp.GetText()
    hwp.ReleaseScan()
    return text


def 블록저장(filename):
    hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
    hwp.HParameterSet.HFileOpenSave.filename = os.path.join(os.path.dirname(hwp.Path), filename+".hwp")
    hwp.HParameterSet.HFileOpenSave.Format = "HWP"
    hwp.HParameterSet.HFileOpenSave.Attributes = 1
    hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)


if __name__ == '__main__':
    hwp = 한글_시작()
    hwp.Run("FileOpen")
    제목차례블록_리스트 = 제목차례영역_추출()
    for 블록 in 제목차례블록_리스트:
        hwp.Run("Cancel")
        hwp.SetPos(*블록[0])
        제목 = 현재라인추출().strip()
        hwp.Run("Select")
        hwp.SetPos(*블록[1])
        블록저장(제목)
    hwp.Run("Cancel")

 

위 코드를 실행한 결과는 아래와 같습니다.

image

결과가 국진님의 의도와 다를 수 있는데,
추가질문 남겨주시면 상세히 설명드리겠습니다.

감사합니다.
행복한 하루 되세요!^^

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

0

76

1

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

0

58

1

본문을 각주로 내리는 법

1

93

1

한글 자동화 삽도 삽입!!

1

383

2

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

1

231

2

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

1

117

2

사무실 컴퓨터ㅠ

0

96

2

글자입력 여러번 실행기

0

67

1

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

1

102

1

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

1

161

2

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

1

1103

1

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

1

222

2

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

1

122

1

표 병합하기 관련

0

140

0

메타태그 삽입 자동화

0

191

1

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

1

269

2

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

1

268

1

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

1

273

2

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

1

282

0

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

1

343

2

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

1

649

1

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

1

136

1

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

0

446

0

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

1

642

1