인프런 커뮤니티 질문&답변

김성락님의 프로필 이미지
김성락

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

필드위치로 커서 옮기기

SaveAs메소드에 대한 질문입니다

해결된 질문

작성

·

41

1

안녕하세요 일코님

한글 블록저장에 대해 살펴보다가 궁금한 점이 생겨서 여쭤봅니다.

커서를 이동해서 블록선택한 다음

    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)

이 코드를 실행하면 블록 저장이 됨을 확인했습니다.

여기서 궁금한 점이 있는데요

hwp.SaveAs(hwp.Path.replace('.hwp', " - 계약서.hwp"), Format="HWP")

이 코드와의 차이점이 뭘까요? 실행하면 위에 코드는 블록저장이 되지만, 아래 코드는 전체 파일이 다른이름으로 저장되더라구요.

FileSaveAs_S가 블록저장 메소드인가요? 혹시 가능하다면 한글API설명서 어디에 있는지도 알려주실 수 있을까요?

한글API설명서도 읽을 수 있는 수준이 되고싶은데 너무 어렵네요..

답변 2

1

김성락님의 프로필 이미지
김성락
질문자

아....... 너무 매번 친절히 알려주셔서 지금 업무에 너무 도움이 됩니다. 추가로 하나만 더 여쭤봐도 될까요?

저희 기관의 한글프로그램은 보안설정때문에 매크로 기능이 막혀 녹화할 수가 없는 상황입니다.

혹시 스크립트 녹화하는 다른 방법이 있을까요? 저도 녹화 기능을 너무 활용하고 싶습니다..ㅠㅠ

일코님의 프로필 이미지
일코
지식공유자

맞아요ㅜ 저도 공사 근무할 때 매크로가 차단되어 있어서 애먹었습니다ㅜ
그런 경우에는 별다른 방법이 없어 보입니다.
저도 (어마어마하게 번거롭지만) 코딩이나 매크로녹화는 개인 PC에서 하고
완성한 코드를 내부망으로 가져와 사용했거든요..

 

퇴사할 즈음에 알게 된 사실이지만
생산성 향상을 위해 스크립트 매크로 차단을 해제해달라고 직접 요청을 했는데,
(파이썬이나 엑셀VBA는 자유롭게 사용이 가능한데 왜 한/글만 차단했나?)

IT/보안 부서에서는 한/글의 매크로가 차단되어 있다는 것도 모르고 있었고,
푸는 방법도 몰랐습니다. 아마 Fxxxx DRM의 기능이었나 싶습니다.
나름의 꼼수가 하나 있었는데,
당시 다른 버전의 아래아한글을 내부망에 하나 더 설치하면
차단이 안 되어 있어서 녹화가 가능했고 인쇄이력도 남지 않았습니다.
버전별 설치순서가 중요해서, 잘못하면 그룹웨어 연동이 안되기도 했고요.

 

스트레스 받으시겠지만, 보안부서에 연락하셔서
스크립트매크로 차단을 해제해달라고
요청드려보시는 건 어떨까요?^^;

1

일코님의 프로필 이미지
일코
지식공유자

성락님 안녕하세요?ㅎ

hwp.SaveAs는 한/글에서 제공하는 "메서드"가 맞습니다.

다만 액션시퀀스의 단축명령어라고 이해하시는 게 좋겠습니다.

(SaveAs 실행시에도 내부적으로는 FileSaveAs_S와 동일한 액션이 실행되기 때문입니다.)

그리고 "FileSaveAs_S"는 엄밀히는 "액션"이라고 부릅니다. (메서드가 아니고요.)

 

각각

메서드 목록은 "한글 오토메이션" 문서에서,

액션 목록은 "액션 오브젝트" 문서에서,

액션 실행시 파라미터 설명은 "파라미터셋 오브젝트" 문서에서 확인하실 수 있지만,

(관련페이지 : https://developer.hancom.com/hwpautomation)

액션 테이블과 파라미터셋 테이블을 함께 참고하면서

하나의 액션(예를 들면, 블록 저장) 코드를 완성하는 것은

굉장히 번거롭고 고된 일입니다.

 

참고로 저도 (원인모를 오류 때문에 헤매는 경우가 아니라면)

액션테이블이나 파라미터셋테이블을 전혀 거의 열어보지 않습니다.

 

대신 스크립트매크로를 씁니다.

스크립트매크로로 녹화로 코드 추출이 안 되는 기능은

한컴 개발자포럼에 문의합니다. 보통 하루 이내에 한컴 개발자 분들이 답변을 달아주십니다.

그래도 재현이 안 되는 액션은 과감하게 포기하고 대안을 찾습니다.

(대안도 없는 액션이라면 십중팔구 문제정의부터 잘못되었을 가능성이 높다고 생각해버립시다.)

 

하여튼 FileSaveAs_S 액션을 녹화하는 과정은 아래와 같습니다.

녹화_2024_11_19_14_25_12_450.gif

불필요하게 미리보기 이미지를 저장하는 PictureSaveAsAll 액션도 녹화가 되었는데, 이건 무시해도 됩니다. 녹화를 자주 하다 보면 나름의 필터링 노하우가 생깁니다.

 

이렇게 녹화된 코드는 jscript라는 언어 포맷입니다.

function OnScriptMacro_중국어1성()
{
	HAction.GetDefault("PictureSaveAsAll", HParameterSet.HSaveAsImage.HSet);
	with (HParameterSet.HSaveAsImage)
	{
	}
	HAction.Execute("PictureSaveAsAll", HParameterSet.HSaveAsImage.HSet);
	HAction.GetDefault("FileSaveAs_S", HParameterSet.HFileOpenSave.HSet);
	with (HParameterSet.HFileOpenSave)
	{
		FileName = "C:\\Users\\user\\Desktop\\ㅁㄴㅇㄹ.hwp";
		Format = "HWP";
		Attributes = 1;
	}
	HAction.Execute("FileSaveAs_S", HParameterSet.HFileOpenSave.HSet);
}

 

파이썬으로 변환하는 방법은 간단한데,

① 모든 변수는 hwp 안에 있으므로 hwp.~을 붙여주고,

② jscript의 with문은 반복되는 인스턴스 이름과 속성을 축약하는 문법이므로

다시 모두 전개하면,

def save_block_as():
    hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)
    hwp.HParameterSet.HFileOpenSave.FileName = "C:\\Users\\user\\Desktop\\ㅁㄴㅇㄹ.hwp"
    hwp.HParameterSet.HFileOpenSave.Format = "HWP"
    hwp.HParameterSet.HFileOpenSave.Attributes = 1
    hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet)

이런 모양이 됩니다.

 

③ 거의 완료되기는 했는데, 아직 두 가지 문제가 있습니다.

먼저 FileName 속성을 filename으로 변경해줘야 합니다.

win32com 단에서

typelib을 파이썬 코드로 변환하는 과정에서 특정 속성명(파스칼케이스)을

소문자로 치환해버리는 경우가 있습니다.

두 번째로, 변환코드에는 hwp.HParameterSet.HFileOpenSave.HSet

위아래 두 번 정의되어 있습니다. (GetDefault와 Execute에서)

그런데 가끔 각 HSet이 달라지는 경우가 있는데, 이 때는 오류가 발생합니다.

이걸 방지하기 위해 변수(예를 들어 pset)에 담고, 해당 변수 pset을 반복해서 쓰면 됩니다.

 

이렇게 두 가지 방법을 적용한 최종 코드는

아래와 같습니다.

def save_block_as(path):
    pset = hwp.HParameterSet.HFileOpenSave
    hwp.HAction.GetDefault("FileSaveAs_S", pset.HSet)
    pset.FileName = path
    pset.Format = "HWP"
    pset.Attributes = 1
    hwp.HAction.Execute("FileSaveAs_S", pset.HSet)

 

저는 보통 이런 식으로 함수(또는 메서드)로 만들고 재활용을 하는 편입니다.

요약하면~

① 매번 문서를 열어보기보다는, 스크립트매크로와 한컴개발자포럼을 활용

② 스크립트매크로를 파이썬 코드로 변환하는 방법에 익숙해집시다.

끝.

 

김성락님의 프로필 이미지
김성락

작성한 질문수

질문하기