안녕하세요. 마티니님
유튜브, 블로그 구독자 ㅇㅇㅇ입니다.
먼저 한글 자동화 공부에 많은 도움 주셔서 감사합니다.
공개해주신 동영상, 블로그를 모두 찾아 봤는데요
제가 원하는 기능 없어서 문의 드립니다.
아래한글 파일의 내용 중 특정 영역을 블록으로 선택하여
지정된 블록영역만 다른이름으로 저장하려는데요.
예를 들어서
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()
업무에 참고하시기 바랍니다.
추가 질문 있으시면
메일이나 댓글로 달아주시기 바랍니다.
이상, 일상의코딩이었습니다.
행복한 하루 되세요!
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
한/글 문서에 포함된 그림들 화질저하 없이 이미지파일로 저장하는 프로그램 만들어보기 (0) | 2022.03.31 |
---|---|
한/글 문서 이미지 사이즈를 문서여백에 맞춰 일괄조정 및 캡션 유지하는 방법 (6) | 2022.02.10 |
GetText의 첫 단락 인덱스를 수정해야 하는 이유(최종) (0) | 2022.02.08 |
댓글