• 카테고리

    질문 & 답변
  • 세부 분야

    업무 자동화

  • 해결 여부

    해결됨

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

23.02.24 10:28 작성 조회수 548

1

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

  • 1번째 제목차례 위치를 검색하고 2번째 제목차례 바로 앞까지를 블럭을 지정하려는 방법을 알려주세요

  • 블럭 저장 후 별도의 파일로 저장하는 방법은 찾았습니다.

     

    감사합니다

답변 1

답변을 작성해보세요.

1

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

말씀하신 기능은 <찾아가기(단축키: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

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

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