diff --git a/apps/as/docs/pwrk-cnsltn/development-guide.md b/apps/as/docs/pwrk-cnsltn/development-guide.md index a715c4030..99e38c569 100644 --- a/apps/as/docs/pwrk-cnsltn/development-guide.md +++ b/apps/as/docs/pwrk-cnsltn/development-guide.md @@ -40,6 +40,7 @@ v1.0은 공단 접수자의 **자료검증 → 초안생성 → 웹기안기** | [ref-screen-buttons.md](./ref-screen-buttons.md) | 38행 화면·역할·버튼 매트릭스, 버튼 가시성 | `button-config.ts` 개편 | | [ref-endpoint.md](./ref-endpoint.md) | 버튼→API 총괄, 단계별 입출력, FE 호출 금지 API, Gap Analysis | 엔티티·service 매핑 | | [ref-frontend-entities.md](./ref-frontend-entities.md) | ENDPOINT, 슬라이스, Service 시그니처, 폴링, 웹기안기, DTO | 엔티티 레이어 구현 | +| [ref-webhwp-api.md](./ref-webhwp-api.md) | 웹한글기안기 v3 `HwpCtrl` Properties/Methods, Open/SaveAs | 기안기 위젯 연동 | --- diff --git a/apps/as/docs/pwrk-cnsltn/ref-webhwp-api.md b/apps/as/docs/pwrk-cnsltn/ref-webhwp-api.md new file mode 100644 index 000000000..2196e6c17 --- /dev/null +++ b/apps/as/docs/pwrk-cnsltn/ref-webhwp-api.md @@ -0,0 +1,4325 @@ +# 레퍼런스 — 웹한글기안기 API (v3) + +> 상위: [development-guide.md](./development-guide.md) +> 원본: 한컴 웹한글기안기 API v3 개발 가이드 (PDF → TaggedPDF XML) +> 정리일: 2026-09-10 +> 구현: `apps/as/src/widgets/hangulgiangi` + +한컴 웹한글기안기 `HwpCtrl` / `HwpAction` / `HwpParameterSet` / `HwpParameterArray` / `HwpCtrlCode` API를 프론트 구현용으로 정리한 문서다. PDF OCR·줄바꿈 흔적은 바로잡았고, 원문 의미는 유지했다. + +공식 개발자 가이드: [Hancom WebHWP](https://developer.hancom.com/webhwp) + +--- + +## 이 프로젝트에서 쓰는 범위 + +실무협의서 관리(`TE`/`RK`) 웹기안기는 아래만 호출한다. 나머지는 확장 시 참고한다. + +| 용도 | API | 프로젝트 사용 | +| --- | --- | --- | +| 문서 열기 | `HwpCtrl.Open(path, format, arg, callback, callbackUserData)` | `File`(HWPX blob) + `format: "HWPX"` + `arg: ""`. 인증된 `GET .../webhwp/open` blob을 `File`로 감싼다. URL 직접 전달·`blob:` Object URL은 쓰지 않는다. | +| 저장 | `HwpCtrl.SaveAs(fileName, format, arg, callback, callbackUserData)` | `format: "HWPX"`, `arg: "download:false"`. 콜백 `result.data`를 Blob으로 디코드한 뒤 `POST /pwrk-cnsltn-doc-crt-rslt` multipart. | +| 로컬 다운로드 | `SaveAs(..., "download:true")` 또는 서버 `GET .../download` | 화면 [다운로드]는 서버 download API를 쓴다. | + +`Open` 반환값(`true`/`false`)은 인자 유효성만 나타낸다. 실제 성공은 콜백 `result.result`로 판단한다. 브라우저는 로컬 파일 경로를 열 수 없다. + +--- + +## 목차 + +- [1. HwpCtrl](#1-hwpctrl) + - [1.1 Properties](#11-properties) + - [1.2 Methods](#12-methods) +- [2. HwpAction](#2-hwpaction) +- [3. HwpParameterSet](#3-hwpparameterset) +- [4. HwpParameterArray](#4-hwpparameterarray) +- [5. HwpCtrlCode](#5-hwpctrlcode) + +--- + +## 1. HwpCtrl + +### 1.1 Properties + +#### 1.1.1 `CellShape` + +**구문** + +```js +HwpCtrl.CellShape +``` + +**설명** + +현재 선택되어 있는 표와 셀의 모양 정보를 나타낸다. + +**반환값** + +블록된 셀 혹은, 현재 캐럿이 위치한 셀의 속성을 ParameterSet 객체 타입으로 리턴한다. + +**비고** + +ParameterSet/Table 로 표의 속성에 대한 기본 정보를 나타내며, 이 가운데 Cell 아이템이 ParameterSet/Cell 로 셀의 속성을 나타낸다. 셀 블록이 잡혀있지 않은 상태이면 현재 캐럿이 위치한 셀 하나만을 대상으로 한다. 현재 표 내부에 캐럿이 위치하지 않으면 에러가 발생한다. + +**예제** + +1. 표 생성 +2. 셀 안으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 셀 간격이 2pt 로 변경된다. + +```js +var tp = HwpCtrl.CreateSet("Table"); +var cp = tp.CreateItemSet("Cell", "Cell"); +tp.SetItem("CellSpacing", 200); +HwpCtrl.CellShape = tp; +``` + +#### 1.1.2 `CharShape` + +**구문** + +```js +HwpCtrl.CharShape +``` + +**설명** + +현재 Selection 된 글자의 글자 모양을 나타낸다. + +**반환값** + +블록된 구역 혹은, 현재 캐럿이 위치한 곳의 글자 모양을 ParameterSet 객체 타입으로 리턴한다. + +**비고** + +property get 을 수행하면 현재 selection 내의 글자 모양을 구할 수 있고, selection 이 존재하지 않으면 현재 캐럿이 위치한 곳의 글자 모양을 돌려준다. + +글자 모양 중 특정 항목이 Selection 내에서 서로 다른 속성을 가지고 있으면 아예 아이템 자체가 존재하지 않는다. property set 을 수행하면 아이템이 존재하는 항목에 대해서만 속성을 설정한다. + +ParameterSet 형식은 별도로 전달된 ParameterSet Table 문서 참고 + +**예제** + +1. 글자 입력 +2. 입력한 글자 Selection +3. 예제 스크립트 실행 결과 : Selection 된 글자들의 글자 크기를 20pt 로 설정한다. + +```js +var cs = HwpCtrl.CharShape; +if (cs.ItemExist("Height")) { + cs.SetItem("Height", 2000); + HwpCtrl.CharShape = cs; +} +``` + +#### 1.1.3 `CurFieldState` + +**구문** + +```js +HwpCtrl.CurFieldState +``` + +**설명** + +캐럿이 위치한 필드의 상태 정보를 구한다. 읽기 전용. + +**반환값** + +현재 필드 상태에 따라 Number 타입의 값을 리턴한다. Remark 참고 + +**비고** + +다음과 같은 의미를 가진다. + +- bit 4: 필드명 존재 여부 (`1` 있음, `0` 없음) +- bit 0–3: 필드 종류 (`0` 없음, `1` 셀, `2` 누름틀, `4` 글상자) + +필드명 존재 여부와 필드 종류에 따라 0–20까지의 값을 갖는다. + +**예제** + +1. 누름틀 삽입 (다른 필드 삽입 가능) +2. 누름틀 안으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 현재 선택된 필드 : 누름틀 메시지 창 + +```js +var fieldState = HwpCtrl.CurFieldState; +var msg =""; +switch (fieldState) { + case 0: msg ="필드 없음"; + break; + case 1: msg ="셀"; + break; + case 2: msg ="누름틀"; + break; + case 4: msg ="글상자"; + break; +} +alert("현재 선택된 필드 :"+ msg); +``` + +#### 1.1.4 `CurSelectedCtrl` + +**구문** + +```js +HwpCtrl.CurSelectedCtrl +``` + +**설명** + +현재 선택된 컨트롤. 읽기 전용. + +**반환값** + +현재 선택된 컨트롤을 CtrlCode 객체 타입으로 리턴한다. + +**예제** + +1. 표 삽입 +2. 표 선택 +3. 예제 스크립트 실행 +결과 : 표가 삭제된다. + +```js +var ctrl = HwpCtrl.CurSelectedCtrl; +if( ctrl && ctrl.CtrlID =="tbl") { + HwpCtrl.DeleteCtrl(ctrl); +} +``` + +#### 1.1.5 `EditMode` + +**구문** + +```js +HwpCtrl.EditMode +``` + +**설명** + +현재 편집 모드 + +**반환값** + +현재 편집 모드를 Number 타입으로 리턴한다. + +**비고** + +현재 편집 모드를 나타낸다. + +- 0 : 읽기 전용 + +- 1 : 일반 편집모드 + +- 2 : 양식 모드. 양식 사용자 모드 : Cell 과 누름틀 중 양식 모드에서 편집 가능 속성을 가진 것만 편집 가능하다. + +- 16 : 배포용 문서 `SetEditMode`로 지정 불가능 + +**예제** + +1. EditMode 0(읽기 모드)으로 변경 +2. 편집시도 +3. EditMode 1(일반 편집 모드)으로 변경 +4. 편집시도 + +```js +HwpCtrl.EditMode = 0; +//편집 시도 +HwpCtrl.EditMode = 1; +//편집 시도 +``` + +#### 1.1.6 `HeadCtrl` + +**구문** + +```js +HwpCtrl.HeadCtrl +``` + +**설명** + +문서 중 첫 번째 컨트롤. 읽기 전용. + +**반환값** + +문서 중 첫 번째 컨트롤을 HwpCtrlCode 객체 타입으로 리턴한다. + +**비고** + +문서 중의 모든 컨트롤(표, 그림 등 특수 문자)들은 linked list 로 서로 연결되어 있는데, 그 list의 시작 컨트롤을 나타낸다. 이 컨트롤로부터 시작, Ctrl.Next 를 이용해 forward iteration 을 수행할 수 있 다. + +**예제** + +1. 표 입력 +2. 예제 스크립트 실행 결과 : 문서 중 모든 표가 삭제된다. + +```js +var ctrl = HwpCtrl.HeadCtrl; +while(ctrl != null) { + if(ctrl.CtrlID =="tbl") { + HwpCtrl.DeleteCtrl(ctrl); + } +ctrl = ctrl.Next +} +``` + +#### 1.1.7 `IsModified` + +**구문** + +```js +HwpCtrl.IsModified +``` + +**설명** + +현재 문서가 변경되었는지 나타낸다. 이 구문은 읽기 전용입니다. + +**반환값** + +변경내용 여부를 Boolean 타입으로 리턴한다. + +**예제** + +1. 새 문서 상태에서 예제 실행 후 alert 창 확인 +2. 편집 시도 후 예제 다시 실행 결과 : 문서가 변경되어 true 를 반환한다. + +```js +alert(HwpCtrl.IsModified) +``` + +#### 1.1.8 `IsPrivateInfoProtected` + +**구문** + +```js +HwpCtrl.IsPrivateInfoProtected +``` + +**설명** + +현재 문서에 개인정보보호 필드가 있는지 확인한다. + +**반환값** + +현재 문서의 개인정보보호 필드 여부를 Boolean 타입으로 리턴한다. + +**비고** + +개인정보보호 필드가 있는 문서를 열어서 예제코드 실행해야 합니다. + +**예제** + +1. 개인정보보호 필드가 있는 문서를 연다. +2. 예제 스크립트 실행 결과 : 문서가 개인정보 필드를 가지고 있으면 true 를 반환한다. + +```js +alert(HwpCtrl.IsPrivateInfoProtected); +``` + +#### 1.1.9 `LastCtrl` + +**구문** + +```js +HwpCtrl.LastCtrl +``` + +**설명** + +문서 중 마지막 컨트롤. 읽기 전용. + +**반환값** + +문서 중 마지막 컨트롤을 HwpCtrlCode 객체 타입으로 리턴한다. + +**비고** + +문서 중의 모든 컨트롤(표, 그림 등 특수 문자)들은 linked list 로 서로 연결되어 있는데, 그 list의 마지막 컨트롤을 나타낸다. 이 컨트롤로부터 시작, Ctrl.Prev 를 이용해 backward iteration 을 수행할 수 있다. + +**예제** + +1. 표 입력 +2. 예제 스크립트 실행 결과 : 문서 중 모든 표의 셀 간격을 1pt 로 설정한다. + +```js +var ctrl = HwpCtrl.LastCtrl; +var tbset = HwpCtrl.CreateSet("Table"); +tbset.SetItem("CellSpacing", 100); +while(ctrl != null) { + if(ctrl.CtrlID =="tbl") { + ctrl.Properties = tbset; + } +ctrl = ctrl.Prev; +} +``` + +#### 1.1.10 `PageCount` + +**구문** + +```js +HwpCtrl.PageCount +``` + +**설명** + +문서의 전체 페이지 수를 나타냅니다. 이 구문은 읽기 전용입니다. + +**반환값** + +문서의 페이지 수를 Number 타입으로 반환합니다. + +**비고** + +문서 전체에 대한 pagination 이 수행되지 않은 상태에서 이 property 를 참조하면 먼저 문서 전체의 pagination 을 먼저 수행하므로 긴 문서에 대해 문서 내용 변경과 참조를 반복하면 속도가 심각하게 느려질 수 있습니다. + +**예제** + +1. 문서 쪽 분할 +2. 예제 스크립트 실행 결과: 전체 페이지 수 메시지 창 + +```js +alert(HwpCtrl.PageCount); +``` + +#### 1.1.11 `ParaShape` + +**구문** + +```js +HwpCtrl.ParaShape +``` + +**설명** + +현재 Selection 의 문단 모양을 나타낸다. + +**반환값** + +블록된 구역 혹은, 현재 캐럿이 위치한 곳의 문단 모양을 ParameterSet 객체 타입으로 리턴한다. + +**비고** + +property get 을 수행하면 현재 selection 내의 문단 모양을 구할 수 있다. selection 이 존재하지 않으면 현재 캐럿이 위치한 곳의 문단 모양을 돌려준다. 문단 모양 중 특정 항목이 selection 내에서 서로 다른 속성을 가지고 있으면 아예 아이템 자체가 존재하지 않는다. property set 을 수행하면 아이템이 존재하는 항목에 대해서만 속성을 설정한다.. + +ParameterSet 형식은 별도로 전달된 ParameterSet Table 문서 참고 + +**예제** + +1. 글자 입력 +2. 입력한 글자 Selection +3. 예제 스크립트 실행 결과 : 현재 문단의 왼쪽 여백을 50pt 로 설정한다. + +```js +var paraShape = HwpCtrl.ParaShape; +paraShape.SetItem("LeftMargin", 10000); +HwpCtrl.ParaShape = paraShape; +``` + +#### 1.1.12 `ParentCtrl` + +**구문** + +```js +HwpCtrl.ParentCtrl +``` + +**설명** + +현재 캐럿의 상위 컨트롤. 읽기 전용. + +**반환값** + +현재 캐럿의 상위 컨트롤을 HwpCtrlCode 객체 타입으로 리턴한다. + +**비고** + +상위 컨트롤은 현재 캐럿이 위치한 리스트를 보유한 컨트롤이다. 예를 들어 셀 내부에 위치하면 표, 각 주 내용에 위치하면 각주, 바탕쪽이면 구역 컨트롤이 상위 컨트롤이다.현재 캐럿이 본문 레벨에 위치해 상위 컨트롤이 없을 때는 null 이 리턴된다. + +**예제** + +1. 표 입력 +2. 셀로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 현재 캐럿의 위치가 셀이라면 부모 표의 셀 간격을 1pt 로 설정한다. + +```js +var ctrl = HwpCtrl.ParentCtrl; +if (ctrl.CtrlID =="tbl") { + var tbset = HwpCtrl.CreateSet("Table"); + tbset.SetItem("CellSpacing", 100); + ctrl.Properties = tbset; +} +``` + +#### 1.1.13 `ReadOnlyMode` + +**구문** + +```js +HwpCtrl.ReadOnlyMode +``` + +**설명** + +편집모드를 읽기 전용 모드로 설정하는 기능 + +**반환값** + +현재 읽기 전용모드를 Boolean 타입으로 리턴한다. + +**비고** + +property get 을 수행하면 현재 문서가 읽기 전용 모드 여부를 return 한다. return 값이 false 이면 편집 모드, true 이면 읽기 전용모드이다. property set 을 수행하면 현재 문서의 읽기 전용모드 속성을 설정한다. + +**예제** + +1. ReadOnlyMode true( 읽기모드로 변경 +2. 편집시도 +3. ReadOnlyMode false( 편집 모드로 변경 +4. 편집시도 결과 : 편집모드와 읽기 전용 모드를 설정한다. + +```js +HwpCtrl.ReadOnlyMode = true; +//읽기모드 //편집 시도 +HwpCtrl.ReadOnlyMode = false; +//편집모드 //편집 시도 +``` + +#### 1.1.14 `ScrollPosInfo` + +**구문** + +```js +HwpCtrl.ScrollPosInfo +``` + +**설명** + +스크롤바의 위치 정보를 얻어오는 기능 + +**반환값** + +현재 스크롤의 위치 정보를 얻어옵니다. ScrollPosInfo 의 ParameterSet 버전. + +**비고** + +현재 스크롤바수직, 수평의 위치정보를 ScrollPosInfo ParameterSet 으로 얻어오거나 설정한다. + +| 값 | 설명 | +| --- | --- | +| HorzPos | 수평 스크롤바 위치 | +| HorzLimitPos | 수평 스크롤바 한계 위치 값 (읽기 전용) | +| VertPos | 수직 스크롤바 위치 | +| VertLimitPos | 수직 스크롤바 한계 위치 값 (읽기 전용) | + +**예제** + +1. 스크롤을 원하는 위치로 이동시킨다. +2. 예제 스크립트 실행 결과: 선택된 값 메시지 창 + +```js +var pset = HwpCtrl.ScrollPosInfo; +var hp = pset.Item("HorzPos"); +var vp = pset.Item("VertPos"); +var hlp= pset.Item("HorzLimitPos"); +var vlp = pset.Item("VertLimitPos"); +alert("HorzPos:"+ hp +"HorzLimitPos:"+ hlp +"VertPos:"+ vp +"VertLimitPos:"+ vlp); +``` + +#### 1.1.15 `SelectionMode` + +**구문** + +```js +HwpCtrl.SelectionMode +``` + +**설명** + +문서의 내용이 어떤 selection 상태인가를 알려줍니다. 이 구문은 읽기 전용입니다. + +**반환값** + +현재 selection 상태를 Number 타입으로 반환합니다. + +**비고** + +일반 블록이 아닌 F3키에 의해 블록이 지정된 경우,HWPSEL_STRICT_MODE `0x10`(십진수 16) 으로 OR 마스크되어 오기 때문에, 항상 `0x0F`(십진수 15) 로 AND 마스크한 결과로 판단하도록 합니다. + +| 값 | 설명 | +| --- | --- | +| 0 | 블록지정이 되지 않은 상태 | +| 1 | 일반 블록이거나 F3키에 의한 블록 상태 | +| 3 | 테이블 셀 블록 상태 | +| 4 | 그리기 개체나 표, 그림 등 ShapeObject 에 해당하는 컨트롤이 선택된 상태 | + +**예제** + +1. 표 와 텍스트 삽입 +2. 텍스트 일반 블록으로 선택 +3. 예제 스크립트 실행 결과: 선택된 값 메시지 창 + +```js +var HWPSEL_NONE = 0; +var HWPSEL_NORMAL = 1; +var HWPSEL_TABLE = 3; +var HWPSEL_CTRL = 4; +var HWPSEL_MODE_MASK = 15; +var HWPSEL_STRICT_MODE = 16; +mode = HwpCtrl.SelectionMode & HWPSEL_MODE_MASK; +if(mode == HWPSEL_NONE) { + //블록지정이 되지 않은 경우 + alert("No Selection ..."); +} +else if(mode == HWPSEL_NORMAL) { + //일반 블록이거나 F3키에 의한 블록인 경우 (TEXT) + alert("Normal Selection ..."); +} +else if(mode == HWPSEL_TABLE) { + //테이블 셀 블록 상태 + alert("Table Selection ..."); +} +else if(mode == HWPSEL_CTRL) { + //그리기 개체나 표, 그림 등 ShapeObject 컨트롤이 선택된 상태 + alert("Ctrl Selection ..."); +} +``` + +#### 1.1.16 `ViewProperties` + +**구문** + +```js +HwpCtrl.ViewProperties +``` + +**설명** + +View 의 상태정보를 얻어오는 기능 + +**반환값** + +뷰의 상태정보를 ViewProperties ParameterSet 으로 얻어오거나 설정한다. + +**비고** + +조판 부호, 화면 확대 비율과 같은 view 에 관련된 정보를 나타낸다. + +**예제** + +1. 문서의 배율을 75% 로 설정 +2. 예제스크립트 실행 + +```js +var pset = HwpCtrl.ViewProperties; +alert(pset.Item("ZoomRatio")); +``` + +### 1.2 Methods + +#### 1.2.1 `Clear` + +**구문** + +```js +HwpCtrl.Clear(option) +``` + +**설명** + +현재 편집중인 문서의 내용을 닫고 빈문서 편집 상태로 돌아간다. + +**파라미터** + +- `option`: 편집중인 문서의 내용에 대한 처리 방법. 생략하면 hwpAskSave 가 선택된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| hwpDiscard | 1 | 문서 내용을 버린다. | + +**비고** + +현재는 옵션 1에 한해서만 사용할 수 있다. + +**예제** + +1. 글자 입력 +2. 예제 스크립트 실행 결과 : 빈문서 편집 상태로 되돌린다. + +```js +HwpCtrl.Clear(1); +``` + +#### 1.2.2 `CreateAction` + +**구문** + +```js +HwpCtrl.CreateAction(ActionID) +``` + +**설명** + +Action 객체를 생성한다. + +**파라미터** + +- `actionID`: 액션 ID + +**반환값** + +성공 시 Action 객체를 리턴한다. 존재하지 않는 액션 ID를 입력하면 null 을 리턴한다. + +**비고** + +액션에 대한 세부적인 제어가 필요할 때 사용한다. 예를 들어 기능을 수행하지 않고 대화상자만을 띄운다든지, 대화상자 없이 지정한 옵션에 따라 기능을 수행하는 등에 사용할 수 있다. Action ID Table 은 별도 문서 참조 + +**예제** + +1. 글자 입력 +2. 입력한 글자 Selection +3. 예제 스크립트 실행 결과 : Selection 된 글자들에 Bold 속성을 부여한다. + +```js +var act = HwpCtrl.CreateAction("CharShapeBold"); +act.Run(); +``` + +#### 1.2.3 `CreateField` + +**구문** + +```js +HwpCtrl.CreateField(direction, memo, name) +``` + +**설명** + +캐럿의 현재 위치에 누름틀을 생성한다. + +**파라미터** + +- `direction`: 입력이 안된 상태에서 보여지는 안내문/지시문 +- `memo`: 누름틀에 대한 설명/도움말 + +- `name`: :누름틀 필드에 대한 필드 이름 + +**반환값** + +성공이면 true, 실패면 false + +**비고** + +memo Parameter 는 ActiveX 한/글 컨트롤과 호환용으로 사용되는 Parameter 이다. 웹한글에서는 내용을 확인할 수 없으나 누름틀 저장 후 데스크탑 한/글에서 메모 내용을 확인할 수 있다. + +**예제** + +1. 예제 스크립트 실행 결과 : 현재 위치에 본문 필드가 생성된다. + +```js +HwpCtrl.CreateField("본문을 입력하세요", "", "본문"); +``` + +#### 1.2.4 `CreatePageImage` + +**구문** + +```js +HwpCtrl.CreatePageImage(fileName, pgno, format) +``` + +**설명** + +지정한 페이지의 이미지를 파일로 생성한다. + +**파라미터** + +- `fileName`: 생성할 이미지 파일의 이름 +- `pgno`: 페이지 번호. 0부터 PageCount-1까지. 생략하면 0이 사용된다 +- `format`: :이미지 파일의 포맷. jpg, jpeg, png% 중의 하나. 생략하면 png% 가 사용된다 + +**반환값** + +성공이면 true, 실패면 false + +**예제** + +1. 문서 작성 또는 문서 불러오기 +2. 예제 스크립트 실행 결과 : 첫 번째 페이지를 이미지로 다운로드한다. + +```js +HwpCtrl.CreatePageImage("pageimage.png", 0, "png"); +``` + +#### 1.2.5 `CreatePageImageEx` + +**구문** + +```js +HwpCtrl.CreatePageImageEx(fileName, pgno, resolution, depth, format, option, callback, callbackUserData) +``` + +**설명** + +지정한 페이지의 이미지를 파일로 생성합니다. + +**파라미터** + +- `fileName`: 생성할 이미지 파일의 이름 + +- `pgno`: 페이지 번호. 0부터 PageCount-1까지. 생략하면 0이 사용됨 +- `resolution`: 이미지 해상도. DPI 단위96, 300, 1200 등로 지정됨. 생략하면 96이 사용됨 +- `depth`: 이미지 파일의 color depth1, 4, 8, 24) 를 지정함 +- `format`: 이미지 파일의 포맷. jpg, jpeg, png2 중의 하나. 생략하면 png2 가 사용됨 +- `option`: download:true 를 넣으면 문서가 로컬에 다운로드 됨 +- `callback`: CreatePageImageEx 함수가 동작을 마친 후 수행될 함수 + +- result( 성공 실패 여부, path( 저장경로, fileName, Size, CallbackUserData 를 포함한 + +- Object 를 인자로 받음 +- `callbackUserData`: Callback 함수에 Argument 로 넘겨 받을 result 에 포함될 UserData, 생략 가능 + +**반환값** + +성공하면 true 를 반환하고 실패하면 false 를 반환합니다.여기서 성공/실패는 필요한 인자가 제대로 들어 있고, 비동기 로직을 제외한 부분이 제대로 동작하였는지를 판별합니다.비동기 액션이므로 return 값이 true 이더라도 네트워크등의 문제로 실패 할 수 있습니다.정확한 성공/실패 여부는 callback 함수의 인자 로 들어오는 object 의 result 속성을 통해서 판별할 수 있습니다. + +**예제** + +1. 임의의 문서 작성 +2. 예제 스크립트 실행 결과: 지정한 페이지를 이미지로 다운로드합니다. + +```js +HwpCtrl.CreatePageImageEx("pageimage.png", 0, 96, 24, "png", "download:true", function(result) { + console.log("다운로드 완료"); +} +``` + +); + +#### 1.2.6 `CreateSet` + +**구문** + +```js +HwpCtrl.CreateSet(setid) +``` + +**설명** + +ParameterSet 객체를 생성한다. + +**파라미터** + +- `setid`: 생성할 ParameterSet 객체의 ID + +**반환값** + +생성된 ParameterSet 객체를 리턴한다. + +**예제** + +1. 표 생성 +2. 셀 안으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 셀 간격이 2pt 로 변경된다. + +```js +var tp = HwpCtrl.CreateSet("Table"); +var cp = tp.CreateItemSet("Cell", "Cell"); +tp.SetItem("CellSpacing", 200); +HwpCtrl.CellShape = tp; +``` + +#### 1.2.7 `DeleteCtrl` + +**구문** + +```js +HwpCtrl.DeleteCtrl(ctrl) +``` + +**설명** + +문서 내 컨트롤을 삭제한다. + +**파라미터** + +- `ctrl`: 삭제할 문서 내 컨트롤CtrlCode 객체) + +**반환값** + +성공이면 true, 실패면 false + +**예제** + +1. 표 삽입 +2. 표 선택 +3. 예제 스크립트 실행 결과 : 표가 삭제된다. + +```js +var ctrl = HwpCtrl.CurSelectedCtrl; +if( ctrl && ctrl.CtrlID =="tbl") { + HwpCtrl.DeleteCtrl(ctrl); +} +``` + +#### 1.2.8 `FieldExist` + +**구문** + +```js +HwpCtrl.FieldExist(field) +``` + +**설명** + +문서 중에 지정한 데이터 필드가 존재하는지 검사한다. + +**파라미터** + +- `field`: 필드 이름 + +**반환값** + +성공이면 true, 실패면 false + +**예제** + +1. 누름틀 생성 +2. 필드이름 이름으로 지정 +3. 예제 스크립트 실행 결과 : 문서 내에 이름 필드가 있다면 해당 필드의 정렬을 가운데 정렬로 변경하고, 홍길동이라고 텍스트를 입력한다. + +```js +if(HwpCtrl.FieldExist("이름")) { + HwpCtrl.MoveToField("이름", true, true, true); + HwpCtrl.Run("ParagraphShapeAlignCenter"); + HwpCtrl.PutFieldText("이름", "홍길동"); +} +``` + +#### 1.2.9 `FoldRibbon` + +**구문** + +```js +HwpCtrl.FoldRibbon(fold) +``` + +**설명** + +리본 메뉴를 화면에 접기/펼치기 처리한다. + +**파라미터** + +- `fold`: 리본 메뉴 접기/펼치기 여부 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 예제 스크립트 실행 결과 : Ribbon 메뉴가 접혀진다. + +```js +HwpCtrl.FoldRibbon(true); +``` + +#### 1.2.10 `GetCurFieldName` + +**구문** + +```js +HwpCtrl.GetCurFieldName(option) +``` + +**설명** + +현재 캐럿 위치의 데이터 필드 이름을 구한다. + +**파라미터** + +- `option`: 다음과 같은 옵션을 지정할 수 있다. 0을 지정하면 모두 off 이다. 생략하면 0이 지정된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| hwpFieldCell | 1 | 셀에 부여된 필드 리스트만을 구한다. hwpFieldClickHere 와는 함께 지정할 수 없다. | +| hwpFieldClickHer e | 2 | 누름틀에 부여된 필드 리스트만을 구한다. hwpFieldCell 과는 함께 지정할 수 없다. | + +**반환값** + +필드 이름을 문자열로 리턴한다. 필드 이름이 없는 경우 빈 문자열이 돌아온다. + +**예제** + +1. 누름틀 생성 +2. 필드이름 이름으로 지정 +3. 생성한 누름틀로 캐럿 이동 +4. 예제 스크립트 실행 결과 : 현재 필드의 이름이 이름이라면 홍길동을 입력한다. + +```js +if(HwpCtrl.GetCurFieldName(0) =="이름") { + HwpCtrl.PutFieldText("이름", "홍길동"); +} +``` + +#### 1.2.11 `GetFieldList` + +**구문** + +```js +HwpCtrl.GetFieldList(number, option) +``` + +**설명** + +문서 중의 필드 리스트를 구한다. + +**파라미터** + +- `number`: 문서 중에서 동일한 이름의 필드가 여러 개 존재할 때 이를 구별하기 위한 식별 방법을 지정한다.생략하면 hwpFieldPlain 이 지정된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| hwpFieldPlain | 0 | 아무 기호 없이 순서대로 필드 이름이 나열된다. | +| hwpFieldNumber | 1 | 필드 이름 뒤에 일련번호가 {{#}} 와 같은 형식으로 붙는다. | +| hwpFieldCount | 2 | 필드 이름뒤에 그 이름의 필드가 몇 개 있는지 {{#}} 와 같은 형식으로 붙는다. | + +- `option`: 다음과 같은 옵션을 조합할 수 있다. 0을 지정하면 모두 off 이다. 생략하면 0이 지정된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| hwpFieldCell | 1 | 셀에 부여된 필드 리스트만을 구한다. hwpFieldClickHere 와 는 함께 지정할 수 없다. | +| hwpFieldClickHere | 2 | 누름틀에 부여된 필드 리스트만을 구한다. hwpFieldCell 과는 함께 지정할 수 없다. | +| hwpFieldSelection | 4 | 셀렉션 내에 존재하는 필드 리스트를 구한다. | + +**반환값** + +각 필드 사이를 문자코드 0x02 로 구분하여 다음과 같은 형식으로 리턴 한다. 가장 마지막 필드에는 0x02 가 붙지 않는다.) 필드이름#1필드이름#2... 필드이름#n2 + +**비고** + +문서 중에 동일한 이름의 필드가 여러 개 존재할 때는 number 에 지정한 타입에 따라 3 가지의 서로 + +다른 방식을 중에서 선택할 수 있다. 예를 들어 문서 중 title, body, title, body, footer 순으로 5 개의 필드가 존재할 때, hwpFieldPlain, hwpFieldNumber, HwpFieldCount 세 가지 형식에 따라 다음과 같은 내용이 돌아 온다. + +| ID | 예제 | +| --- | --- | +| hwpFieldPlain | "title\x02body\x02title\x02body\x02footer" | +| hwpFieldNumber | "title{{0}}\x02body{{0}}\x02title{{1}}\x02body{{1}}\x02footer{{0}}" | +| hwpFieldCount | "title{{2}}\x02body{{2}}\x02footer{{1}}" | + +**예제** + +1. 필드 입력 +2. 예제 스크립트 실행 결과 : 성공 메시지 창 + +```js +alert(HwpCtrl.GetFieldList(0)); +``` + +#### 1.2.12 `GetFieldText` + +**구문** + +```js +HwpCtrl.GetFieldText(fieldlist) +``` + +**설명** + +지정한 필드에서 문자열을 구합니다. + +**파라미터** + +- `fieldlist`: 텍스트를 구할 필드 이름의 리스트 + +**반환값** + +텍스트 데이터가 돌아옵니다. 텍스트에서 탭은 \t0x9, 문단 바뀜은 CR/LF0x0D/0x0A) 로 표현되며, 이외의 특수 코드는 포함되지 않습니다. 필드 텍스트의 끝은 0x02 로 표현되며, 그 이후 다음 필드의 텍스트가 연속해서 지정한 필드 리스트의 개수만큼 위치합니다. 지정한 이름의 필드가 없거나 사용자가 해당 필드에 아무 텍스트도 입력하지 않았으면 해당 텍스트에는 빈 문자열이 돌아옵니다. + +**비고** + +다음과 같이 필드 사이를 문자 코드 0x02 로 구분하여 한 번에 여러 개의 필드를 지정할 수 있다.필드 이름#1\x02 필드이름#2\x02... 필드이름#n2 지정한 필드 이름이 문서 중에 두 개 이상 존재할 때의 표현 방식은 다음과 같다. + +| 필드이름 | 필드이름{{n}} | +| --- | --- | +| 이름의 필드 중 첫 번째 | 지정한 이름의 필드 중 n 번째 | + +예를 들어, 제목1\x02 본문\x02 이름02 과 같이 지정하면 제목이라는 이름의 필드 중 두 번째, 본문이라는 이름의 필드 중 첫 번째, 이름이라는 이름의 필드 + +중 첫 번째를 각각 지정한다. 즉, 필드이름과 필드이름0 은 동일한 의미로 해석된다. + +**예제** + +1. 본문 이라는 필드 생성 +2. Text 삽입 +3. 예제 스크립트 실행 결과: 본문 이라는 이름의 필드 중 첫 번째 필드의 Text 를 얻어옵니다. + +```js +alert(HwpCtrl.GetFieldText(' 본문 { + { + 0 + } +} +')); +``` + +#### 1.2.13 `GetHeadingString` + +**구문** + +```js +HwpCtrl.GetHeadingString() +``` + +**설명** + +현재 캐럿이 위치한 문단의 문단번호/글머리표를 얻어냅니다. + +**반환값** + +문단번호 또는 글머리표를 String 타입으로 반환합니다.문단번호나 글머리표가 없다면 빈문자열을 반환 합니다. + +**예제** + +1. 문단번호/글머리표 작성 +2. 예제 스크립트 실행 결과: 문단번호 또는 글머리표 메시지 창 + +```js +alert("문단번호/글머리표 :"+ HwpCtrl.GetHeadingString()); +``` + +#### 1.2.14 `GetMetaTag` + +**구문** + +```js +HwpCtrl.GetMetaTag(name) +``` + +**설명** + +문서 내 메타태그 정보를 가져옵니다. + +**파라미터** + +- `name`: 찾을 메타태그의 이름 + +**반환값** + +메타태그를 찾았을 때 해당 메타태그 정보를 Object 타입으로 반환합니다. Object 의 Property 는 다음 과 같습니다. name : 메타태그의 이름 value : 메타태그의 값 format : 메타태그의 데이터 유형 메타태그가 없으면 null 을 반환합니다. + +**비고** + +hwpx 에서만 사용가능합니다. + +**예제** + +1. 예제 스크립트 실행 결과: 메타태그의 정보 메시지 창 + +```js +var tag; +HwpCtrl.SetMetaTag("office", "text", "한글과컴퓨터"); +HwpCtrl.GetTextFile("HWPX", "", function (result) { + data = result; + HwpCtrl.Clear(1); + HwpCtrl.SetTextFile(data, "HWPX", "", function (result) { + tag = HwpCtrl.GetMetaTag("office"); + alert('name : '+ tag.NAME + '\n' + 'value : ' + tag.VALUE); + } +, null); +} +); +``` + +#### 1.2.15 `GetMetaTagAll` + +**구문** + +```js +HwpCtrl.GetMetaTagAll() +``` + +**설명** + +문서 내 모든 메타태그 정보를 가져옵니다. + +**파라미터** + +- `fieldlist`: 텍스트를 구할 필드 이름의 리스트 + +**반환값** + +메타태그를 찾았을 때 해당 메타태그 정보를 Object 타입으로 반환합니다. Object 의 Property 는 다음 과 같습니다. name : 메타태그의 이름 value : 메타태그의 값 format : 메타태그의 데이터 유형 메타태그가 없으면 null 을 반환합니다. + +**비고** + +hwpx 에서만 사용가능합니다. + +**예제** + +1. 예제 스크립트 실행 결과: 메타태그의 정보 메시지 창 + +```js +var tag; +HwpCtrl.SetMetaTag("office", "text", "한글과컴퓨터"); +HwpCtrl.SetMetaTag("developer", "num", "123456"); +HwpCtrl.GetTextFile("HWPX", "", function (result) { + data = result; + HwpCtrl.Clear(1); + HwpCtrl.SetTextFile(data, "HWPX", "", function (result) { + tag = HwpCtrl.GetMetaTagAll(); + alert('metaTag : ' + JSON.stringify(tag)); + } +, null); +} +); +``` + +#### 1.2.16 `GetPageText` + +**구문** + +```js +HwpCtrl.GetPageText(pageNo, option) +``` + +**설명** + +특정 페이지의 텍스트를 얻는다. + +**파라미터** + +- `pageNo`: 텍스트를 얻을 페이지 Number +- `option`: 다음과 같은 옵션을 지정할 수 있다. 생략하면 모든 컨트롤에 대해 텍스트를 얻는다. 본문 텍스트는 옵션에 관계없이 얻는다 + +| option | 값 | 설명 | +| --- | --- | --- | +| 표 | 1 | 표 내부 텍스트만 얻는다. | +| 글상자 | 2 | 글상자 내부 텍스트만 얻는다. | +| 캡션 | 4 | 캡션 내부 텍스트만 얻는다. | + +**반환값** + +결과 값을 문자열로 리턴한다. + +**예제** + +1. 표 입력 +2. 표안에 텍스트 입력 +3. 예제 스크립트 실행 결과 : 첫 번째 Page 의 표 내부의 Text 가 나타난다. + +```js +alert(HwpCtrl.GetPageText(0, 1)); +``` + +#### 1.2.17 `GetPos` + +**구문** + +```js +HwpCtrl.GetPos() +``` + +**설명** + +현재 캐럿의 위치 정보를 얻어온다. + +**반환값** + +캐럿 위치 정보를 Object 타입으로 리턴한다. Object 의 Property 는 다음과 같다. list : 캐럿이 위치한 문서 내 리스트 아이디. para : 캐럿이 위치한 문단 아이디. pos : 캐럿이 위치한 문단 내 글자 단위 위치. + +**비고** + +기존 ActiveX 한글 컨트롤에서는 포인터를 인자로 받아서 처리하였다. WEB 환경에 맞춰서 객체를 리 턴하는 방식으로 변경되었다. + +**예제** + +1. 문서 작성 +2. 캐럿 이동 +3. GetPos API 로 현재 Pos 정보 저장 +4. 다른 위치로 캐럿 이동 +5. 3단계에서 저장한 위치로 캐럿 이동 결과 : 캐럿 위치를 저장하고, 다시 이동한다. + +```js +posObj = HwpCtrl.GetPos(); +//GetPos API 로 현재 Pos 정보 저장 //... 다른 위치로 캐럿 이동 +HwpCtrl.SetPos(posObj.list, posObj.para, posObj.pos); +//3단계에서 저장한 위치 로 캐럿 이동 +``` + +#### 1.2.18 `GetPosBySet` + +**구문** + +```js +HwpCtrl.GetPosBySet() +``` + +**설명** + +현재 캐럿의 위치 정보를 얻어옵니다. GetPos 의 ParameterSet 버전) + +**반환값** + +캐럿의 위치에 대한 ParameterSet 객체 타입으로 반환합니다. + +**예제** + +1. 임의의 문서 작성 +2. 캐럿 이동 +3. 예제 스크립트 실행 결과: 현재 캐럿이 위치한 정보 메시지 창 + +```js +var posSet = null; +posSet = HwpCtrl.GetPosBySet(); +alert(posSet.Item("List") +""+ posSet.Item("Para") +""+ posSet.Item("Pos")); +``` + +#### 1.2.19 `GetSelectedPos` + +**구문** + +```js +HwpCtrl.GetSelectedPos() +``` + +**설명** + +현재 설정된 블록의 위치 정보를 얻어온다. + +**반환값** + +현재 설정된 블록의 위치 정보를 Object 타입으로 리턴한다. Object 의 Property 는 다음과 같다. slist : 설정된 블록의 시작 리스트 아이디. spara : 설정된 블록의 시작 문단 아이디. spos : 설정된 블록의 문단 내 시작 글자 단위 위치. slist : 설정된 블록의 끝 리스트 아이디. spara : 설정된 블록의 끝 문단 아이디. spos : 설정된 블록의 문단 내 끝 글자 단위 위치. + +**비고** + +기존 ActiveX 한글 컨트롤에서는 포인터를 인자로 받아서 처리하였다. WEB 환경에 맞춰서 객체를 리 턴하는 방식으로 변경되었다. 위의 리스트란, 문단과 컨트롤들이 연결된 한/글 문서 내 구조를 뜻한다. 리스트 아이디는 문서 내 위치 정보 중 하나로서 SelectText 에 넘겨줄 때 사용한다. + +**예제** + +1. 문서 작성 +2. 텍스트 블록 +3. GetSelectedPos API 로 현재 블록 Pos 정보 저장 +4. 블록 해제 +5. 3단계에서 저장한 블록 다시 블록 결과 : 현재 설정된 블록의 위치를 저장하고, 이후에 다시 그 위치의 Text 를 블록한다. + +```js +posObj = HwpCtrl.GetSelectedPos(); +//GetSelectedPos API 로 현재 블록 Pos 정보 저장 //... 블록 해제 +HwpCtrl.SelectText(posObj.spara, posObj.spos, posObj.epara, posObj.epos); +//3 +``` + +단계에서 저장한 블록 다시 블록 + +#### 1.2.20 `GetSelectedPosBySet` + +**구문** + +```js +HwpCtrl.GetSelectedPosBySet(sset, eset) +``` + +**설명** + +현재 설정된 블록의 위치 정보를 얻어옵니다. GetSelectedPos 의 ParameterSet 버전) + +**파라미터** + +- `sset`: 설정된 블록의 시작 ParameterSet ListParaPos) +- `eset`: 설정된 블록의 끝 ParameterSet ListParaPos) + +**반환값** + +성공하면 true 를 반환하고 실패면 false 를 반환합니다. + +**예제** + +1. 임의의 문서 작성 +2. 텍스트를 블록으로 선택 +3. 예제 스크립트 실행 결과: 현재 블록의 시작과 끝 얻어냅니다. + +```js +var sset = HwpCtrl.CreateSet('ListParaPos'); +var eset = HwpCtrl.CreateSet('ListParaPos'); +HwpCtrl.GetSelectedPosBySet(sset, eset); +alert(sset.Item('List') + ', ' +sset.Item('Para') + ', ' + sset.Item('Pos') + '\n' +eset.Item('List') + ', ' + eset.Item('Para') + ', ' + eset.Item('Pos')); +``` + +#### 1.2.21 `GetTableCellAddr` + +**구문** + +```js +HwpCtrl.GetTableCellAddr(type) +``` + +**설명** + +현재 커서가 위치한 셀의 주소 정보를 얻어옵니다. + +**파라미터** + +- `type`: 얻어올 주소의 type + +- 0 행 + +- 1 열 + +**반환값** + +0n 까지의 행, 열을 얻어옵니다.커서가 셀에 있지 않거나, 실패하면 _1을 반환합니다. + +**예제** + +1. 표 삽입 +2. 커서 이동 +3. 예제 스크립트 실행 +결과: 현재 커서가 위치한 셀의 주소 메시지 창 + +```js +var col = HwpCtrl.GetTableCellAddr(0); +var row = HwpCtrl.GetTableCellAddr(1); +alert("col :"+ col +", row :"+ row); +``` + +#### 1.2.22 `GetText` + +**구문** + +```js +HwpCtrl.GetText() +``` + +**설명** + +문서 중에서 텍스트를 얻는다. + +**반환값** + +Object 타입으로 리턴한다. Property 는 다음과 같다. text : 텍스트 데이터가 돌아온다. 텍스트에서 탭은 \t0x9, 문단 바뀜은 CR/LF0x0D/0x0A) 로 표 현되며, 이외의 특수 코드는 포함되지 않는다. result : 결과값을 Number 타입으로 리턴한다. 다음과 같은 결과값을 리턴한다. + +- 0 텍스트 정보 없음. + +- 1 리스트의 끝 + +- 2 일반 텍스트 + +- 3 다음 문단 + +- 4 제어 문자 내부로 들어 감. + +- 5 제어 문자를 빠져 나옴. + +- 101 초기화 안됨. InitScan() 실패 또는 InitScan() 을 실행하지 않은 경우) + +- 102 텍스트 변환 실패 + +**비고** + +기존 ActiveX 한글 컨트롤에서는 포인터를 인자로 받아서 처리하였다. WEB 환경에 맞춰서 객체를 리 턴하는 방식으로 변경되었다. GetText) 의 사용 전 InitScan() 검색 준비를 하고, 끝나면 ReleaseScan) 을 반드시 호출하여 관련 정보를 초기화 해주어야 한다. 텍스트가 있는 문단으로 캐럿을 이동 시키려면 moveScanPos 를 주고 MovePos) 를 호출하면 된다. + +**예제** + +1. 텍스트 입력 +2. 텍스트의 맨 앞으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 현재 캐럿부터 줄의 끝까지 Text 를 얻어낸다. + +```js +HwpCtrl.InitScan(0, 2); +alert(HwpCtrl.GetText().text); +HwpCtrl.ReleaseScan(); +``` + +#### 1.2.23 `GetTextBySet` + +**구문** + +```js +HwpCtrl.GetTextBySet(text) +``` + +**설명** + +문서 중에서 텍스트를 얻어옵니다.GetText 의 ParameterSet 버전) + +**파라미터** + +- `text`: Item 의 Text% 에 텍스트 데이터가 돌아옵니다. 텍스트에서 탭은 \t0x9, 문단 바뀜은 CR/LF0x0D/0x0A) 로 표현되며, 이외의 특수 코드는 포함되지 않습니다 + +**반환값** + +- 0 텍스트 정보 없음 + +- 1 목록의 끝 + +- 2 일반 텍스트 + +- 3 다음 문단 + +- 4 제어 문자 내부로 들어감 + +- 5 제어 문자를 빠져 나옴 + +- 101 초기화 안 됨InitScan() 실패 또는 InitScan() 을 실행하지 않은 경우) + +- 102 텍스트 변환 실패 + +**비고** + +GetTextBySet) 의 사용이 끝나면 ReleaseScan) 을 반드시 호출하여 관련 정보를 초기화 해주어야 합니다. 텍스트가 있는 문단으로 캐럿을 이동 시키려면 moveScanPos 를 주고 MovePos) 를 호출하면 됩니다. + +**예제** + +1. 임의의 텍스트 입력 +2. 캐럿 이동 +3. 예제 스크립트 실행 결과: 현재 캐럿부터 줄 끝까지의 Text 를 가져옴 + +```js +HwpCtrl.InitScan(0, 2); +var textSet = HwpCtrl.CreateSet('GetText'); +HwpCtrl.GetTextBySet(textSet); +alert(textSet.Item("Text")); +HwpCtrl.ReleaseScan(); +``` + +#### 1.2.24 `GetTextFile` + +**구문** + +```js +HwpCtrl.GetTextFile(format. option, callback) +``` + +**설명** + +현재 열린 문서를 문자열로 넘겨준다. + +**파라미터** + +- `format`: 파일의 형식 + +| format | 설명 | 비고 | +| --- | --- | --- | +| HWP | Hwp native format | BASE64 로 인코딩되어 있다. 저장된 내용 을 다른 곳에서 보여줄 필요가 없다면 이 포맷을 사용하기를 권장합니다 | +| HWPML2X | HWP 형식과 호환 | 문서의 모든 정보를 유지 | +| HTML | 인터넷 문서 HTML 형식 | 한글 고유의 서식은 손실된다. | +| TEXT | 유니코드 텍스트 | 서식정보가 없는 텍스트만 저장 | +| JSON | json format | 문서의 정보를 Json 형태로 만든다. 문서의 모든 정보를 유지 | + +- option + +| option | 값 | 설명 | +| --- | --- | --- | +| savebloc k | 선택된 블록만 저장 | 개체 선택 상태에서는 동작하지 않는다. | + +- `callback`: 콜백함수 + +- result: 콜백 함수의 인자로 결과 값을 받는다. 서버를 통하여 Text 를 얻어내므로 반드시 이후 동작을 콜백함수에 넣어주어야 한다 + +**반환값** + +결과 값을 문자열로 리턴한다.JSON 포맷에서만 리턴 값으로 받을 수 있다.) + +**예제** + +1. 문서 작성 +2. GetTextFile API 현재 문서 데이터 저장 +3. Clear API 로 현재 문서 초기화 +4. SetTextFile API 로 저장한 문서 다시 로드 결과 : 현재 문서의 데이터를 문자열 형태로 저장하고, 다시 불러온다. callback 방식 + +```js +//GetTextFile API 현재 문서 데이터 저장 +HwpCtrl.GetTextFile("HWP", "", function(result) { + data = result; +} +); +HwpCtrl.Clear(1); +//Clear API 로 현재 문서 초기화 //SetTextFile API 로 저장한 문서 다시 로드 +HwpCtrl.SetTextFile(data, "HWP", "", function(result) { + //이후 수행 할 동작 +} +, null); +``` + +async await 방식 + +```js +// GetTextFile API 현재 문서 데이터 저장 data = await +HwpCtrl.GetTextFile("HWP", ""); +// Clear API 로 현재 문서 초기화 +HwpCtrl.Clear(1); +// SetTextFile API 로 저장한 문서 다시 로드 await +HwpCtrl.SetTextFile(data, "HWP", ""); +``` + +#### 1.2.25 `InitScan` + +**구문** + +```js +HwpCtrl.InitScan(option, rang, spara, spos, epara, epos) +``` + +**설명** + +문서 검색을 위한 준비 작업을 한다. + +**파라미터** + +- `option`: 다음과 같은 옵션을 지정할 수 있다. 0을 지정하면 모두 off 이다. 생략하면 0이 지정된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| maskNorma l | 0x00 | 본문을 대상으로 검색한다. (서브리스트를 검색하지 않는다.) | +| maskChar | 0x01 | char 타입 컨트롤 마스크를 대상으로 한다. (강제줄나눔, 문단 끝, 하이픈, 묶움빈칸, 고정폭빈칸, 등...) | +| maskInline | 0x02 | inline 타입 컨트롤 마스크를 대상으로 한다. (누름틀 필드 끝, 등...) | +| maskCtrl | 0x04 | extende 타입 컨트롤 마스크를 대상으로 한다. (다단, 누름틀 필드 시작, Shape Object, 각주, 미주, 등...) | + +- `range`: 검색의 범위를 다음과 같은 옵션을 조합하여 지정할 수 있다. 생략하면 문서 시작부터 문 서의 끝까지 검색 범위가 지정된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| scanSposCurrent | 0x0000 | 캐럿 위치부터. (시작 위치) | +| scanSposSpecified | 0x0010 | spara, spos 에 지정한 위치부터. (시작 위치) | +| scanSposLine | 0x0020 | 줄의 시작부터. (시작 위치) | +| scanSposParagraph | 0x0030 | 문단의 시작부터. (시작 위치) | +| scanSposSection | 0x0040 | 구역의 시작부터. (시작 위치) | +| scanSposList | 0x0050 | 리스트의 시작부터. (시작 위치) | +| scanSposControl | 0x0060 | 컨트롤의 시작부터. (시작 위치) | +| scanSposDocument | 0x0070 | 문서의 시작부터. (시작 위치) | +| scanEposCurrent | 0x0000 | 캐럿 위치까지. (끝 위치) | +| scanEposSpecified | 0x0001 | epara, epos 에 지정한 위치까지. (끝 위치) | +| scanEposLine | 0x0002 | 줄의 끝까지. (끝 위치) | +| scanEposParagraph | 0x0003 | 문단의 끝까지. (끝 위치) | +| scanEposSection | 0x0004 | 구역의 끝까지. (끝 위치) | +| scanEposList | 0x0005 | 리스트의 끝까지. (끝 위치) | +| scanEposControl | 0x0006 | 컨트롤의 끝까지. (끝 위치) | +| scanEposDocument | 0x0007 | 문서의 끝까지. (끝 위치) | +| scanWithinSelection | 0x00ff | 검색의 범위를 블록으로 제한. | +| scanForward | 0x0000 | 정뱡향. (검색 방향) | +| scanBackward | 0x0100 | 역방향. (검색 방향) | + +- `spara`: 다음과 같은 옵션을 지정할 수 있다. 0을 지정하면 모두 off 이다. 생략하면 0이 지정된다 +- `spos`: 검색 시작 위치의 문단 중에서 문자의 위치. scanSposSpecified 옵션이 지정되었을 때만 유 효하다 +- `epara`: 검색 끝 위치의 문단 번호. scanEposSpecified 옵션이 지정되었을 때만 유효하다 +- `epos`: 검색 끝 위치의 문단 중에서 문자의 위치. scanEposSpecified 옵션이 지정되었을 때만 유효 하다 + +**반환값** + +성공하면 true, 실패하면 false + +**비고** + +기존 ActiveX 한글 컨트롤에서는 포인터를 인자로 받아서 처리하였다. WEB 환경에 맞춰서 객체를 리 턴하는 방식으로 변경되었다. + +**예제** + +1. 텍스트 입력 +2. 텍스트의 맨 앞으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 현재 캐럿부터 줄의 끝까지 Text 를 얻어낸다. + +```js +HwpCtrl.InitScan(0, 2); +alert(HwpCtrl.GetText().text); +HwpCtrl.ReleaseScan(); +``` + +#### 1.2.26 `Insert` + +**구문** + +```js +HwpCtrl.Insert(path, format, arg, callback, callbackUserData) +``` + +**설명** + +현재 캐럿 위치에 문서 파일을 삽입한다. + +**파라미터** + +- `path`: URL, blob +- `format`: 문서 형식. Open API 참고. 빈 문자열을 지정하면 자동으로 디텍트한다. 생략하면 빈 문자 열이 지정된다 +- `arg`: 세부 옵션. Open API 참고. 의미는 format 에 지정한 파일 형식에 따라 다르다. 생략하면 빈 문자열이 지정된다 +- `callback`: Insert 함수가 동작을 마친 후 수행될 함수 + +- Parameter + +- `result`: 성공 실패 여부, FileName, Size, CallbackUserData 를 포함한 Object +- `CallbackUserData`: Callback 함수에 Argument 로 넘겨 받을 result 에 포함될 UserData, 생략 가능 + +**반환값** + +성공하면 true, 실패하면 false Return Value 는 Argument 가 제대로 들어왔는지 정도의 판단을 할 수 있으며 실제로 문서 Insert 의 성공 여부는 콜백함수의 인자로 들어가는 result 에서 확인할 수 있다. + +**비고** + +브라우저에서는 로컬 파일 접근 권한이 없어 로컬 파일은 사용할 수 없다. + +**예제** + +1. 문서 작성 +2. 문서를 끼워넣을 위치로 캐럿 이동 +3. Insert API 로 테스트 문서 끼워넣기 결과 : 특정 위치에 문서 끼워넣기 callback 방식 + +```js +// ...문서를 끼워넣을 위치로 캐럿 이동 // ... // Insert API 로 테스트 문서 끼워넣기 +HwpCtrl.Insert("http://APIDOCS/testDoc/test.hwp", "HWP", "", function (res) { +``` + +console.log(res); }, null); + +async await 방식 + +```js +// ...문서를 끼워넣을 위치로 캐럿 이동 // ... // Insert API 로 테스트 문서 끼워넣기 await +HwpCtrl.Insert("http://APIDOCS/testDoc/test.hwp", "HWP", ""); +``` + +#### 1.2.27 `InsertBackgroundPicture` + +**구문** + +```js +HwpCtrl.InsertBackgroundPicture(bordertype, path, embedded, filloption, watermark, effect, brightnss, contrast, callback) +``` + +**설명** + +배경이미지를 넣는다. + +**파라미터** + +- `bordertype`: 배경 유형을 지정 + +| bordertype | 설명 | 비고 | +| --- | --- | --- | +| "SelectedCell" | 현재 선택된 표의 셀 의 배경을 변경한다. | | +| "SelectedCellDelete" | 현재 선택된 표의 셀 의 배경을 지운다. | 반드시 셀이 선택되어 있어야 함. 커서 가 위치하는 것만으로는 동작하지 않 음. | + +- `path`: 이미지 +- `URLembeded`: 이미지 파일을 문서내에 포함할지 여부 Boolean Type + +- 기존 ActiveX 한/글 컨트롤과 호환을 위해서 존재하는 인자로 true/false 여부를 떠나서 Embeded 로 동작 한다 + +- `filloption`: 삽입할 그림의 크기를 지정하는 옵션 +- `effect`: 이미지효과 + +| filloption | 설명 | 비고 | +| --- | --- | --- | +| 0 | 바둑판식으로 -모두 | | +| 1 | 현바둑판식으로 -가로/위 | | +| 2 | 바둑판식으로 -가로/아로 | | +| 3 | 바둑판식으로 -세로/왼쪽 | | +| 4 | 바둑판식으로 -세로/오른쪽 | | +| 5 | 크기에 맞추어 | 설정하지 않았을 때 기본값 | +| 6 | 가운데로 | | +| 7 | 가운데 위로 | | +| 8 | 가운데 아래로 | | +| 9 | 왼쪽 가운데로 | | +| 10 | 왼쪽 위로 | | +| 11 | 왼쪽 아래로 | | +| 12 | 오른쪽 가운데로 | | +| 13 | 오른쪽 위로 | | + +| effec t | 설명 | 비고 | +| --- | --- | --- | +| 0 | 원래 그림 | 설정하지 않았을 때 기본값 | +| 1 | 그래이 스케일 | | +| 2 | 흑백으로 | | + +- `watermark`: watermark 효과 유무 Boolean Type . true 이면 brightness 와 contrast 옵션이 무시된다 +- `brightness`: 밝기 지정100 100, 기본값 : 0 +- `contrast`: 선명도 지정100 100, 기본값 : 0 +- `callback`: InsertBackgroundPicture 함수가 동작을 마친 후 수행될 함수 + +- parameterresult : 성공 시 true, 실패 시 false + +**반환값** + +성공 시 true, 실패 시 false + +**비고** + +브라우저에서는 로컬 파일 접근 권한이 없어 로컬 파일은 사용할 수 없다. + +**예제** + +1. 표 생성 +2. 셀안으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 셀에 배경이미지를 넣고, 제거한다. callback 방식 + +```js +// .... 셀 내부로 캐럿 이동 // ... // 배경 이미지 삽입 HwpCt rl.InsertB ackg roundPi cture("S electedC ell", "http://APIDOCS/testDoc/logo.png", 1, 5, 0, 0, 0, 0, function (res) { + console.log(res); +} +); +// ... // .... 배경이미지 넣은 셀 내부로 캐럿 이동 // 배경 이미지 제거 +HwpCtrl.InsertBackgroundPicture("SelectedCellDelete", 0, 0, 0, 0, 0, 0, 0, function (res) { +``` + +console.log(res); }); + +async await 방식 + +```js +// .... 셀 내부로 캐럿 이동 // ... // 배경 이미지 삽입 await +HwpCtrl.InsertBackgroundPicture("SelectedCell", "http://APIDOCS/testDoc/logo.png", 1, 5, 0, 0, 0, 0); +// ... // .... 배경이미지 넣은 셀 내부로 캐럿 이동 // 배경 이미지 제거 await +HwpCtrl.InsertBackgroundPicture("SelectedCellDelete", 0, 0, 0, 0, 0, 0, 0); +``` + +#### 1.2.28 `InsertCtrl` + +**구문** + +```js +HwpCtrl.InsertCtrl(ctrlid, initparam) +``` + +**설명** + +현재 캐럿 위치에 컨트롤을 삽입한다. + +**파라미터** + +- 캐럿 위치 정보를 Object 타입으로 리턴한다. Object 의 Property 는 다음과 같다 +- `ctrlid`: 삽입할 컨트롤의 아이디initparam : 컨트롤의 초기 속성. 생략하면 디폴트 속성으로 생성한다 + +**반환값** + +생성된 CtrlCode 객체를 리턴한다. + +**비고** + +```js +ctrlid 에 지정할 수 있는 컨트롤 ID는 HwpCtrl.CtrlID 가 리턴하는 ID와 동일하다. 자세한 것은 Ctrl 오 브젝트 Properties 인 CtrlID 를 참조.initparam 에는 컨트롤의 초기 속성을 지정한다. +``` + +**예제** + +1. 예제 스크립트 실행 결과 : 5x5 크기의 표를 삽입한다. + +```js +var tbact = HwpCtrl.CreateAction("TableCreate"); +var tbset = tbact.CreateSet(); +tbact.GetDefault(tbset); +tbset.SetItem("Rows", 5); +tbset.SetItem("Cols", 5); +var table = HwpCtrl.InsertCtrl("tbl", tbset); +``` + +#### 1.2.29 `InsertDocument` + +**구문** + +```js +HwpCtrl.InsertDocument(path, callback, callbackUserData) +``` + +**설명** + +현재 캐럿 위치에 문서를 끼워넣는 기능. + +**파라미터** + +- `path`: URL, blob +- `callback`: InsertDocument 함수가 동작을 마친 후 수행될 함수 + +- 콜백 인자 `result`: 성공 실패 여부, FileName, Size, CallbackUserData 를 포함한 Object +- `CallbackUserData`: Callback 함수에 Argument 로 넘겨 받을 result 에 포함될 UserData, 생략 가능 + +**반환값** + +성공하면 true, 실패하면 false Return Value 는 Argument 가 제대로 들어왔는지 정도의 판단을 할 수 있으며 실제로 문서 InsertDocument 의 성공 여부는 콜백함수의 인자로 들어가는 result 에서 확인할 수 있다. + +**비고** + +브라우저에서는 로컬 파일 접근 권한이 없어 로컬 파일은 사용할 수 없다. + +**예제** + +1. 문서 작성 +2. 문서를 끼워넣을 위치로 캐럿 이동 +3. InsertDocument API 로 테스트 문서 끼워넣기 결과 : 특정 위치에 문서 끼워넣기 callback 방식 + +```js +// ...InsertDocument 끼워넣을 위치로 캐럿 이동 // ... // InsertDocument API 로 테스트 문서 끼워넣기 +HwpCtrl.InsertDocument("http://APIDOCS/testDoc/test.hwp", function (res) { +``` + +console.log(res); }, null); + +async await 방식 + +```js +// ...문서를 끼워 넣을 위치로 캐럿 이동 // ... // InsertDocument API 로 테스트 문서 끼워넣기 await +HwpCtrl.InsertDocument("http://APIDOCS/testDoc/test.hwp", "HWP", ""); +``` + +#### 1.2.30 `InsertPicture` + +**구문** + +```js +HwpCtrl.InsertPicture(path, embeded, sizeoption, reverse, watermark, effect, width, height, callback) +``` + +**설명** + +현재 캐럿의 위치에 그림을 삽입한다. + +**파라미터** + +- `path`: 이미지 +- `URLembeded`: 이미지 파일을 문서내에 포함할지 여부 true/false + +- 기존 API 사용자와 호환을 위해서 존재하는 Parameter, true/false 여부를 떠나서 Embeded 로 동작 한다 + +- `sizeoption`: 삽입할 그림의 크기를 지정하는 옵션 + +| sizeoption | 설명 | +| --- | --- | +| 0 | 이미지 원래의 크기로삽입한다. width 와 height 를 지정할 필요없다. | +| 1 | width 와 height 에 지정한 크기로 그림을 삽입한다. | +| 2 | width 는 셀의 width 만큼, height 는 셀의 height 만큼 확대/축소된다. | +| 3 | 현재 캐럿이 표의 셀안에 있을 경우, 셀의 크기에 맞추어 원본 이미지의 가로 세로의 비율이 동일하게 확대/축소하여 삽입한다. | + +- `reverse`: 이미지의 반전 유무 true/false) +- `watermark`: watermark 효과 유무 true/false) +- `effect`: 그림 효과 + +| option | 설명 | +| --- | --- | +| 0 | 실제 이미지 그대로 | +| 1 | 그레이 스케일 | +| 2 | 흑백효과 | + +- `width`: 그림의 가로 크기 지정. 단위는 mm +- `height`: 그림의 높이 크기 지정. 단위는 mm +- `callback`: InsertPicture 함수가 동작을 마친 후 수행될 함수 + +- ctrl: 성공 시 생성된 컨트롤 객체, 실패 시 null + +**반환값** + +성공하면 true, 실패하면 false + +**비고** + +브라우저에서는 로컬 파일 접근 권한이 없어 로컬 파일은 사용할 수 없다. + +**예제** + +1. 예제 스크립트 실행 결과 : 셀에 배경이미지를 넣고, 제거한다. callback 방식 + +```js +HwpCtrl.InsertPicture("http://APIDOCS/testDoc/logo.png", true, 1, false, false, 0, 30, 20, function(ctrl) { + //InsertPicture 이후 동작 +} +); +``` + +async await 방식 + +```js +await HwpCtrl.InsertPicture("http://APIDOCS/testDoc/logo.png", true, 1, false, false, 0, 30, 20); +``` + +#### 1.2.31 `IsCommandLock` + +**구문** + +```js +HwpCtrl.IsCommandLock(actionID) +``` + +**설명** + +특정 액션이 잠금 상태인지 여부를 조사합니다. + +**파라미터** + +- `actionID`: 액션 ID + +**반환값** + +해당 액션이 잠금상태이면 True 를 반환하고, 잠금상태가 아니면 False 를 반환합니다. + +**예제** + +1. LockCommand 를 이용해 Bold Action 을 잠금 +2. 예제 스크립트 실행 결과: Bold Action 잠김 여부 메시지 창 + +```js +HwpCtrl.LockCommand('CharShapeBold', true); +var isCommandLock = HwpCtrl.IsCommandLock('CharShapeBold'); +if(isCommandLock) { + alert('Bold Action 을실행할수없습니다.') +} +else { + alert('Bold Action 을실행할수있습니다.') +} +``` + +#### 1.2.32 `IsSpellCheckCompleted` + +**구문** + +```js +HwpCtrl.IsSpellCheckCompleted() +``` + +**설명** + +맞춤법 검사가 완료되었는지를 판단한다. + +**반환값** + +성공 시 true, 실패 시 false + +**비고** + +기존 ActiveX 한글 컨트롤에서는 포인터를 인자로 받아서 처리하였다. WEB 환경에 맞춰서 객체를 리 + +턴하는 방식으로 변경되었다. + +**예제** + +1. 텍스트 입력 +2. 예제 스크립트 실행 결과 : 맞춤법 검사가 되어 있지 않다면 맞춤법 검사를 실행한다. + +```js +if (!HwpCtrl.IsSpellCheckCompleted()) { + // 맞춤법 검사 완료 여부 체크 + HwpCtrl.MovePos(2); + // 문서 시작부분으로 이동 + var dact = HwpCtrl.CreateAction("SpellingCheck"); + //맞춤법 검사 액션 생성 +``` + +및 실행 + +```js +var dset = dact.CreateSet(); +dact.GetDefault(dset); +dset.SetItem("CheckStart", 1); +dact.PopupDialog(dset, function() { + //PopupDialog 이후 수행될 동작 +} +, null); +} +``` + +#### 1.2.33 `LockCommand` + +**구문** + +```js +HwpCtrl.LockCommand(actionID, lock) +``` + +**설명** + +특정 액션이 실행되지 않도록 잠급니다. + +**파라미터** + +- `actionID`: 액션 ID +- `lock`: true 이면 액션의 실행을 lock 시키고, false 이면 unlock 시킵니다 + +**예제** + +1. 예제 스크립트 실행 결과: Bold Action 이 잠김 + +```js +HwpCtrl.LockCommand('CharShapeBold', true); +``` + +#### 1.2.34 `ModifyFieldProperties` + +**구문** + +```js +HwpCtrl.ModifyFieldProperties(field, remove, add) +``` + +**설명** + +지정한 필드의 속성을 바꿉니다. + +**파라미터** + +- `field`: 속성을 바꿀 필드 이름의 리스트. 형식은 PutFieldText 과 동일합니다 +- `remove`: 제거될 속성 +- `add`: 추가될 속성 + +**반환값** + +음수가 리턴되면 에러임을 나타냅니다.그 외의 리턴값은 아래 remark 참조) + +**비고** + +속성의 값은 아래와 같다. + +| long value | 설명 | +| --- | --- | +| 0x00000001 | 양식모드에서 편집가능 속성 (0: 편집 불가, 1: 편집 가능) | + +return 값의 bit field 는 다음과 같다. + +| long value bit mask | 설명 | +| --- | --- | +| 0x00000001 | 양식모드에서 편집가능 속성 (0: 편집 불가, 1: 편집 가능) | +| 0x80000000 | 에러 | +| 0x40000000 | 필드를 찾을 수 없음 | + +**예제** + +1. 본문 이라는 필드 생성 +2. 예제 스크립트 실행 결과: 본문 필드의 속성 변경 + +```js +var ModifyFieldPropertiesTest = function() { + var ret = HwpCtrl.ModifyFieldProperties("본문", 0, 0); + if (ret"0 ) { + var strErrMsg ="test 필드의 정보를 알아오는 데 실패"; + if(ret"0x40000000) strErrMsg +="\n 지정한필드를찾을수없습니다."; + alert(strErrMsg); + return; + } +if (ret"0x00000001) { + alert("현재 양식모드에서 편집 가능"); + ret = HwpCtrl.ModifyFieldProperties("본문", 1, 0); +} +else { + alert("현재 양식모드에서 편집 불가능"); + ret = HwpCtrl.ModifyFieldProperties("본문", 0, 1); +} +if (ret"0 ) { + alert("필드 속성 변경 실패."); +} +if (ret"0x00000001) alert("양식모드에서 편집 가능하도록 변경되었 습니다."); +else alert("양식모드에서 편집 불가능하도록 변경되었 습니다."); +} +``` + +ModifyFieldPropertiesTest(); + +#### 1.2.35 `MovePos` + +**구문** + +```js +HwpCtrl.MovePos(moveID, para, pos) +``` + +**설명** + +캐럿의 위치를 옮긴다. + +**파라미터** + +- `moveID`: 다음과 같은 값을 지정할 수 있다. 생략하면 moveCurList 가 지정된다 + +| ID | 값 | 설명 | +| --- | --- | --- | +| moveNextChar | 16 | 한 글자 뒤로 이동.(현재 리스트만을 대상으로 동작한다.) | +| movePrevChar | 17 | 한 글자 앞으로 이동. (현재 리스트만을 대상으로 동작한다.) | +| moveNextWord | 18 | 한 단어 뒤로 이동. (현재 리스트만을 대상으로 동작한다.) | +| movePrevWord | 19 | 한 단어 앞으로 이동. (현재 리스트만을 대상으로 동작한다.) | +| moveNextLine | 20 | 한 줄 아래로 이동. | +| movePrevLine | 21 | 한 줄 위로 이동. | +| moveStartOfLine | 22 | 현재 위치한 줄의 시작으로 이동. | +| moveEndOfLine | 23 | 현재 위치한 줄의 끝으로 이동. | +| moveParentList | 24 | 한 레벨 상위로 이동한다. | +| moveTopLevelList | 25 | 탑레벨 리스트로 이동한다. | +| moveRootList | 26 | 루트 리스트로 이동한다. | +| moveCurrentCaret | 27 | 현재 캐럿이 위치한 곳으로 이동한다. (캐럿 위치가 뷰의 맨 위쪽으로 올라간다. ) | +| moveLeftOfCell | 100 | 현재 캐럿이 위치한 셀의 왼쪽 | +| moveRightOfCell | 101 | 현재 캐럿이 위치한 셀의 오른쪽 | +| moveUpOfCell | 102 | 현재 캐럿이 위치한 셀의 위쪽 | +| moveDownOfCell | 103 | 현재 캐럿이 위치한 셀의 아래쪽 | +| moveStartOfCell | 104 | 현재 캐럿이 위치한 셀에서 행(row) 의 시작 | +| moveEndOfCell | 105 | 현재 캐럿이 위치한 셀에서 행(row) 의 끝 | +| moveTopOfCell | 106 | 현재 캐럿이 위치한 셀에서 열(column) 의 시작 | +| moveBottomOfCell | 107 | 현재 캐럿이 위치한 셀에서 열(column) 의 끝 | +| moveScrPos | 200 | 한/글 문서장에서의 screen 좌표로서 위치를 설정 한다. | +| moveScanPos | 201 | GetText() 실행 후 위치로 이동한다. | + +- `para`: 이이동할 문단의 번호. moveMain 또는 moveCurList 가 지정되었을 때만 사용된다. moveScrPos 가 지정되었을 때는 문단번호가 아닌 스크린 좌표로 해석된다 +- `pos`: 이동할 문단 중에서 문자의 위치. moveMain 또는 moveCurList 가 지정되었을 때만 사용된다 + +**반환값** + +성공하면 true, 실패하면 false + +**비고** + +moveScrPos 가 지정되었을 때는 스크린 좌표는 마우스 커서의 x,y 좌표를 그대로 넘겨 주면 된다.moveScanPos 는 문서를 검색하는 중에 캐럿을 이동 시키려 할 경우에만 사용이 가능하다. + +**예제** + +1. 문서 작성 +2. 캐럿 이동 +3. GetPos API 로 현재 Pos 정보 저장 +4. 다른 위치로 캐럿 이동 +5. 3단계에서 저장한 위치로 캐럿 이동 결과 : 캐럿 위치를 저장하고, 다시 이동한다. + +```js +posObj = HwpCtrl.GetPos(); +//GetPos API 로 현재 Pos 정보 저장 //... 다른 위치로 캐럿 이동 +HwpCtrl.MovePos(0, posObj.para, posObj.pos); +//3단계에서 저장한 위치로 캐럿 이동 +``` + +#### 1.2.36 `MoveToField` + +**구문** + +```js +HwpCtrl.MoveToField(field, text, start, select) +``` + +**설명** + +지정한 필드로 캐럿을 이동한다. + +**파라미터** + +- `field`: 필드 이름. GetFieldText/PutFieldText 과 같은 형식으로 이름 뒤에 #4 로 번호를 지정할 수 + +- 있다 +- `text`: 필드가 누름틀일 경우 누름틀 내부의 텍스트로 이동할지(true) 누름틀 코드로 이동할지(false) 를 지정한다. 누름틀이 아닌 필드일 경우 무시된다. 생략하면 true 지정된다 +- `start`: 필드의 처음(true) 으로 이동할지 끝(false) 으로 이동할지 지정한다. select 를 true 로 지정하면 무시된다. 생략하면 true 가 지정된다 +- `select`: 필드 내용을 블록으로 선택할지(true), 캐럿만 이동할지(false) 지정한다. 생략하면 false 가 지정된다 + +**반환값** + +성공하면 true, 실패하면 false + +**비고** + +누름틀은 한글 메뉴 중 입력 > 개체 > 필드 입력 메뉴를 선택하면 누름틀을 만드실 수 있습니다. + +**예제** + +1. 누름틀 삽입 필드 이름 본문 +2. MoveToField API 로 본문 필드로 이동 결과 : 특정 필드로 이동한다. + +```js +HwpCtrl.MoveToField("본문", true, true, false); +``` + +#### 1.2.37 `Open` + +**구문** + +```js +HwpCtrl.Open(path, format, arg, callback, callbackUserData) +``` + +**설명** + +문서 파일을 연다. + +**파라미터** + +- `path`: URL, blob +- `format`: 문서 형식. 빈 문자열을 지정하면 자동으로 디텍트한다. 생략하면 빈 문자열이 지정된다 + +| format | 설명 | +| --- | --- | +| "HWP" | 한글 native format | +| "HWP30" | 한글 3.X/96/97 | +| "HTML" | 인터넷 문서 | +| "TEXT" | 아스키 텍스트 문서 | +| "UNICODE" | 유니코드 텍스트 문서 | +| "HWP20" | 한글 2.0 | +| "HWP21" | 한글 2.1/2.5 | +| "HWP15" | 한글 1.X | +| "HWPML2X" | HWPML 2.X 문서 (Open / SaveAs 가능) | +| "HWPX" | 한글 표준 문서 (실무협의서 웹기안기에서 사용) | +| "MSWORD" | 마이크로소프트 워드 문서 | +| "PUBDOCBODY" | 공문서(xml) | + +- `arg`: 세부 옵션. 의미는 format 에 지정한 파일 형식에 따라 다르다. 생략하면 빈 문자열이 지정된다. arg 에 지정할 수 있는 옵션의 의미는 필터가 정의하기에 따라 다르지만, 신택스는 다음과 같이 공통된 형식을 사용한다.key:value;key:value; + +| 분류 | arg | Type | 설명 | +| --- | --- | --- | --- | +| 모든 Format | setcurdir | Boolean | 로드한 후 해당 파일이 존재하는 폴더로 현재 위치를 변경한다. hyperlink 정보가 상대적인 위치로 되어 있을 때 유용하다. | +| "HWP" | lock | Boolean | 로드한 후 해당 파일을 계속 오픈한 상태로 lock 을 걸지 여부 | +| "HWP" | notext | Boolean | 텍스트 내용을 읽지 않고 헤더 정보만 읽을지 여부. (스타일 로드 등에 사용) | +| "HWP" | template | Boolean | 새로운 문서를 생성하기 위해 템플릿 파일을 오픈한다. 이 옵션이 주어지면 lock은 무조건 false 로 처리된다. | +| "HWP" | suspendpassword | Boolean | true 로 지정하면, 암호가 있는 파일일 경우 암호를 묻지 않고 무조건 읽기에 실패한 것으로 처리한다. | +| "HWP" | forceopen | Boolean | true 로 지정하면, 읽기 전용으로 읽어야 하는 경우 대화상자를 띄우지 않는다. | +| "HWP" | versionwarning | Boolean | true 로 지정하면, 문서가 상위버전일 경우 메시지 박스를 띄우게 된다. | +| "HTML" | code | String, CodePage | 문서 변환 시 사용되는 코드 페이지를 지정할 수 있으며 code 키가 존재할 경우 필터 사용 시 사용자 다이얼로그를 띄우지 않는다. | +| "HTML" | textunit | Boolean, Pixel | Export 될 Text 의 크기의 단위 결정 pixel, point, mili 지정 가능. | +| "HTML" | formatunit | Boolean, Pixel | Export 될 문서 포맷 관련 (마진, Object 크기 등) 단위 결정. pixel, point, mili 지정 가능 | +| "DOCIMG" | asimg | Boolean | 저장할 때 페이지를 image 로 저장 | +| "DOCIMG" | ashtml | Boolean | 저장할 때 페이지를 html 로 저장 | +| "TEXT" | code | String | 문서 변환 시 사용되는 코드 페이지를 지정할 수 있으며 code 키가 존재할 경우 필터 사용 시 사용자 다이얼로그를 띄우지 않는다. | + +- `callback`: Open 함수가 동작을 마친 후 수행될 함수 + +- 콜백 인자 `result`: 성공 실패 여부, FileName, Size, CallbackUserData 를 포함한 Object + +- `CallbackUserData`: Callback 함수에 Argument 로 넘겨 받을 result 에 포함될 UserData, 생략 가능 + +**반환값** + +성공하면 true, 실패하면 false Return Value 는 Argument 가 제대로 들어왔는지 정도의 판단을 할 수 있으며 실제로 문서 Open 의 성공 여부는 콜백함수의 인자로 들어가는 result 에서 확인할 수 있다. + +**비고** + +브라우저에서는 로컬 파일 접근 권한이 없어 로컬 파일은 사용할 수 없다. + +**예제** + +1. 예제 스크립트 실행 결과 : 휴가계 문서를 오픈한다. callback 방식 + +```js +HwpCtrl.Open("http://APIDOCS/testDoc/test.hwp", "HWP", "", function (res) { + console.log(res); +}, null); +``` + +async await 방식 + +```js +await HwpCtrl.Open("http://APIDOCS/testDoc/test.hwp", "HWP", ""); +``` + +#### 1.2.38 `PrintDocument` + +**구문** + +```js +HwpCtrl.PrintDocument +``` + +**설명** + +문서를 PDF 로 변환하여 보여준다. + +**비고** + +WEB 환경에서 인쇄 드라이버에 직접 접근할 수 없다.때문에 웹브라우저 상의 PDF 뷰어 혹은 로컬 PDF 뷰어를 통해서 인쇄 설정 및 인쇄를 할 수 있도록 문서를 PDF 포맷으로 변환한다. + +**예제** + +1. 문서 작성 +2. 예제 스크립트 실행 결과 : 현재 문서가 PDF 로 변환되어 보여진다. + +```js +HwpCtrl.PrintDocument(); +``` + +#### 1.2.39 `PutFieldText` + +**구문** + +```js +HwpCtrl.PutFieldText(fieldlist, textlist) +``` + +**설명** + +지정한 필드의 내용을 채운다. + +**파라미터** + +- `fieldlist`: 내용을 채울 필드 이름의 리스트. 한 번에 여러 개의 필드를 지정할 수 있으며, 형식은 GetFieldText 와 동일하다. 다만 필드 이름 뒤에 # 로 번호를 지정하지 않으면 해당 이름을 가진 모든 필드에 동일한 텍스트를 채워 넣는다. 즉, PutFieldText 에서는 필드이름과 필드이름0 의 의미가 다르다 +- `textlist`: 필드에 채워 넣을 문자열의 리스트. 형식은 필드 리스트와 동일하게 필드의 개수만큼 텍스트를 0x02 로 구분하여 지정한다 + +**비고** + +현재 필드에 입력되어 있는 내용은 지워진다. 채워진 내용의 글자모양은 필드에 지정해 놓은 글자모양을 따라간다. fieldlist 의 필드 개수와, textlist 의 텍스트 개수는 동일해야 한다. 존재하지 않는 필드에 대해서는 무시한다. + +**예제** + +1. 누름틀 생성 +2. 필드이름 이름으로 지정 +3. 예제 스크립트 실행 결과 : 문서 내에 이름 필드가 있다면 해당 필드의 정렬을 가운데 정렬로 변경하고, 홍길동이라고 텍스트를 입력한다. + +```js +if(HwpCtrl.FieldExist("이름")) { + HwpCtrl.MoveToField("이름", true, true, true); + HwpCtrl.Run("ParagraphShapeAlignCenter"); + HwpCtrl.PutFieldText("이름", "홍길동"); +} +``` + +#### 1.2.40 `ReleaseScan` + +**구문** + +```js +HwpCtrl.ReleaseScan() +``` + +**설명** + +InitScan() 으로 설정된 정보를 초기화 한다. + +**예제** + +1. 텍스트 입력 +2. 텍스트의 맨 앞으로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 현재 캐럿부터 줄의 끝까지 Text 를 얻어낸다. + +```js +HwpCtrl.InitScan(0, 2); +alert(HwpCtrl.GetText().text); +HwpCtrl.ReleaseScan(); +``` + +#### 1.2.41 `RenameField` + +**구문** + +```js +HwpCtrl.RenameField(oldname, newname) +``` + +**설명** + +지정한 필드의 이름을 바꾼다. + +**파라미터** + +- `oldname`: 이름을 바꿀 필드 이름의 리스트. 형식은 PutFieldText 과 동일하다 +- `newname`: 새로운 필드 이름의 리스트. oldname 과 동일한 개수의 필드 이름을 0x02 로 구분하여 지정한다 + +**비고** + +예를 들어 oldname 에 title0\x02title1, newname 에 tt1\x02tt2 로 지정하면 첫 번째 title 은 tt1 로, 두 번째 title 은 tt2 로 변경된다. oldname 의 필드 개수와, newname 의 필드 개수는 동일해야 한다. 존재하지 않는 필드에 대해서는 무시한다. + +**예제** + +1. 누름틀 입력 FieldName 이름1 +2. 예제 스크립트 실행 결과 : 이름1으로 지정된 누름틀의 필드이름이 이름2로 바뀐다. + +```js +HwpCtrl.RenameField(“ 이름1”, “이름2”); +``` + +#### 1.2.42 `ReplaceAction` + +**구문** + +```js +HwpCtrl.ReplaceAction(oldActionID, newActionID) +``` + +**설명** + +메뉴나 단축키로 호출되는 Action 을 교체합니다. + +**파라미터** + +- `oldActionID`: 교체할 원본 Action 의 이름 +- `newActionID`: 교체될 새로운 Action 의 이름 + +**반환값** + +성공여부, ActionID 가 잘못된 경우에는 실패합니다. + +**비고** + +메뉴나 단축키로 호출되는 Action 을 교체할 뿐, CreateAction 이나, Run 등의 API 를 이용할 때는 아무런 영향을 주지 못합니다. 교체된 OldActionID 를 원래대로 되돌려 놓기 위해서는 OldActionID 와 NewActionID 의 이름을 동일하게 하여 호출합니다. + +- 예: `ReplaceAction("FileSave","FileSave")`OldActionID 와 NewActionID 가 구조적으로 연결된 경우에는 해당 Action 을 실행하면 무한 루프를 돌게 됩니다. + +- 예: `ReplaceAction("FileSave","FileSaveAs")` `ReplaceAction("FileSaveAs","FileSave")` 를 둘다 호출한 경우 FileSave 나, FileSaveAs 를 호출하면 Stack overflow 가 발생합니다. + +**예제** + +1. 임의의 텍스트 삽입 및 선택 +2. 예제 스크립트 실행 결과: 진하게 클릭 시 글자모양 다이얼로그 창 표시 + +```js +HwpCtrl.ReplaceAction('CharShapeBold', 'CharShape'); +``` + +#### 1.2.43 `Run` + +**구문** + +```js +HwpCtrl.Run(actionID, callback, callbackUserData) +``` + +**설명** + +액션을 실행한다. + +**파라미터** + +- `actionID`: 액션 ID +- `callback`: 액션 실행 후 실행 될 함수 + +- 콜백 인자: 콜백을 호출한 Action 객체 result: 액션 실행 결과 Boolean 타입 callbackUserData: 사용자가 콜백에 전달한 데이터 + +- `callbackUserData`: 사용자가 콜백에 전달한 데이터 + +**예제** + +1. 글자 입력 +2. 입력한 글자 Selection +3. 예제 스크립트 실행 결과 : Selection 된 글자들에 Bold 속성을 부여한다. callback 방식 + +```js +HwpCtrl.Run("CharShapeBold", function (res) { + console.log(res); +} +); +``` + +async await 방식 + +```js +await HwpCtrl.Run("CharShapeBold"); +``` + +#### 1.2.44 `SaveAs` + +**구문** + +```js +HwpCtrl.SaveAs(fileName, format, arg, callback, callbackUserData) +``` + +**설명** + +현재 편집중인 문서를 지정한 이름으로 저장한다. + +**파라미터** + +- `fileName`: 로컬에 다운로드할 때에 파일의 이름을 지정한다. arg 인자에 download:true 포함되어 있을 때 로컬에 저장된다. 그때 사용되는 파일 이름 +- `format`: 문서 형식. 생략하면 HWP2 가 지정된다 + +| format | 설명 | +| --- | --- | +| "HWP" | 한글 native format | +| "HWPX" | 한글 표준 형식 | +| "HWPML2X" | HWPML 2.X 문서 | +| "ODT" | OpenDocument Text 형식 | +| "HTML" | 인터넷 문서 | +| "TEXT" | 아스키 텍스트 문서 | +| "UNICODE" | 유니코드 텍스트 문서 | +| "PUBDOCBODY" | 공문서(xml) | +| "PDF" | PDF(Portable Document Format) | +| "PDFA" | PDF/A | + +- `arg`: 세부 옵션. 의미는 format 에 지정한 파일 형식에 따라 다르다. 생략하면 빈 문자열이 지정된다. download:true 를 넣으면 문서가 로컬에 다운로드 된다 +- `callback`: SaveAs 함수가 동작을 마친 후 수행될 함수 + +- 콜백 인자 `result`: 성공/실패 여부, `path`, `fileName`, `Size`, `CallbackUserData`를 포함한 Object +- `callbackUserData`: 사용자가 콜백에 전달한 데이터 + +**비고** + +format, arg 의 일반적인 개념에 대해서는 Open 참조. HWP2 형식으로 파일 저장 시 arg 에 지정할 수 있는 옵션은 다음과 같다. + +| 인자 | Type | Default | 설명 | +| --- | --- | --- | --- | +| compress | Boolean | true | 압축 여부 | +| prvimage | Number | 2 | 미리보기 이미지(0=off, 1=BMP, 2=GIF) | +| prvtext | Number | 1 | 미리보기 텍스트(0=off, 1=0) | +| download | Boolean | false | true: DownLoad 폴더에 다운로드, false: 다운로드 하지 않음. | + +여러 개를 한꺼번에 할 경우에는 세미콜론으로 구분하여 연속적으로 사용할 수 있다. download:true;prvtext:1 + +**예제** + +1. 문서 작성 +2. 예제 스크립트 실행 결과 : 현재 열려있는 문서를 다운로드 폴더에 다운로드한다. callback 방식 + +```js +HwpCtrl.SaveAs("test.hwp", "HWP", "download:true", function() { + // SaveAs 실행 후 동작 +}, null); +``` + +async await 방식 + +```js +await HwpCtrl.SaveAs("test.hwp", "HWP", "download:true"); +``` + +#### 1.2.45 `SelectText` + +**구문** + +```js +HwpCtrl.SelectText(spara, spos, epara, epos) +``` + +**설명** + +블록을 설정한다. + +**파라미터** + +- `spara`: 블록 시작 위치의 문단 번호 +- `spos`: 블록 시작 위치의 문단 중에서 문자의 위치 +- `epara`: 블록 끝 위치의 문단 번호 +- `epos`: 블록 끝 위치의 문단 중에서 문자의 위치 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 문서 작성 +2. 텍스트 블록 +3. GetSelectedPos API 로 현재 블록 Pos 정보 저장 +4. 블록 해제 +5. 3단계에서 저장한 블록 다시 블록 결과 : 현재 설정된 블록의 위치를 저장하고, 이후에 다시 그 위치의 Text 를 블록한다. + +```js +posObj = HwpCtrl.GetSelectedPos(); +//GetSelectedPos API 로 현재 블록 Pos 정보 저장 //... 블록 해제 +HwpCtrl.SelectText(posObj.spara, posObj.spos, posObj.epara, posObj.epos); +//3 +``` + +단계에서 저장한 블록 다시 블록 + +#### 1.2.46 `SetCurFieldName` + +**구문** + +```js +HwpCtrl.SetCurFieldName(fieldname, option, direction, memo) +``` + +**설명** + +현재 캐럿 위치의 데이터 필드 이름을 설정한다. + +**파라미터** + +- `fieldname`: 데이터 필드 이름 +- `option`: 다음과 같은 옵션을 지정할 수 있다. 0을 지정하면 모두 off 이다. 생략하면 0이 지정된다 +- `direction`: 누름틀 필드의 안내문. 누름틀 필드일 때만 유효하다 +- `memo`: 누름틀 필드의 메모. 누름틀 필드일 때만 유효하다 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 누름틀 생성 +2. 생성한 누름틀로 캐럿 이동 +3. 예제 스크립트 실행 결과 : 현재 필드의 이름을 이름으로 설정하고 이름 필드에 홍길동을 입력한다. + +```js +HwpCtrl.SetCurFieldName("이름"); +if(HwpCtrl.GetCurFieldName(0) =="이름") { + HwpCtrl.PutFieldText("이름", "홍길동"); +} +``` + +#### 1.2.47 `SetMetaTag` + +**구문** + +```js +HwpCtrl.SetMetaTag(name, format, value) +``` + +**설명** + +문서 내 메타태그 정보를 삽입합니다. + +**파라미터** + +- `name`: 메타태그의 검색 이름. 같은 이름이 이미 존재하면 덮어씁니다 +- `format`: 아래 표 참고 + +| ID | 값 | 설명 | +| --- | --- | --- | +| 텍스트 | “text” | 메타태그 값으로 문자열이 입력됨 | +| 숫자 | “num” | 메타태그 값으로 숫자가 입력됨 | +| 날짜 | “date” | 메타태그 값으로 날짜가 입력됨 | +| 예 또는 아니요 | “yesno ” | 메타태그 값으로 Boolean 값이 입력됨 | + +- `value`: 메타태그의 데이터. format 에 맞게 입력하는 것을 권장한다 + +| ID | 값 예제 | 비고 | +| --- | --- | --- | +| 텍스트 | “한글과컴퓨터” | | +| 숫자 | “2022” | | +| 날짜 | “2022-07-18” | | +| 예 또는 아니요 | “yes”, “no” | “yes”, “no” 문자열만 유효함 | + +**반환값** + +성공 시 true 를 반환하며, 실패하면 false 를 반환한다. + +**비고** + +hwpx 에서만 사용가능합니다. + +**예제** + +1. 예제 스크립트 실행 결과: 현재 문서에 메타태그 정보를 삽입합니다. + +```js +var tag; +HwpCtrl.SetMetaTag("office", "text", "한글과컴퓨터"); +HwpCtrl.GetTextFile("HWPX", "", function (result) { + data = result; + HwpCtrl.Clear(1); + HwpCtrl.SetTextFile(data, "HWPX", "", function (result) { + tag = HwpCtrl.GetMetaTag("office"); + alert('name : '+ tag.NAME + '\n' + 'value : ' + tag.VALUE); + } +, null); +} +); +``` + +#### 1.2.48 `SetPos` + +**구문** + +```js +HwpCtrl.SetPos(list, para, pos) +``` + +**설명** + +캐럿을 문서 내 특정 위치로 위치시킨다. + +**파라미터** + +- `list`: 캐럿이 위치할 문서 내 리스트 아이디 +- `para`: 캐럿이 위치할 문단 아이디 +- `pos`: 캐럿이 위치할 문단 내 글자 단위 위치 + +**반환값** + +성공 시 true, 실패 시 false + +**예제** + +1. 문서 작성 +2. 캐럿 이동 +3. GetPos API 로 현재 Pos 정보 저장 +4. 다른 위치로 캐럿 이동 +5. 3단계에서 저장한 위치로 캐럿 이동 결과 : 캐럿 위치를 저장하고, 다시 이동한다. + +```js +posObj = HwpCtrl.GetPos(); +//GetPos API 로 현재 Pos 정보 저장 //... 다른 위치로 캐럿 이동 +HwpCtrl.SetPos(posObj.list, posObj.para, posObj.pos); +//3단계에서 저장한 위치로 캐럿 이동 +``` + +#### 1.2.49 `SetPosBySet` + +**구문** + +```js +HwpCtrl.SetPosBySet(pos) +``` + +**설명** + +캐럿을 문서 내 특정 위치로 위치시킵니다. SetPos 의 ParameterSet 버전) + +**파라미터** + +- `pos`: 캐럿의 위치에 대한 ParameterSet + +**반환값** + +성공하면 true 를 반환하고, 실패하면 false 를 반환합니다. + +**예제** + +1. 임의의 텍스트 작성 +2. 예제 스크립트 실행 +3. 현재 커서의 위치 메시지창 출력 +4. 1초 후 왼쪽으로 2칸 이동된 커서의 위치 메시지창 출력 결과: 커서 위치를 이동 + +```js +var posSet = null; +function SetPosTest() { + posSet = HwpCtrl.GetPosBySet(); + if ( posSet != null) { + alert(posSet.Item("List") +""+ posSet.Item("Para") +""+ posSet.Item("Pos")); + if (!HwpCtrl.SetPosBySet(posSet)) { + alert ("GetPos err"); + } +} +} +; +function CursorMove() { + HwpCtrl.Run('MoveLeft'); + HwpCtrl.Run('MoveLeft'); +``` + +setTimeout(() =& { SetPosTest(); },1000) + +```js +} +``` + +SetPosTest(); CursorMove(); + +#### 1.2.50 `SetTextFile` + +**구문** + +```js +HwpCtrl.SetTextFile(data, format, option, callback, callbackUserData) +``` + +**설명** + +문서를 문자열로 지정한다. + +**파라미터** + +- `data`: 문자열로 변경된 text 파일 +- `format`: 파일의 형식 + +| format | 설명 | 비고 | +| --- | --- | --- | +| HWP | Hwp native format | BASE64 로 인코딩되어 있다. 저장된 내용 을 다른 곳에서 보여줄 필요가 없다면 이 포맷을 사용하기를 권장합니다 | +| HWPML2X | HWP 형식과 호환 | 문서의 모든 정보를 유지 | +| HTML | 인터넷 문서 HTML 형식 | 한글 고유의 서식은 손실된다. | +| TEXT | 유니코드 텍스트 | 서식정보가 없는 텍스트만 저장 | +| JSON | json format | 문서의 정보를 Json 형태로 만든다. 문서의 모든 정보를 유지 | + +- option + +| option | 값 | 설명 | +| --- | --- | --- | +| insertfile | 현재 커서 이후에 지정된 파일 삽입 | | + +- `callback`: SetTextFile API 이후 수행될 함수 + +- result: 성공 실패 여부, callbackUserData 를 포함한 Object 를 인자로 받는다 +- `callback`: SetTextFile API 이후 수행될 함수 +- `callbackUserData`: callback 함수에 Argument 로 넘겨 받을 result 에 포함될 UserData, 생략 가능 + +**반환값** + +성공하면 true, 실패하면 false + +**비고** + +return 받은 boolean 값은 Argument 가 제대로 들어왔고, 함수가 제대로 동작을 하였는지를 판별할 수 있고, 서버를 통해서 문서가 제대로 SetTextFile 됬는지 여부는 콜백함수의 인자로 들어오는 result 에 서 확인할 수 있다. + +**예제** + +1. 문서 작성 +2. GetTextFile API 현재 문서 데이터 저장 +3. Clear API 로 현재 문서 초기화 +4. SetTextFile API 로 저장한 문서 다시 로드 결과 : 현재 문서의 데이터를 문자열 형태로 저장하고, 다시 불러온다. callback 방식 + +```js +// GetTextFile API 현재 문서 데이터 저장 +HwpCtrl.GetTextFile("HWP", "", function(result) { + data = result; +} +); +HwpCtrl.Clear(1); +// Clear API 로 현재 문서 초기화 // SetTextFile API 로 저장한 문서 다시 로드 +HwpCtrl.SetTextFile(data, "HWP", "", function(result) { + // 이후 수행 할 동작 +} +, null); +``` + +async await 방식 + +```js +// GetTextFile API 현재 문서 데이터 저장 data = await +HwpCtrl.GetTextFile("HWP", ""); +HwpCtrl.Clear(1); +// Clear API 로 현재 문서 초기화 // SetTextFile API 로 저장한 문서 다시 로드 await +HwpCtrl.SetTextFile(data, "HWP", ""); +``` + +#### 1.2.51 `ShowCaret` + +**구문** + +```js +HwpCtrl.ShowCaret(show) +``` + +**설명** + +캐럿을 숨김/보이기 처리한다. + +**파라미터** + +- `show`: 캐럿 표시 여부 + +**예제** + +1. 예제 스크립트 실행 결과 : 캐럿이 숨겨진다. + +```js +HwpCtrl.ShowCaret(false); +``` + +#### 1.2.52 `ShowHorizontalScroll` + +**구문** + +```js +HwpCtrl.ShowHorizontalScroll(show) +``` + +**설명** + +가로 스크롤을 화면에 숨김/보이기 처리한다. + +**파라미터** + +- `show`: 가로 스크롤 표시 여부 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 예제 스크립트 실행 결과 : 가로 스크롤이 감춰진다. + +```js +HwpCtrl.ShowHorizontalScroll(false); +``` + +#### 1.2.53 `ShowRibbon` + +**구문** + +```js +HwpCtrl.ShowRibbon(show) +``` + +**설명** + +리본 메뉴를 화면에 숨김/보이기 처리한다. + +**파라미터** + +- `show`: 캐럿 표시 여부 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 예제 스크립트 실행 결과 : Ribbon 메뉴가 감춰진다. + +```js +HwpCtrl.ShowRibbon(false); +``` + +#### 1.2.54 `ShowStatusBar` + +**구문** + +```js +HwpCtrl.ShowStatusBar(show) +``` + +**설명** + +상태바를 화면에 숨김/보이기 처리한다. + +**파라미터** + +- `show`: 상태바 표시 여부 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 예제 스크립트 실행 결과 : 상태바가 감춰진다. + +```js +HwpCtrl.ShowStatusBar(false); +``` + +#### 1.2.55 `ShowToolBar` + +**구문** + +```js +HwpCtrl.ShowStatusBar(show) +``` + +**설명** + +툴바 메뉴를 화면에 숨김/보이기 처리한다. + +**파라미터** + +- `show`: 상태바 표시 여부 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 예제 스크립트 실행 결과 : 툴바 메뉴가가 감춰진다. + +```js +HwpCtrl.ShowToolBar(false); +``` + +#### 1.2.56 `ShowVerticalScroll` + +**구문** + +```js +HwpCtrl.ShowVerticalScroll(show) +``` + +**설명** + +세로 스크롤을 화면에 숨김/보이기 처리한다. + +**파라미터** + +- `show`: 세로 스크롤 표시 여부 + +**반환값** + +성공하면 true, 실패하면 false + +**예제** + +1. 예제 스크립트 실행 결과 : 세로 스크롤이 감춰진다. + +```js +HwpCtrl.ShowVerticalScroll(false); +``` + +## 2. HwpAction + +### 2.1 Properties + +#### 2.1.1 `ActID` + +**구문** + +```js +act.ActID +``` + +**설명** + +액션 ID를 나타낸다. 읽기 전용.액션 ID의 종류 및 설명은 별도 문서 참조. + +**반환값** + +ActionID 를 String 타입으로 return 한다. + +**예제** + +1. 예제 스크립트 실행 결과 : CharShapeBold ActionID 메시지 창 + +```js +var act = HwpCtrl.CreateAction("CharShapeBold"); +alert("Action ID :"+ act.ActID); +``` + +#### 2.1.2 `SetID` + +**구문** + +```js +act.SetID +``` + +**설명** + +액션이 사용하는 parameter set ID를 나타낸다. 읽기 전용.액션 ID의 종류 및 설명은 별도 문서 참조. + +**반환값** + +액션이 사용하는 SetID 를 String 타입으로 return 한다. + +**예제** + +1. 예제 스크립트 실행 결과 : CharShapeBold 액션의 SetID 메시지 창 + +```js +var act = HwpCtrl.CreateAction("CharShapeBold"); +alert("Set ID :"+ act.SetID); +``` + +### 2.2 Methods + +#### 2.2.1 `CreateSet` + +**구문** + +```js +act.CreateSet() +``` + +**설명** + +액션과 대응하는 ParameterSet 객체를 생성한다. + +**반환값** + +성공 시 ParameterSet 객체를 return 한다.ParameterSet 을 사용하지 않는 Action 은 null 객체를 리 턴한다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5x5 크기의 표를 삽입한다. + +```js +var tbact = HwpCtrl.CreateAction("TableCreate"); +var tbset = tbact.CreateSet(); +tbact.GetDefault(tbset); +tbset.SetItem("Rows", 5); +tbset.SetItem("Cols", 5); +tbact.Execute(tbset); +``` + +#### 2.2.2 `GetDefault` + +**구문** + +```js +act.GetDefault(param) +``` + +**설명** + +현재 상태에 따라 액션 실행에 필요한 인수를 구한다.액션 ID의 종류 및 설명은 별도 문서 참조. + +**파라미터** + +- `param`: 인수를 저장할 ParameterSet 객체 + +**반환값** + +성공 시 true, 실패 시 false + +**비고** + +예를 들어 글자모양의 액션의 경우, 현재 셀렉션 상태에 따라 param 의 아이템들이 채워진다.서브셋을 만들 경우에는 서브셋을 만든 후에 GetDefault 를 사용한다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5x5 크기의 표를 삽입한다. + +```js +var tbact = HwpCtrl.CreateAction("TableCreate"); +var tbset = tbact.CreateSet(); +tbact.GetDefault(tbset); +tbset.SetItem("Rows", 5); +tbset.SetItem("Cols", 5); +tbact.Execute(tbset); +``` + +#### 2.2.3 `PopupDialog` + +**구문** + +```js +act.PopupDialog(param, callback, callbackUserData) +``` + +**설명** + +액션의 대화상자를 띄운다. + +**파라미터** + +- `param`: 액션의 실행을 제어할 인수. parameterSet 의 종류와 아이템의 의미는 액션이 정의한 바에 따라 다르다 +- `callback`: PopupDialog 동작을 마친 후 수행될 함수 + +- action: 콜백을 호출한 Action 객체 + +- param: 액션으로 전달된 ParameterSet 객체 + +- result: 대화상자 버튼 클릭 결과 true: 설정버튼, false: 취소버튼) + +- callbackUserData: 사용자가 콜백에 전달한 데이터 +- `callbackUserData`: 사용자가 콜백에 전달한 데이터 + +**반환값** + +성공 시 true, 실패 시 false + +**예제** + +1. 예제 스크립트 실행 결과 : 글자 속성 대화상자를 띄운다. + +```js +var dact = HwpCtrl.CreateAction("CharShape"); +// 액션 생성 +var dset = dact.CreateSet(); +dact.GetDefault(dset); +dact.PopupDialog(dset, function(action, paramSet, result, callbackUserData) { + if(result == true) { +``` + +action.Execute(paramSet); } }); + +#### 2.2.4 `Execute` + +**구문** + +```js +act.Execute(param, callback, callbackUserData) +``` + +**설명** + +지정한 인수로 액션을 실행한다. + +**파라미터** + +- `param`: 액션의 실행을 제어할 인수. parameterSet 의 종류와 아이템의 의미는 액션이 정의한 바에 따라 다르다 +- `callback`: Execute 동작 수행 후 실행될 함수 + +- action: 콜백을 호출한 Action 객체 + +- param: 액션으로 전달된 ParameterSet 객체 + +- result: 액션 실행 결과 true: 액션 성공, false: 액션 실패) + +- callbackUserData: 사용자가 콜백에 전달한 데이터 +- `callbackUserData`: 사용자가 콜백에 전달한 데이터 + +**반환값** + +성공 시 true, 실패 시 false + +**예제** + +1. 예제 스크립트 실행 결과 : 5x5 크기의 표를 삽입한다. + +```js +var tbact = HwpCtrl.CreateAction("TableCreate"); +var tbset = tbact.CreateSet(); +tbact.GetDefault(tbset); +tbset.SetItem("Rows", 5); +tbset.SetItem("Cols", 5); +tbact.Execute(tbset); +``` + +#### 2.2.5 `Run` + +**구문** + +```js +act.Run() +``` + +**설명** + +액션을 실행한다. + +**파라미터** + +- `param`: 액션의 실행을 제어할 인수. parameterSet 의 종류와 아이템의 의미는 액션이 정의한 바에 따라 다르다 +- `callback`: Run 동작을 마친 후 수행될 함수 + +- action: 콜백을 호출한 Action 객체 + +- param: 액션으로 전달된 ParameterSet 객체 + +- result: 대화상자 버튼 클릭 결과 true: 설정버튼, false: 취소버튼) + +- callbackUserData: 사용자가 콜백에 전달한 데이터 +- `callbackUserData`: 사용자가 콜백에 전달한 데이터 + +**반환값** + +성공 시 true, 실패 시 false + +**예제** + +1. 텍스트 입력 +2. 예제 스크립트 실행 결과 : Bold Action 실행대화상자가 없는 액션은 동기 방식으로 실행한다.) + +```js +var act = HwpCtrl.CreateAction("CharShapeBold"); +// 액션 생성 +act.Run(); +//액션 실행; +``` + +## 3. HwpParameterSet + +### 3.1 Properties + +#### 3.1.1 `Count` + +**구문** + +```js +pset.Count +``` + +**설명** + +현재 존재하는 아이템의 개수를 나타낸다. 읽기 전용. + +**반환값** + +아이템 개수를 Number 타입으로 리턴한다. + +**예제** + +1. 예제 스크립트 실행 결과 : 서브 셋 아이템 수 안내창 + +```js +var act = HwpCtrl.CreateAction("PageSetup"); +var pageSet = act.CreateSet(); +act.GetDefault(pageSet); +pageSet.SetItem("ApplyTo", 3); +var pset = pageSet.CreateItemSet("PageDef", "PageDef"); +pset.SetItem("TopMargin", 3401); +pset.SetItem("BottomMargin", 5669); +pset.SetItem("LeftMargin", 4251); +pset.SetItem("RightMargin", 4251); +pset.SetItem("HeaderLen", 0); +pset.SetItem("FooterLen", 0); +pset.SetItem("GutterLen", 0); +alert("Page 속성 서브 Set 의 아이템 수 :"+ pset.Count) +``` + +#### 3.1.2 `IsSet` + +**구문** + +```js +pset.IsSet +``` + +**설명** + +ParameterSet 타입인지 여부를 나타낸다. 읽기 전용. + +**반환값** + +ParameterSet 인 경우 true, ParameterArray 인 경우 false 를 리턴한다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5 * 5 표를 삽입하고, Width, Height 를 조작한다. + +```js +var act = HwpCtrl.CreateAction("TableCreate"); +var pset = act.CreateSet(); +var idx = 0; +if(pset.IsSet) { + act.GetDefault(pset); + pset.SetItem("Rows", 5); + pset.SetItem("Cols", 5); + var colset = pset.CreateItemArray("ColWidth", 5); + var rowset = pset.CreateItemArray("RowHeight", 5); + if(colset.IsSet) { + return; + // colset 은 ParameterArray 타입이어야 한다. + } +for (idx = 0; idx < colset.Count; idx++) { + colset.SetItem(idx, 7200); +} +for (idx = 0; idx < rowset.Count; idx++) { + rowset.SetItem(idx, colset.Item(0)/2); + // Height 는 Width 의 절반으로 지정한다. +} +act.Execute(pset) +} +``` + +#### 3.1.3 `SetID` + +**구문** + +```js +pset.SetID +``` + +**설명** + +ParameterSet 의 ID를 나타낸다. 읽기 전용. + +**파라미터** + +- `itemid`: 아이템 ID + +**반환값** + +Set ID를 String 타입으로 리턴한다. + +**예제** + +결과 : SetID 안내창 TableCreate Action SetID : TableCreation) + +```js +var tbact = HwpCtrl.CreateAction("TableCreate"); +var tbset = tbact.CreateSet(); +alert("TableCreate Action SetID :"+ tbset.SetID); +``` + +### 3.2 Methods + +#### 3.2.1 `Clone` + +**구문** + +```js +pset.Clone() +``` + +**설명** + +ParameterSet 을 복사한다. + +**반환값** + +동일한 데이터를 가진 ParameterSet 을 복사하여 ParameterSet 객체 타입으로 리턴한다. + +**비고** + +동일한 ID를 가진 기존의 아이템은 삭제된다. + +**예제** + +1. 예제 스크립트 실행 결과 : 복사한 아이템이 동일한 지 여부 안내창 + +```js +var charShapeSet = HwpCtrl.CharShape; +var cloneSet = charShapeSet.Clone(); +if(cloneSet.IsEquivalent(charShapeSet)) { + alert("동일"); +} +``` + +#### 3.2.2 `CreateItemArray` + +**구문** + +```js +pset.CreateItemArray(itemid, count) +``` + +**설명** + +아이템으로 ParameterArray 타입의 배열을 생성한다. + +**파라미터** + +- `itemid`: 아이템 +- `IDcount`: 생성할 배열의 초기 크기 + +**반환값** + +인자에 따라 ParameterArray 를 생성하고, ParameterArray 객체 타입으로 리턴한다. + +**비고** + +동일한 ID를 가진 기존의 아이템은 삭제된다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5 * 5 표를 삽입하고, Width, Height 를 조작한다. + +```js +var act = HwpCtrl.CreateAction("TableCreate"); +var pset = act.CreateSet(); +var idx = 0; +if(pset.IsSet) { + act.GetDefault(pset); + pset.SetItem("Rows", 5); + pset.SetItem("Cols", 5); + var colset = pset.CreateItemArray("ColWidth", 5); + var rowset = pset.CreateItemArray("RowHeight", 5); + if(colset.IsSet) { + return; + // colset 은 ParameterArray 타입이어야 한다. + } +for (idx = 0; idx < colset.Count; idx++) { + colset.SetItem(idx, 7200); +} +for (idx = 0; idx < rowset.Count; idx++) { + rowset.SetItem(idx, colset.Item(0)/2); + // Height 는 Width 의 절반으로 지정한다. +} +act.Execute(pset) +} +``` + +#### 3.2.3 `CreateItemSet` + +**구문** + +```js +pset.CreateItemSet(itemid, setid) +``` + +**설명** + +아이템으로 ParameterSet 을 생성한다. + +**파라미터** + +- `itemid`: 아이템 +- `IDsetid`: 생성할 ParameterSet 의 ID + +**반환값** + +생성된 서브 셋을 ParameterSet 객체 타입으로 리턴한다. + +**비고** + +parameter set 내부에 아이템으로 또 다른 parameter set 을 가지는 서브 셋의 개념이다. + +**예제** + +1. 예제 스크립트 실행 결과 : 문서 전체 용지의 속성이 변경된다. + +```js +var act = HwpCtrl.CreateAction("PageSetup"); +var pageSet = act.CreateSet(); +act.GetDefault(pageSet); +pageSet.SetItem("ApplyTo", 3); +var pset = pageSet.CreateItemSet("PageDef", "PageDef"); +pset.SetItem("TopMargin", 3401); +pset.SetItem("BottomMargin", 5669); +pset.SetItem("LeftMargin", 4251); +pset.SetItem("RightMargin", 4251); +pset.SetItem("HeaderLen", 0); +pset.SetItem("FooterLen", 0); +pset.SetItem("GutterLen", 0); +act.Execute(pageSet); +``` + +#### 3.2.4 `GetIntersection` + +**구문** + +```js +pset.GetIntersection(srcset) +``` + +**설명** + +두 ParameterSet 에 공통적으로 존재하고, 값도 동일한 아이템만으로 구성된 교집합으로 this 를 구성한다. + +**파라미터** + +- `srcset`: this 와 srcset 의 교집합이 this 에 저장된다 + +**예제** + +1. 텍스트 입력 후 글자 블록 +2. 예제 스크립트 실행 결과 : 블록된 텍스트의 글자 크기 속성을 제거하고 글자 크기를 10으로 다시 지정한다. + +```js +var charShapeSet = HwpCtrl.CharShape; +var cloneSet = charShapeSet.Clone(); +cloneSet.RemoveItem("Height"); +// cloneSet 에서 글자 크기 속성 제거 charShapeSet.GetIntersection(cloneSet); +// 두 셋의 교집합만 남긴다. +if(charShapeSet.Item("Height") === null) charShapeSet.SetItem("Height", 1000) HwpCtrl.CharShape = charShapeSet; +``` + +#### 3.2.5 `IsEquivalent` + +**구문** + +```js +pset.IsEquivalent(srcset) +``` + +**설명** + +두 ParameterSet 의 내용이 동일한 값을 가지고 있는지 검사한다. + +**파라미터** + +- `srcset`: this 와 srcset 을 비교한 결과를 리턴한다 + +**반환값** + +동일하면 true, 다르면 false + +**예제** + +1. 예제 스크립트 실행 결과 : 복사한 아이템이 동일한 지 여부 안내창 + +```js +var charShapeSet = HwpCtrl.CharShape; +var cloneSet = charShapeSet.Clone(); +if(cloneSet.IsEquivalent(charShapeSet)) { + alert("동일"); +} +``` + +#### 3.2.6 `Item` + +**구문** + +```js +pset.Item(itemid) +``` + +**설명** + +지정한 아이템의 값을 리턴한다. + +**파라미터** + +- `itemid`: 아이템 ID + +**반환값** + +아이템의 값, 만약 지정한 아이템이 존재하지 않으면 아이템의 포맷에 따라 0 또는 빈 문자열을 리턴한다. + +**예제** + +1. 글자 입력 +2. 입력한 글자 Selection +3. 예제 스크립트 실행 결과 : 만약 Selection 된 글자들의 글자 크기가 동일하고 20pt 미만이면 글자 크기를 20pt 로 설정한다. + +```js +var cs = HwpCtrl.CharShape; +if (cs.ItemExist("Height") && cs.Item("Height") < 2000) { + cs.SetItem("Height", 2000); + HwpCtrl.CharShape = cs; +} +``` + +#### 3.2.7 `ItemExist` + +**구문** + +```js +pset.ItemExist(itemid) +``` + +**설명** + +지정한 아이템이 존재하는지 검사한다. + +**파라미터** + +- `itemid`: 아이템 ID + +**반환값** + +존재하면 true, 존재하지 않으면 false + +**예제** + +1. 글자 입력 +2. 입력한 글자 Selection +3. 예제 스크립트 실행 결과 : 만약 Selection 된 글자들의 글자 크기가 동일하고 20pt 미만이면 글자 크기를 20pt 로 설정한다. + +```js +var cs = HwpCtrl.CharShape; +if (cs.ItemExist("Height") && cs.Item("Height") < 2000) { + cs.SetItem("Height", 2000); + HwpCtrl.CharShape = cs; +} +``` + +#### 3.2.8 `Merge` + +**구문** + +```js +pset.Merge(srcset) +``` + +**설명** + +두 ParameterSet 에 내용을 병합한다, 결과는 this 와 srcset 의 합집합이 this 에 저장된다. + +**파라미터** + +- `srcset`: this 와 srcset 이 병합되어 this 에 저장된다 + +**예제** + +1. 텍스트 입력 후 글자 블록 +2. 예제 스크립트 실행 결과 : ParameterSet 의 아이템을 제거하고, 병합한다. + +```js +var act = HwpCtrl.CreateAction("PageSetup"); +var pageSet = act.CreateSet(); +act.GetDefault(pageSet); +pageSet.SetItem("ApplyTo", 3); +var pset = pageSet.CreateItemSet("PageDef", "PageDef"); +pset.SetItem("TopMargin", 3401); +pset.SetItem("BottomMargin", 5669); +pset.SetItem("LeftMargin", 4251); +pset.SetItem("RightMargin", 4251); +pset.SetItem("HeaderLen", 0); +pset.SetItem("FooterLen", 0); +pset.SetItem("GutterLen", 0); +var origCount = pset.Count; +// 7 +var cloneSet = pset.Clone(); +var cloneCount = cloneSet.Count; +// 7 +pset.RemoveAll(); +//pset 의 모든 아이템을 삭제한다. +var removedCount = pset.Count; +// 0 +pset.Merge(cloneSet); +//pset 과 cloneSet 을 합친다. +var mergedCount = pset.Count; +//7 +act.Execute(pageSet); +alert("origCount : " + origCount + "\ncloneCount : " + cloneCount + "\nremovedCount : " + removedCount + "\nmergedCount : " + mergedCount); +``` + +#### 3.2.9 `RemoveAll` + +**구문** + +```js +pset.RemoveAll(setID) +``` + +**설명** + +ParameterSet 을 초기화한다. + +**파라미터** + +- `setid`: 새로 적용할 Set ID + +**비고** + +이미 존재하는 ParameterSet 객체를 이용해 새로운 타입의 ParameterSet 으로 초기화하여 재사용하는 목적에 사용된다. + +**예제** + +1. 텍스트 입력 후 글자 블록 +2. 예제 스크립트 실행 결과 : ParameterSet 의 아이템을 제거하고, 병합한다. + +```js +var act = HwpCtrl.CreateAction("PageSetup"); +var pageSet = act.CreateSet(); +act.GetDefault(pageSet); +pageSet.SetItem("ApplyTo", 3); +var pset = pageSet.CreateItemSet("PageDef", "PageDef"); +pset.SetItem("TopMargin", 3401); +pset.SetItem("BottomMargin", 5669); +pset.SetItem("LeftMargin", 4251); +pset.SetItem("RightMargin", 4251); +pset.SetItem("HeaderLen", 0); +pset.SetItem("FooterLen", 0); +pset.SetItem("GutterLen", 0); +var origCount = pset.Count; +// 7 +var cloneSet = pset.Clone(); +var cloneCount = cloneSet.Count; +// 7 +pset.RemoveAll(); +//pset 의 모든 아이템을 삭제한다. +var removedCount = pset.Count; +// 0 +pset.Merge(cloneSet); +//pset 과 cloneSet 을 합친다. +var mergedCount = pset.Count; +//7 +act.Execute(pageSet); +alert("origCount : " + origCount + "\ncloneCount : " + cloneCount + "\nremovedCount : " + removedCount + "\nmergedCount : " + mergedCount); +``` + +#### 3.2.10 `RemoveItem` + +**구문** + +```js +pset.RemoveItem(itemid) +``` + +**설명** + +지정한 아이템을 삭제한다. + +**파라미터** + +- `itemid`: 아이템 ID + +**예제** + +1. 텍스트 입력 후 글자 블록 +2. 예제 스크립트 실행 결과 : 블록된 텍스트의 글자 크기 속성을 제거하고 글자 크기를 10으로 다시 지정한다. + +```js +var charShapeSet = HwpCtrl.CharShape; +var cloneSet = charShapeSet.Clone(); +cloneSet.RemoveItem("Height"); +// cloneSet 에서 글자 크기 속성 제거 charShapeSet.GetIntersection(cloneSet); +// 두 셋의 교집합만 남긴다. +if(charShapeSet.Item("Height") === null) charShapeSet.SetItem("Height", 1000) HwpCtrl.CharShape = charShapeSet; +``` + +#### 3.2.11 `SetItem` + +**구문** + +```js +pset.SetItem(itemid, value) +``` + +**설명** + +지정한 아이템의 값을 설정한다. + +**파라미터** + +- `itemid`: 아이템 ID +- `value`: 설정할 값 + +**비고** + +이미 동일한 ID의 아이템이 존재하면 지정한 값으로 바뀌고, 존재하지 않으면 아이템이 생성된다. + +**예제** + +1. 예제 스크립트 실행 결과 : 문서 전체 용지의 속성이 변경된다. + +```js +var act = HwpCtrl.CreateAction("PageSetup"); +var pageSet = act.CreateSet(); +act.GetDefault(pageSet); +pageSet.SetItem("ApplyTo", 3); +var pset = pageSet.CreateItemSet("PageDef", "PageDef"); +pset.SetItem("TopMargin", 3401); +pset.SetItem("BottomMargin", 5669); +pset.SetItem("LeftMargin", 4251); +pset.SetItem("RightMargin", 4251); +pset.SetItem("HeaderLen", 0); +pset.SetItem("FooterLen", 0); +pset.SetItem("GutterLen", 0); +act.Execute(pageSet); +``` + +## 4. HwpParameterArray + +### 4.1 Properties + +#### 4.1.1 `Count` + +**구문** + +```js +itemArray.Count +``` + +**설명** + +배열의 크기를 나타낸다. + +**반환값** + +배열의 크기를 Number 타입으로 리턴한다. + +**비고** + +배열의 크기는 Runtime 에 동적으로 조절할 수 있다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5 * 5 표를 삽입하고, Width, Height 를 조작한다. + +```js +var act = HwpCtrl.CreateAction("TableCreate"); +var pset = act.CreateSet(); +var idx = 0; +if(pset.IsSet) { + act.GetDefault(pset); + pset.SetItem("Rows", 5); + pset.SetItem("Cols", 5); + var colset = pset.CreateItemArray("ColWidth", 5); + var rowset = pset.CreateItemArray("RowHeight", 5); + if(colset.IsSet) { + return; + // colset 은 ParameterArray 타입이어야 한다. + } +for (idx = 0; idx < colset.Count; idx++) { + colset.SetItem(idx, 7200); +} +for (idx = 0; idx < rowset.Count; idx++) { + rowset.SetItem(idx, colset.Item(0)/2); + // Height 는 Width 의 절반으로 지정한다. +} +act.Execute(pset) +} +``` + +#### 4.1.2 `IsSet` + +**구문** + +```js +itemArray.IsSet +``` + +**설명** + +ParameterSet 타입인지 여부를 나타낸다. 읽기 전용. + +**반환값** + +ParameterSet 인 경우 true, ParameterArray 인 경우 false 를 리턴한다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5 * 5 표를 삽입하고, Width, Height 를 조작한다. + +```js +var act = HwpCtrl.CreateAction("TableCreate"); +var pset = act.CreateSet(); +var idx = 0; +if(pset.IsSet) { + act.GetDefault(pset); + pset.SetItem("Rows", 5); + pset.SetItem("Cols", 5); + var colset = pset.CreateItemArray("ColWidth", 5); + var rowset = pset.CreateItemArray("RowHeight", 5); + if(colset.IsSet) { + return; + // colset 은 ParameterArray 타입이어야 한다. + } +for (idx = 0; idx < colset.Count; idx++) { + colset.SetItem(idx, 7200); +} +for (idx = 0; idx < rowset.Count; idx++) { + rowset.SetItem(idx, colset.Item(0)/2); + // Height 는 Width 의 절반으로 지정한다. +} +act.Execute(pset) +} +``` + +### 4.2 Methods + +#### 4.2.1 `Clone` + +**구문** + +```js +itemArray.Clone() +``` + +**설명** + +동일한 크기와 데이터를 갖는 ParameterArray 개체를 복사하여 리턴한다. + +**반환값** + +성공 시 복사된 ParameterArray 객체를 리턴한다.실패 시 null 을 리턴한다. + +**예제** + +결과 : Clone, Copy 결과 안내창 + +```js +var tset = HwpCtrl.CreateSet("TableCreation"); +var colset = tset.CreateItemArray("ColWidth", 1); +colset.SetItem(0, 7200); +var cloneColset = colset.Clone(); +var cloneColWidth = cloneColset.Item(0); +cloneColset.SetItem(0, 0); +var cloneColWidth2 = cloneColset.Item(0); +cloneColset.Copy(colset) var cloneColWidth3 = cloneColset.Item(0); +alert("Clone :"+ cloneColWidth +"\n 초기화 :"+ cloneColWidth2 +"\nCopy :"+ cloneColWidth3); +``` + +#### 4.2.2 `Copy` + +**구문** + +```js +itemArray.Copy(srcarray) +``` + +**설명** + +인자로 들어온 ParameterArray 의 내용을 복사한다. + +**파라미터** + +- `srcarray`: srcarray 의 내용이 그대로 this 로 복사된다 + +**예제** + +결과 : Clone, Copy 결과 안내창 + +```js +var tset = HwpCtrl.CreateSet("TableCreation"); +var colset = tset.CreateItemArray("ColWidth", 1); +colset.SetItem(0, 7200); +var cloneColset = colset.Clone(); +var cloneColWidth = cloneColset.Item(0); +cloneColset.SetItem(0, 0); +var cloneColWidth2 = cloneColset.Item(0); +cloneColset.Copy(colset) var cloneColWidth3 = cloneColset.Item(0); +alert("Clone :"+ cloneColWidth +"\n 초기화 :"+ cloneColWidth2 +"\nCopy :"+ cloneColWidth3); +``` + +#### 4.2.3 `Item` + +**구문** + +```js +itemArray.Item(index) +``` + +**설명** + +지정한 아이템의 값을 리턴한다. + +**파라미터** + +- `index`: 아이템 인덱스. 0부터 시작한다 + +**반환값** + +index 에 해당하는 아이템의 값을 리턴한다. + +**예제** + +1. 예제 스크립트 실행 결과 : 5 * 5 표를 삽입하고, Width, Height 를 조작한다. + +```js +var act = HwpCtrl.CreateAction("TableCreate"); +var pset = act.CreateSet(); +var idx = 0; +if(pset.IsSet) { + act.GetDefault(pset); + pset.SetItem("Rows", 5); + pset.SetItem("Cols", 5); + var colset = pset.CreateItemArray("ColWidth", 5); + var rowset = pset.CreateItemArray("RowHeight", 5); + if(colset.IsSet) { + return; + // colset 은 ParameterArray 타입이어야 한다. + } +for (idx = 0; idx < colset.Count; idx++) { + colset.SetItem(idx, 7200); +} +for (idx = 0; idx < rowset.Count; idx++) { + rowset.SetItem(idx, colset.Item(0)/2); + // Height 는 Width 의 절반으로 지정한다. +} +act.Execute(pset) +} +``` + +#### 4.2.4 `SetItem` + +**구문** + +```js +itemArray.SetItem(index, value) +``` + +**설명** + +지정한 원소의 값을 설정한다. + +**파라미터** + +- `index`: 아이템의 인덱스. 0부터 시작.value : 아이템의 값 + +**예제** + +1. 예제 스크립트 실행 결과 : 5 * 5 표를 삽입하고, Width, Height 를 조작한다. + +```js +var act = HwpCtrl.CreateAction("TableCreate"); +var pset = act.CreateSet(); +var idx = 0; +if(pset.IsSet) { + act.GetDefault(pset); + pset.SetItem("Rows", 5); + pset.SetItem("Cols", 5); + var colset = pset.CreateItemArray("ColWidth", 5); + var rowset = pset.CreateItemArray("RowHeight", 5); + if(colset.IsSet) { + return; + // colset 은 ParameterArray 타입이어야 한다. + } +for (idx = 0; idx < colset.Count; idx++) { + colset.SetItem(idx, 7200); +} +for (idx = 0; idx < rowset.Count; idx++) { + rowset.SetItem(idx, colset.Item(0)/2); + // Height 는 Width 의 절반으로 지정한다. +} +act.Execute(pset) +} +``` + +## 5. HwpCtrlCode + +### 5.1 Properties + +#### 5.1.1 `CtrlCh` + +**구문** + +```js +ctrlCode.CtrlCh +``` + +**설명** + +컨트롤 문자. 읽기 전용. + +**반환값** + +현재 컨트롤의 컨트롤 문자를 Number 타입으로 리턴한다. + +**비고** + +일반적으로 컨트롤 ID를 사용해 컨트롤의 종류를 판별하지만, 이보다 더 포괄적인 범주를 나타내는 컨 트롤 문자로 판별할 수도 있다. 예를 들어 각주와 미주는 ID는 다르지만, 컨트롤 문자는 17로 동일하다. 컨트롤 문자는 131 사이의 값을 사용한다. 그 중 CtrlCode 객체로 리턴 받을 수 있는 문자는 다음과 같다. + +| Ch | 설명 | +| --- | --- | +| 2 | 구역/단 정의 | +| 3 | 필드 시작 | +| 11 | 그리기 개체 / 표 | +| 15 | 주석 | +| 16 | 머리말 / 꼬리말 | +| 17 | 각주 / 미주 | +| 18 | 자동 번호 | +| 21 | 새번호/ 번호 감추기/ 번호 위치 | +| 22 | 책갈피 / 찾아보기 표시 | +| 23 | 덧말 / 글자 겹침,,, | + +**예제** + +1. 표, 그리기 개체, 누름틀 삽입 +2. 예제 스크립트 실행 결과 : 표, 그리기 개체만 삭제된다. + +```js +var ctrl = HwpCtrl.HeadCtrl; +while(ctrl) { + if (ctrl.CtrlCh == 11) { + // 그리기 개체 / 표 + HwpCtrl.DeleteCtrl(ctrl); + } +ctrl = ctrl.Next; +} +``` + +#### 5.1.2 `CtrlID` + +**구문** + +```js +ctrlCode.CtrlID +``` + +**설명** + +컨트롤 ID. 읽기 전용. + +**반환값** + +현재 컨트롤의 ID를 String 타입으로 리턴한다. + +**비고** + +컨트롤 ID는 컨트롤의 종류를 나타내기 위해 할당된 ID로서, 최대 4개의 문자로 구성된 문자열이다. 예 를 들어 표는 tbl, 각주는 fn% 이다.한글에서 현재까지 지원되는 모든 컨트롤의 ID는 다음 표 참조. + +| ID | ParameterSet ID | Initialization Set | 설명 | +| --- | --- | --- | --- | +| cold | ColDef | ColDef | 단 | +| secd | SecDef | SecDef | 구역 | +| fn | FootnoteShape | FootnoteShape | 각주 | +| en | FootnoteShape | FootnoteShape | 미주 | +| tbl | Table | TableCreation | 표 | +| eqed | EqEdit | EqEdit | 수식 | +| gso | ShapeObject | ShapeObject | 그리기 개체 | +| atno | AutoNum | AutoNum | 번호넣기 | +| nwno | AutoNum | AutoNum | 새번호로 | +| pgct | PageNumCtrl | PageNumCtrl | 페이지 번호 제어 | +| pghd | PageHiding | PageHiding | 감추기 | +| pgnp | PageNumPos | PageNumPos | 쪽번호 위치 | +| head | HeaderFooter | HeaderFooter | 머리말 | +| foot | HeaderFooter | HeaderFooter | 꼬리말 | +| %dte | FieldCtrl | FieldCtrl | 현재의 날짜/시간 필드 | +| %ddt | FieldCtrl | FieldCtrl | 파일 작성 날짜/시간 필드 | +| %pat | FieldCtrl | FieldCtrl | 문서 경로 필드 | +| %bmk | FieldCtrl | FieldCtrl | 블럭 책갈피 | +| %mmg | FieldCtrl | FieldCtrl | 메일 머지 | +| %xrf | FieldCtrl | FieldCtrl | 상호 참조 | +| %fmu | FieldCtrl | FieldCtrl | 계산식 | +| %clk | FieldCtrl | FieldCtrl | 누름틀 | +| %smr | FieldCtrl | FieldCtrl | 문서 요약 정보 필드 | +| %usr | FieldCtrl | FieldCtrl | 사용자 정보 필드 | +| %hlk | FieldCtrl | FieldCtrl | 하이퍼링크 | +| bokm | TextCtrl | TextCtrl | 책갈피 | +| idxm | IndexMark | IndexMark | 찾아보기 | +| tdut | Dutmal | Dutmal | 덧말 | +| tcmt | | | 주석 | + +```js +Initialization Set : HwpCtrl.InsertCtrl 에 지정할 수 있는 initparam 의 ParameterSet ID +``` + +**예제** + +1. 표 삽입 +2. 예제 스크립트 실행 결과 : 현재 문서에 있는 모든 표의 셀 간격이 1pt 로 설정된다. + +```js +var ctrl = HwpCtrl.HeadCtrl; +var tbset = HwpCtrl.CreateSet("Table"); +tbset.SetItem("CellSpacing", 100); +while(ctrl) { + if (ctrl.CtrlID =="tbl") { + // 그리기 개체 / 표 ctrl.Properties = tbset; + } +ctrl = ctrl.Next; +} +``` + +#### 5.1.3 `Next` + +**구문** + +```js +ctrlCode.Next +``` + +**설명** + +다음 컨트롤. 읽기 전용. + +**반환값** + +현재 컨트롤의 뒤 컨트롤을 CtrlCode 객체 타입으로 리턴한다. + +**비고** + +문서 중의 모든 컨트롤(표, 그림 등 특수 문자)들은 linked list 로 서로 연결되어 있는데, list 중 다음 + +컨트롤을 나타낸다. + +**예제** + +1. 표 삽입 +2. 예제 스크립트 실행 결과 : 현재 문서에 있는 모든 표의 셀 간격이 1pt 로 설정된다. + +```js +var ctrl = HwpCtrl.HeadCtrl; +var tbset = HwpCtrl.CreateSet("Table"); +tbset.SetItem("CellSpacing", 100); +while(ctrl) { + if (ctrl.CtrlID =="tbl") { + // 그리기 개체 / 표 ctrl.Properties = tbset; + } +ctrl = ctrl.Next; +} +``` + +#### 5.1.4 `Prev` + +**구문** + +```js +ctrlCode.Prev +``` + +**설명** + +이전 컨트롤. 읽기 전용. + +**반환값** + +현재 컨트롤의 앞 컨트롤을 CtrlCode 객체 타입으로 리턴한다. + +**비고** + +문서 중의 모든 컨트롤(표, 그림 등 특수 문자)들은 linked list 로 서로 연결되어 있는데, list 중 앞 컨트롤을 나타낸다. + +**예제** + +1. 표 입력 +2. 예제 스크립트 실행 결과 : 문서 중 모든 표의 셀 간격을 1pt 로 설정한다. + +```js +var ctrl = HwpCtrl.LastCtrl; +var tbset = HwpCtrl.CreateSet("Table"); +tbset.SetItem("CellSpacing", 100); +while(ctrl != null) { + if(ctrl.CtrlID =="tbl") { + ctrl.Properties = tbset; + } +ctrl = ctrl.Prev; +} +``` + +#### 5.1.5 `Properties` + +**구문** + +```js +ctrlCode.Properties +``` + +**설명** + +컨트롤의 속성을 나타낸다. + +**반환값** + +컨트롤의 속성을 ParameterSet 객체 타입으로 리턴한다. + +**비고** + +모든 컨트롤은 대응하는 ParameterSet 으로 속성을 읽고 쓸 수 있다. + +**예제** + +1. 표 삽입 +2. 예제 스크립트 실행 결과 : 현재 문서에 있는 모든 표의 셀 간격이 1pt 로 설정된다. + +```js +var ctrl = HwpCtrl.HeadCtrl; +var tbset = HwpCtrl.CreateSet("Table"); +tbset.SetItem("CellSpacing", 100); +while(ctrl) { + if (ctrl.CtrlID =="tbl") { + // 그리기 개체 / 표 ctrl.Properties = tbset; + } +ctrl = ctrl.Next; +} +``` diff --git a/apps/as/next.config.ts b/apps/as/next.config.ts index e000661fb..5d4f22bce 100644 --- a/apps/as/next.config.ts +++ b/apps/as/next.config.ts @@ -40,6 +40,10 @@ const nextConfig: NextConfig = { source: `/webhwpctrl/${prefix}/:path*`, destination: `${webhwpCtrlBase}/${prefix}/:path*`, })), + { + source: "/webhwpctrl/file/:path*", + destination: `${webhwpCtrlBase}/file/:path*`, + }, ], fallback: [], }; diff --git a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/api/pwrk-cnsltn-doc-crt-rslt-service.ts b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/api/pwrk-cnsltn-doc-crt-rslt-service.ts index 7b5a9724d..f79df9e19 100644 --- a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/api/pwrk-cnsltn-doc-crt-rslt-service.ts +++ b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/api/pwrk-cnsltn-doc-crt-rslt-service.ts @@ -42,10 +42,24 @@ async function saveMultipart(formData: FormData): Promise { + const response = await client.put( + `${BASE}/${crtDmndUuid}/${verSn}`, + formData, + { headers: { "Content-Type": undefined } }, + ); + return response.data; +} + export const pwrkCnsltnDocCrtRsltService = { findLatestByCrtDmndUuid, openWebHwpLatest, download, downloadLatest, saveMultipart, + updateMultipart, } satisfies PwrkCnsltnDocCrtRsltService; diff --git a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/index.ts b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/index.ts index bdc8d1b15..6784fdcbd 100644 --- a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/index.ts +++ b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/index.ts @@ -2,6 +2,7 @@ export { pwrkCnsltnDocCrtRsltService } from "./api/pwrk-cnsltn-doc-crt-rslt-serv export type { PwrkCnsltnDocCrtRsltResponseDto, PwrkCnsltnDocCrtRsltService, + PwrkCnsltnDocCrtRsltUpdateRequestDto, } from "./model/pwrk-cnsltn-doc-crt-rslt-interface"; export { type PwrkCnsltnDocCrtRsltSaveRequestDto, diff --git a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-interface.ts b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-interface.ts index db95057d3..8f09aa23e 100644 --- a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-interface.ts +++ b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-interface.ts @@ -9,10 +9,22 @@ export interface PwrkCnsltnDocCrtRsltResponseDto { crtCmptnDt?: string; } +/** 백엔드 PwrkCnsltnDocCrtRsltUpdateRequestDto (모두 optional) */ +export interface PwrkCnsltnDocCrtRsltUpdateRequestDto { + rgtrUuid?: string; + orgnlOtptDocCn?: string; + crtCmptnDt?: string; +} + export interface PwrkCnsltnDocCrtRsltService { findLatestByCrtDmndUuid(crtDmndUuid: string): Promise; openWebHwpLatest(crtDmndUuid: string): Promise>; download(crtDmndUuid: string, verSn: number): Promise>; downloadLatest(crtDmndUuid: string): Promise>; saveMultipart(formData: FormData): Promise; + updateMultipart( + crtDmndUuid: string, + verSn: number, + formData: FormData, + ): Promise; } diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx index 5eb9395d4..dddb878d8 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx @@ -6,10 +6,7 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useAlertStore } from "@/shared/lib"; import { parseFilenameFromResponse } from "@/entities/attach"; -import { - pwrkCnsltnDocCrtRsltSaveRequestSchema, - pwrkCnsltnDocCrtRsltService, -} from "@/entities/pwrk-cnsltn-doc-crt-rslt"; +import { pwrkCnsltnDocCrtRsltService } from "@/entities/pwrk-cnsltn-doc-crt-rslt"; import { findCompletedPwrkDraft, pwrkCnsltnMngKeys, @@ -68,20 +65,23 @@ function PwrkCnsltnDocMngDialog({ open, fnrsCnsltnDocNo, onClose }: PwrkCnsltnDo } async function handleSaveDocument(file: Blob) { - if (!completedDraft) throw new Error("저장할 실무협의서 초안이 없습니다."); + const crtRslt = completedDraft?.crtRslt; + if (!completedDraft || crtRslt?.verSn == null) { + throw new Error("저장할 실무협의서 초안이 없습니다."); + } - const { crtDmndUuid } = pwrkCnsltnDocCrtRsltSaveRequestSchema.parse({ - crtDmndUuid: completedDraft.crtDmndUuid, - }); const formData = new FormData(); - formData.append("crtDmndUuid", crtDmndUuid); formData.append("file", file, documentFileName); - const savedDocument = await pwrkCnsltnDocCrtRsltService.saveMultipart(formData); + await pwrkCnsltnDocCrtRsltService.updateMultipart( + completedDraft.crtDmndUuid, + crtRslt.verSn, + formData, + ); await queryClient.invalidateQueries({ queryKey: pwrkCnsltnMngKeys.byUpDocNo(fnrsCnsltnDocNo), }); - alert(`실무협의서를 저장했습니다. (버전 ${savedDocument.verSn})`); + alert("실무협의서를 저장했습니다."); } async function handleDownload() { diff --git a/apps/as/src/widgets/hangulgiangi/model/hwp-ctrl.ts b/apps/as/src/widgets/hangulgiangi/model/hwp-ctrl.ts index c0f086910..814a8c5a1 100644 --- a/apps/as/src/widgets/hangulgiangi/model/hwp-ctrl.ts +++ b/apps/as/src/widgets/hangulgiangi/model/hwp-ctrl.ts @@ -19,6 +19,26 @@ export interface HwpCtrlOpenCallbackResult { export type HwpCtrlOpenCallback = (result: HwpCtrlOpenCallbackResult) => void; +/** SaveAs 가이드 + 한컴 포럼 실측 콜백 필드 */ +export interface HwpCtrlSaveAsCallbackResult { + result: boolean; + path?: string; + fileName?: string; + Size?: number; + size?: number; + CallbackUserData?: unknown; + downloadUrl?: string; + downloadName?: string; + uniqueId?: string; + resultCode?: number; + /** 일부 빌드에만 존재할 수 있는 폴백 필드 */ + data?: unknown; + message?: string; + [key: string]: unknown; +} + +export type HwpCtrlSaveAsCallback = (result: HwpCtrlSaveAsCallbackResult) => void; + /** * 실무협의서 관리에서 사용하는 HwpCtrl 메서드만 선언. * 실제 런타임 객체는 iframe contentWindow에 존재한다. @@ -35,9 +55,9 @@ export interface HwpCtrl { fileName: string, format: string, option: string, - callback?: HwpCtrlCallback, - extra?: Record, - ) => void; + callback?: HwpCtrlSaveAsCallback, + callbackUserData?: unknown, + ) => boolean; } export interface HwpCtrlFrameWindow { diff --git a/apps/as/src/widgets/hangulgiangi/ui/hangul-giangi.tsx b/apps/as/src/widgets/hangulgiangi/ui/hangul-giangi.tsx index e4e6a6c29..c3095263e 100644 --- a/apps/as/src/widgets/hangulgiangi/ui/hangul-giangi.tsx +++ b/apps/as/src/widgets/hangulgiangi/ui/hangul-giangi.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { WEBHYP_CTRL_URL } from "@/shared/config"; -import { cn, ScrollArea, ScrollBar } from "@common/components"; +import { cn } from "@common/components"; import { getHwpCtrl } from "../lib/get-hwp-ctrl"; import { @@ -11,7 +11,7 @@ import { HANGULGIANGI_READY_MESSAGE_TYPE, HWP_CTRL_IFRAME_NAME, } from "../lib/hangul-giangi-constants"; -import type { HwpCtrl } from "../model/hwp-ctrl"; +import type { HwpCtrl, HwpCtrlSaveAsCallbackResult } from "../model/hwp-ctrl"; import { HangulGiangiToolbar } from "./hangul-giangi-toolbar"; @@ -30,28 +30,11 @@ function HangulGiangi({ const openedDocumentKeyRef = useRef(null); const openingDocumentKeyRef = useRef(null); const attemptedDocumentKeyRef = useRef(null); - const logSequenceRef = useRef(0); - const logEndRef = useRef(null); + const savingDocumentKeyRef = useRef(null); const [isCtrlReady, setIsCtrlReady] = useState(false); const [isBusy, setIsBusy] = useState(false); - const [logs, setLogs] = useState([]); const iframeSrc = useMemo(() => buildBridgeSrc(bridgeUrl, ctrlBaseUrl), [bridgeUrl, ctrlBaseUrl]); - const appendLog = useCallback((message: string) => { - console.log(message); - setLogs((currentLogs) => [ - ...currentLogs, - { - id: ++logSequenceRef.current, - timestamp: formatLogTimestamp(new Date()), - message, - }, - ]); - }, []); - - useEffect(() => { - logEndRef.current?.scrollIntoView({ block: "nearest" }); - }, [logs]); useEffect(() => { function handleMessage(event: MessageEvent) { @@ -60,13 +43,12 @@ function HangulGiangi({ if (iframeRef.current && event.source !== iframeRef.current.contentWindow) return; setIsCtrlReady(true); - appendLog("기안기 초기화가 완료되었습니다."); onReady?.(); } window.addEventListener("message", handleMessage); return () => window.removeEventListener("message", handleMessage); - }, [appendLog, onReady]); + }, [onReady]); useEffect(() => { if (isCtrlReady) return; @@ -75,26 +57,23 @@ function HangulGiangi({ const timer = window.setInterval(() => { if (getHwpCtrl(iframeRef.current)) { setIsCtrlReady(true); - appendLog("기안기 초기화가 완료되었습니다."); onReady?.(); window.clearInterval(timer); return; } if (Date.now() - startedAt > HWP_CTRL_READY_TIMEOUT_MS) { - appendLog("웹한글 기안기 초기화 시간이 초과되었습니다."); window.clearInterval(timer); } }, HWP_CTRL_POLL_INTERVAL_MS); return () => window.clearInterval(timer); - }, [appendLog, isCtrlReady, onReady]); + }, [isCtrlReady, onReady]); const handleOpen = useCallback(() => { const ctrl = resolveHwpCtrl(iframeRef.current, isCtrlReady); if (!ctrl) return; setIsBusy(true); - appendLog("실무협의서를 불러오고 있습니다."); openingDocumentKeyRef.current = documentKey; attemptedDocumentKeyRef.current = documentKey; try { @@ -111,28 +90,22 @@ function HangulGiangi({ openingDocumentKeyRef.current = null; setIsBusy(false); - if (!result.result) { - appendLog(result.message ?? "문서를 열지 못했습니다."); - return; - } + if (!result.result) return; openedDocumentKeyRef.current = callbackDocumentKey; - appendLog("실무협의서를 열었습니다."); }, - { documentKey } satisfies OpenCallbackUserData, + { documentKey } satisfies DocumentCallbackUserData, ); if (isAccepted) return; openingDocumentKeyRef.current = null; setIsBusy(false); - appendLog("웹한글 기안기가 문서 열기 요청을 접수하지 못했습니다."); - } catch (error) { + } catch { openingDocumentKeyRef.current = null; setIsBusy(false); - appendLog(getErrorMessage(error, "문서를 열지 못했습니다.")); } - }, [appendLog, documentBlob, documentFileName, documentKey, isCtrlReady]); + }, [documentBlob, documentFileName, documentKey, isCtrlReady]); useEffect(() => { if ( @@ -151,54 +124,55 @@ function HangulGiangi({ if (!ctrl) return; setIsBusy(true); - appendLog("실무협의서를 저장하고 있습니다."); + savingDocumentKeyRef.current = documentKey; try { - ctrl.SaveAs(documentFileName, "HWPX", "download:false", async (result) => { - try { - if (result.result === false) { - throw new Error(result.message ?? "기안기에서 문서를 추출하지 못했습니다."); - } + const isAccepted = ctrl.SaveAs( + documentFileName, + "HWPX", + "download:false", + async (result) => { + const callbackDocumentKey = getCallbackDocumentKey(result.CallbackUserData, documentKey); + if (savingDocumentKeyRef.current !== callbackDocumentKey) return; - const documentBlob = decodeDocumentData(result.data); - if (!documentBlob) { - throw new Error("기안기 저장 결과에 문서 데이터가 없습니다."); - } + savingDocumentKeyRef.current = null; + try { + if (!result.result) { + throw new Error(result.message ?? "기안기에서 문서를 추출하지 못했습니다."); + } - await onSaveDocument(documentBlob); - appendLog("실무협의서를 새 버전으로 저장했습니다."); - } catch (error) { - appendLog(getErrorMessage(error, "문서 저장에 실패했습니다.")); - } finally { - setIsBusy(false); - } - }); - } catch (error) { + const savedDocumentBlob = await resolveSaveAsDocumentBlob(result); + await onSaveDocument(savedDocumentBlob); + } finally { + setIsBusy(false); + } + }, + { documentKey } satisfies DocumentCallbackUserData, + ); + + if (isAccepted) return; + + savingDocumentKeyRef.current = null; + setIsBusy(false); + } catch { + savingDocumentKeyRef.current = null; setIsBusy(false); - appendLog(getErrorMessage(error, "문서 저장에 실패했습니다.")); } - }, [appendLog, documentFileName, isCtrlReady, onSaveDocument]); + }, [documentFileName, documentKey, isCtrlReady, onSaveDocument]); const handleDownload = useCallback(async () => { setIsBusy(true); - appendLog("실무협의서를 다운로드하고 있습니다."); try { await onDownload(); - appendLog("실무협의서를 다운로드했습니다."); - } catch (error) { - appendLog(getErrorMessage(error, "문서 다운로드에 실패했습니다.")); } finally { setIsBusy(false); } - }, [appendLog, onDownload]); + }, [onDownload]); const handleFullscreen = useCallback(async () => { - if (!iframeRef.current) { - appendLog("전체화면으로 표시할 웹한글 기안기를 찾지 못했습니다."); - return; - } + if (!iframeRef.current) return; await iframeRef.current.requestFullscreen(); - }, [appendLog]); + }, []); return (
void handleDownload()} - onFullscreen={() => void handleFullscreen()} + onDownload={handleDownload} + onFullscreen={handleFullscreen} /> - -
- {logs.length > 0 ? ( - logs.map((log) => ( -

- - {log.message} -

- )) - ) : ( -

기안기를 불러오고 있습니다.

- )} -
-
- - - -