본문 바로가기
아래아한글 자동화/python+hwp 중급

선택한 특정 구간만 새로운 파일로 저장하는 함수 만들기

by 일코 2022. 3. 13.

안녕하세요. 마티니님
유튜브, 블로그 구독자 ㅇㅇㅇ입니다.

먼저 한글 자동화 공부에 많은 도움 주셔서 감사합니다.
공개해주신 동영상, 블로그를 모두 찾아 봤는데요
제가 원하는 기능 없어서 문의 드립니다.

아래한글 파일의 내용 중 특정 영역을 블록으로 선택하여
지정된 블록영역만 다른이름으로 저장하려는데요.

 

예를 들어서
SetPos로 블록 시작위치를 지정하고 
특정 위치의 블록 끝 위치를 지정한 후
블록으로 지정된 영역만 새로운 파일로 
저장했으면 합니다.

도움 주시면 감사하겠습니다.

 

구독과 질문 감사합니다.

질문 주신 분은 어느 정도 한/글 자동화에 익숙하신 분인 것 같아요.

SetPos로 두 개의 포지션을 선택해서 사이구간을 다른이름으로 저장하는 방법을 물어보셨습니다.

 

우선,

선택한 블록을 다른이름으로 저장하기

한/글에서 기본제공하는 기능으로,

Alt-V 단축키로 실행하실 수 있습니다.

 

스크립트매크로 녹화를 통해서 명령어를 추출할 수 있는데,

추출과정은 다른 포스팅에도 여러 번 다뤘으므로 생략하겠습니다.

블록을 다른이름으로 저장하는 명령어를 추출해서

조금 다듬으면 아래와 같습니다.

hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
hwp.HParameterSet.HFileOpenSave.filename = filename
hwp.HParameterSet.HFileOpenSave.Format = "HWP"
hwp.HParameterSet.HFileOpenSave.Attributes = 1
hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)

 

그리고 SetPos로 시작점의 좌표와 끝점의 좌표를 알고 있을 때

해당 구간을 선택하는 명령어는 아래와 같이 굉장히 간단합니다.

hwp.SetPos(*tuple_start)
hwp.Run("Select")
hwp.SetPos(*tuple_end)

 

그럼, 예를 들어 설명드리겠습니다.

아래와 같은 문서가 있다고 가정하면,

 

세 번째 문단만 전부 선택하고 싶을 때에는 아래와 같이 실행하시면 됩니다.

hwp.SetPos(0, 2, 0)
hwp.Run("Select")
hwp.SetPos(0, 2, 146)

 

위 세 줄을 실행하면 바로 이렇게 블록선택이 됩니다.

 

이 때 마지막 좌표 146을 굳이 알아야 하나? 하는 생각이 들 수 있습니다.

간편한 팁을 알려드리면, 끝점 pos값인 146 대신 -1을 입력해도 됩니다.

자동으로 해당문단의 마지막 Pos값이 지정됩니다.

사실 -1이 아니라 아무 음의 정수를 넣어도 결과는 동일합니다.

 

블록선택과 블록저장 기능을 설명드렸으니,

이제 두 코드를 합쳐서

선택블록을 저장하는 함수를 만들어보겠습니다.

def 한글_블록저장(tuple_start, tuple_end, filename):
    hwp.SetPos(*tuple_start)
    hwp.Run("Select")
    hwp.SetPos(*tuple_end)

    hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
    hwp.HParameterSet.HFileOpenSave.filename = filename
    hwp.HParameterSet.HFileOpenSave.Format = "HWP"
    hwp.HParameterSet.HFileOpenSave.Attributes = 1
    hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
함수라고 만들어놓긴 했는데,
사실 왠만큼 정형화된 반복작업이 아니고서는
정확한 시작점과 끝점의 좌표값을 알아내는 게
오히려 까다로운 일일 수도 있겠네요.

끝.

 

 

마치기 전에

위에서 정의한 함수를 가지고 아래와 같은 응용프로그램을 만들어보았습니다.

문단별로 쪼개서 다른이름으로 저장하는 간단한 프로그램입니다.

옆으로 길게 녹화하느라 아이콘이 좀 잘렸네요..

 

위 프로그램의 전체 소스코드는 아래와 같습니다.

import os

import win32com.client as win32


def 한글_끝문단():
    hwp.MovePos(3)
    end_para = hwp.GetPos()[1]
    return end_para


def 한글_블록저장(tuple_start, tuple_end, filename):
    hwp.SetPos(*tuple_start)
    hwp.Run("Select")
    hwp.SetPos(*tuple_end)

    hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
    hwp.HParameterSet.HFileOpenSave.filename = filename
    hwp.HParameterSet.HFileOpenSave.Format = "HWP"
    hwp.HParameterSet.HFileOpenSave.Attributes = 1
    hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)


if __name__ == '__main__':
    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    # hwp.XHwpWindows.Item(0).Visible = True
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    os.chdir("C:\\Users\\smj02\\Desktop")
    hwp.Open(os.path.join(os.getcwd(), "블록저장_샘플.hwpx"))
    끝문단 = 한글_끝문단()

    for i in range(끝문단+1):
        한글_블록저장(tuple_start=(0, i, 0), tuple_end=(0, i, -1), filename=os.path.join(os.getcwd(), f"block_{i}.hwp"))

    hwp.Quit()

 

업무에 참고하시기 바랍니다.

추가 질문 있으시면

메일이나 댓글로 달아주시기 바랍니다.

 

이상, 일상의코딩이었습니다.

행복한 하루 되세요!

댓글