해당 글은 군대에 있을 때 작성한 글을 기반으로 작성되었습니다.


해당 내용은 ActiveXObject를 이용하는 거라 오직 익스플로러에서만 작동합니다.


지난번 자바스크립트로 외부 프로그램 실행하는 방법에 이어서 이번엔 자바스크립트로 한글문서를 편집하는 방법에 대해서 알아보겠습니다.

많은 분들이 한셀에서 매크로 기능을 활용하고 있는데요. 엑셀은 매크로 언어로 VBA, 한셀은 VBS를 사용하고 있습니다. 아래아한글에도 매크로 기능이 있는데요. 한글은 매크로 언어로 자바스크립트(!)를 사용하고 있습니다. 거기에다 외부 클라이언트와 연결되어 한글을 제어할 수 있는 기능도 제공하고 있는데 자바스크립트다보니 HTML에서 꽤나 간단하게 연결이 가능합니다.


일단 간단한 예제부터 보여드리겠습니다.


var hwp = new ActiveXObject('HWPFrame.HwpObject.1');
hwp.HAction.GetDefault('InsertText', hwp.HParameterSet.HInsertText.HSet);	// 텍스트 입력
hwp.HParameterSet.HInsertText.Text = '테스트입니다.';
hwp.HAction.Execute('InsertText', hwp.HParameterSet.HInsertText.HSet);
hwp.HAction.Run('BreakPara');	// 엔터 입력
hwp.HAction.GetDefault('InsertText', hwp.HParameterSet.HInsertText.HSet);	// 텍스트 입력
hwp.HParameterSet.HInsertText.Text = '테스트입니다222';
hwp.HAction.Execute('InsertText', hwp.HParameterSet.HInsertText.HSet);
hwp.HAction.Run('SelectAll');	// 모두선택
hwp.HAction.Run('CharShapeBold');	// 진하게
hwp.HAction.Run('Cancel');	// 블록해제

위 코드를 적당한 곳에 넣어서 실행시키면 아래 스크린샷처럼 한글이 실행되면서 문서가 만들어졌을 겁니다.

군대에선 네오를 쓰는데 난 아직 2010이다...군대에선 네오를 쓰는데 난 아직 2010이다...

코드의 핵심은 첫번째 줄인 new ActiveXObject('HWPFrame.HwpObject.1');입니다. ActiveXObject로 HWPFrame.HwpObject 객체를 생성하면 아래아한글이 실행되고 이 객체로 한글을 제어할 수 있습니다.

그래서 제어하는 법은 알겠는데 어떤 메소드가 있는지 어떻게 아느냐?

이건 한컴 홈페이지에 가면 한/글 API 가이드가 있습니다. 여기에 자세하게 나와있지만 더 간단한 방법이 있습니다. 바로 한셀 매크로 공부하듯이 매크로를 기록한 다음에 어떻게 기록되었는지 확인하는 방법입니다.

도구 메뉴에 보면 매크로 정의 메뉴가 있습니다. 해당 메뉴로 매크로를 기록할 수 있고 기록한 후 매크로 실행 메뉴에서 코드 편집 버튼을 누르면 좌측에 아래처럼 스크립트 코드가 표시됩니다.

한글 내 스크립트 편집기에선 기본적으로 HwpObject 객체가 생성되어 있기 때문에 new 같은 게 필요 없습니다. 이를 HTML에서 사용하려고 할 땐 따로 HwpObject 객체를 생성해줘야하기 때문에 HAction을 hwp.HAction로 수정하는 등 따로 생성한 객체를 통해 접근해야 합니다.


보너스로 위에서 말한 API 가이드에서 찾을 수 있는 몇 가지 메소드들을 소개하겠습니다. 아래 메소드들은 위 방법으론 알아낼 수 없는 메소드들입니다. 매크로 기록 같은 경우는 대부분의 명령어를 HAction.Run 메소드로 때우더라고요;;

Open(str1, str2, str3) : 문서 파일을 연다. str1 - 문서 파일의 경로, str2 - 문서 형식(HWP/TEXT/MSWORD 등) null로 생략 시 자동 인식, str3 - 세부 옵션인데 설명하기엔 너무 기네요 그냥 null로 생략하시면 되겠습니다.

Save(bool) : 현재 편집 중인 문서를 저장한다. bool - true로 지정 시 문서가 변경된 경우에만 저장한다 false로 지정 시 무조건 저장

SaveAs(str1, str2, str3) : 현재 편집 중인 문서를 지정한 이름으로 저장한다. str1 - 문서 파일의 경로, str2 - 문서 형식(HWP/TEXT/MSWORD 등) null로 생략시 'HWP', str3 - 세부 옵션인데 이것도 설명하기 무리...

MoveToField(str, bool1, bool2, bool3) : 지정한 필드로 캐럿을 이동한다. str - 필드 이름, bool1 - 필드가 누름틀일 경우 누름틀 내부로 이동할지(true) 누름틀 코드로 이동할지(false)를 지정, bool2 - 필드의 처음으로 이동할지(true) 끝으로 이동할지(false) 지정, bool3-필드 내용을 블록으로 선택할지(true) 안할지(false) 지정. 이게 엄청 유용한 게 특정 부분을 누름틀로 만들어놓으면 특정 부분으로 이동하거나 그 부분을 바꾸는 게 정말 편해집니다. 누름틀은 입력 메뉴에서 만들 수 있습니다.

MovePos(int1, int2, int3) : 커서의 위치를 옮깁니다. int1 - 2:문서의시작 3:문서의끝 12:한글자뒤 13:한글자앞 22:줄의시작 23:줄의끝 100:왼쪽셀 101:오른쪽셀 102:위쪽셀 103:아래쪽셀 104:현재셀행의시작 105:현재셀행의끝 106:현재셀열의시작 107:현재셀열의끝 등등등, int2 - int1을 뭐로 지정했는지에 따라 다른데 제가 알려드린 것들엔 해당 사항이 없으므로 0으로 지정하시면 됩니다, int3 - int1을 뭐로 지정했는지에 따라 다른데 제가 알려드린 것들엔 해당 사항이 없으므로 0으로 지정하시면 됩니다. 이것도 엄청 자주 쓰실 겁니다.

GetTextFile(str1, str2) : 현재 열린 문서를 문자열로 넘겨준다.(리턴값 존재) str1 - 파일의 형식(HWP/TEXT 등), str2 - 'saveblock'으로 지정 시 선택된 블록만 저장. GetTextFile('TEXT', 'saveblock')로 사용하면 선택된 부분을 문자열로 가져와서 자바스크립트에서 활용이 가능해집니다!

XHwpMessageBox : 아래아한글에서 제공하는 메시지박스 객체입니다. 이걸로 한글 자체에서 메시지박스를 띄울 수 있습니다.
 - XHwpMessageBox.String : 메시지박스에 넣을 문자열이 저장되는 프로퍼티입니다.
 - XHwpMessageBox.Flag : 메시지박스 플래그 값이 저장되는 프로퍼티인데 0으로 지정하면 확인 버튼만 있는 창이 뜨고 1로 지정하면 확인/취소 창이 뜨는 식입니다.
 - XHwpMessageBox.Result : 메시지박스의 리턴값이 저장되는 프로퍼티입니다.
 - XHwpMessageBox.DoModal() : 메시지박스를 띄우는 메소드입니다.


이외에도 많은 메소드와 프로퍼티가 있지만 제가 사용 중인 것만 소개해봤습니다.

한글에도 스크립트 편집기가 있어서 그대로 쓸 수 있는데 왜 굳이 외부랑 연동해서 쓰느냐?고 물으신다면 외부 자바스크립트와 연동해서 쓰면 기존 자바스크립트에서 쓸 수 있는 객체들 Date, XMLHttpRequest 등등을 그대로 이용할 수 있고 HTML과 조합해서 사용자 선택이나 입력을 적용할 수 있게 됩니다.

저는 1시간 넘게 걸리는 상황일지 작성을 이걸 이용해서 30분만에 작성하고 있습니다.ㅎㅎ

+ Recent posts