-
Notifications
You must be signed in to change notification settings - Fork 148
Home
hwp 파일은 MS 오피스 파일과 동일하게 MS Compound File Binary Format(CFBF)을 하부 구조로 채택하고 있다. CFBF은 디스크 구조인 FAT(File Allocation Table)을 파일 내부에 구현한 것이다. FAT이 디렉토리와 파일로 계층적으로 구성된 것처럼, CFBF는 Storage와 Stream으로 구성된다.
이 구조의 장점은 파일 전체를 다시 쓰지 않고도, 특정 스트림을 추가/삭제/수정 할 수 있다는 데 있다. 아마도, 이 때문에 hwp 파일의 하부 구조로 채택되었을 거 같다. 이 부분을 파싱하기 위해, HWPLib는 Apache POI 라는 라이브러리를 사용한다.
한글 파일은 다음과 같은 구조를 갖는다.
HWPLib는 위에 구조 중에 실제 문서를 저장하는 부분인 “파일 인식 정보”, “문서 정보”, “본문”, “바이너리 데이터” 부분만을 다루고 있다.
이 부분은 특정 파일의 HWP 파일의 버전, 속성과 같은 정보를 저장한다. HWPLib에서는 HWPFIle.getFileHeader()로 접근할 수 있으며, kr.dogfoot.hwplib.object.fileheader.FileHeader 클래스로 생성된다.
이 부분은 본문 부분에서 사용하는 글자 모양, 문단 모양 등을 관리한다. HWP는 본문에서 반복적으로 사용하는 글자 모양, 문단 모양 등의 객체들을 “문서 정보” 부분에 저장해넣고, 본문에서는 이를 링크해서 사용한다. HWPLib에서는 HWPFile.getDocInfo()로 접근할 수 있으며, kr.dogfoot.hwplib.object.docinfo.DocInfo 클래스로 생성된다.
이 부분은 문서의 실제 내용을 저장하는 부분이다. 본문은 여러 개의 섹션으로 구성되고, 섹션은 여러 개의 문단으로 되어 있다. 섹션은 문서를 구성하는 논리적인 단위이다. 문서가 섹션으로 나눠지면, 페이지 속성등의 섹션 속성들을 이전 섹션과 다르게 설정할 수 있다.
HWPLib에서는 HWPFile.getBodyText()로 접근할 수 있으며, kr.dogfoot.hwplib.object.bodytext.BodyText 클래스로 생성된다.
본문에서 사용한 이미지 등의 바이너리 데이터를 저장한다. “BinData” 스토리지 아래에 스트림에 바이너리 파일을 그대로 저장한다.
문서 정보는 다음과 같은 객체들을 포함한다.
이름 | 설명 |
---|---|
아이디 매핑 헤더 | 문서 정보(DocInfo)에 포함된 다른 객체들의 개수를 저장한다. |
바이너리 데이터 | 2. 4)에서 설명한 “바이너리 데이터” 스토리지에 저장된 파일들을 사용하기 위해 필요한 정보를 저장한다. |
글꼴 | 문서의 글자 모양에서 사용된 글꼴에 대한 정보를 저장한다. |
테두리/배경 | 문서에서 사용된 테두리/배경 정보를 저장한다. |
글자 모양 | 문서에서 사용된 글자 모양 정보를 저장한다. |
텝 정의 | 문서의 문단 모양에서 사용된 텝 정의 정보를 저장한다. |
문단 번호 | 문서의 문단 모양에서 사용된 문단 번호 정보를 저장한다. |
글머리표 | 문서의 문단 모양에서 사용된 글머리표 정보를 저장한다. |
문단 모양 | 문서의 문단에서 사용하는 문단 모양 정보를 저장한다. |
스타일 | 문서에서 사용된 스타일 정보를 저장한다. |
메모 모양 | 문서에서 사용된 메모 모양 정보를 저장한다. |
... | ... |
- 4)에서 설명한 “바이너리 데이터” 스토리지에 저장된 binary 데이터와 이 데이터를 사용하는 문서 내부의 객체를 연결하는 역활을 한다.
HWPLib에서는 HWPFile.getDocInfo().getBinDataList()로 접근할 수 있으며, kr.dogfoot.hwplib.object.docinfo.BinData 클래스로 생성된다.
글꼴 객체는 글자 모양 객체에 링크되어 사용된다. 글자 모양 객체는 7개의 언어 타입별로 다른 글꼴을 각각 설정할 수 있다.
HWPLib에서도 다음의 7개의 리스트로 각각의 구역에서 사용하는 글꼴을 저장한다. 글꼴 객체는 kr.dogfoot.hwplib.object.docinfo.FaceName 클래스로 저장된다.
언어 타입 | HWPLib에서 접근 방법 |
---|---|
한글 | HWPFile.getDocInfo().getHangulFaceNameList() |
영문 | HWPFile.getDocInfo().getEnglishFaceNameList() |
한자 | HWPFile.getDocInfo().getHanjaFaceNameList() |
일어 | HWPFile.getDocInfo().getJapaneseFaceNameList() |
외국어 | HWPFile.getDocInfo().getEtcFaceNameList() |
기호 | HWPFile.getDocInfo().getSymbolFaceNameList() |
사용자 | HWPFile.getDocInfo().getUserFaceNameList() |
본문에 포함된 컨트롤이나 본문 페이지에서 사용되는 테두리/배경 정보를 저장한다.
HWPLib에서는 HWPFile.getDocInfo().getBorderFillList()로 접근할 수 있고, kr.dogfoot.hwplib.object.docinfo.BorderFill 클래스로 저장된다.
본문에 문단에서 사용하는 글자 모양을 저장한다.
HWPLib에서는 HWPFile.getDocInfo().getCharShapeList()로 접근할 수 있고, kr.dogfoot.hwplib.object.docinfo.CharShape 클래스로 저장된다.
문단 모양 객체에서 사용되는 문단 번호/글머리표 정보를 저장한다.
HWPLib에서는 HWPFile.getDocInfo().getNumberingList(), getBulletList()로 접근할 수 있고, kr.dogfoot.hwplib.object.docinfo.Numbering, Bullet 클래스로 저장된다.
본문의 문단에서 사용하는 문단 모양 객체를 저장한다.
HWPLib에서는 HWPFile.getDocInfo().getParaShapeList ()로 접근할 수 있고, kr.dogfoot.hwplib.object.docinfo.ParaShape 클래스로 저장된다.
HWP 파일의 실제 내용은 구역들의 나열이고, 구역은 문단의 나열이다. 즉, HWP 파일은 문단의 나열이다. HWPLib는 Paragraph 클래스로 문단을 표현한다. Paragraph 클래스는 다음과 같이 구성된다.
이름 | 설명 |
---|---|
문단 헤더 | 문단 전체에 대한 속성을 저장한다. |
문단 텍스트 | 문단의 포함된 글자들을 저장한다. |
문단 글자 모양 | 문단에 적용되는 글자 모양과 문단 내의 위치들을 저장한다. |
문단 레이아웃 | 문단의 레이아웃 정보를 저장한다. 이 정보는 문단을 그릴 때 빠르게 그리기 위해 사용하는 듯하다. 없어도 문단을 표현하는데 지장이 없다. |
문단 영역 태그 | ?? |
문단 컨트롤 리스트 | 문단에 포함된 컨트롤(글상자, 표 등)들을 저장한다. |
문단 메모 리스트 | 문단에서 사용하는 메모들을 저장한다. |
문단 전체에 대한 속성을 저장한다. 특히, 이 문단에서 사용될 문단 모양의 ID을 설정할 수 있다. HWPLib는 Paragraph.getHeader()로 접근할 수 있으며, kr.dogfoot.hwplib.object.bodytext.paragraph.header.ParaHeader 클래스로 저장된다.
문단 텍스트 부분은 문단 내에 표현되는 있는 문자들을 나열한다. HWP의 글자는 크게 일반 문자와 제어 문자로 나누어지고, 제어 문자는 표현하고자 하는 내용에 따라 char, inline, extended 로 나누어 진다. HWPLib는 Paragraph.getText()로 접근할 수 있으며, kr.dogfoot.hwplib.object.bodytext.paragraph.text.ParaText 클래스로 저장된다.
종류 | 설명 |
---|---|
일반 문자 | 일반적인 글자를 나타내기 위한 글자 객체 |
제어 문자 | 문단 내에 특정한 제어 문자를 넣기 위한 글자 객체 |
제어 문자는 다음과 같다.
코드 | 설명 | 컨트롤 형식 |
---|---|---|
0 | Unusable | char |
1 | 예약 | extended |
2 | 구역 정의/단 정의 | extended |
3 | 필드 시작(누름틀, 하이퍼링크 등) | extended |
4 | 필드 끝 | inline |
5-7 | 예약 | inline |
8 | title mark | inline |
9 | 탭 | inline |
10 | 한 줄 끝(line break) | char |
11 | 그리기 개체/표 | extended |
12 | 예약 | extended |
13 | 문단 끝(para break) | char |
14 | 예약 | extended |
15 | 숨은 설명 | extended |
16 | 머리말/꼬리말 | extended |
17 | 각주/미주 | extended |
18 | 자동번호(각주, 표 등) | extended |
19-20 | 예약 | inline |
21 | 페이지 컨트롤(감추기, 새 번호로 시작 등) | extended |
22 | 책갈피/찾아보기 표식 | extended |
23 | 덧말/글자 겹침 | extended |
24 | 하이픈 | char |
25-29 | 예약 | char |
30 | 묶음 빈칸 | char |
31 | 고정폭 빈칸 | char |
예제) “가나다” 다음에 표 컨트롤이 오고, 또 다음에 “ABC” 라는 글자가 오면 텍스트 부분은 다음과 같이 저장된다.
Extended 제어 문자는 컨트롤에 대한 별도 내용을 문단의 컨트롤 리스트에 저장한다.
예제) 표와 사각형이 다음과 같이 문단에 저장되었으면
문단의 컨트롤 리스트는 다음과 같이 저장된다.
HWP에서 [조판 글자] 보이기 기능을 사용하면 다음과 같이 일반 문자 사이에 extended 제어 문자 가 들어간 것을 볼 수 있다.
문단 글자 모양은 문단에서 사용중인 글자 모양 객체의 아이디와 그 글자 모양이 적용되는 위 치를 나열한다. HWPLib는 Paragraph.getCharShape()로 접근할 수 있으며, kr.dogfoot.hwplib.object.bodytext.paragraph.charshape.ParaCharShape 클래스로 저장된다.
예를 들어, “가나다라마바” 에서 “가나”가 검은색, “다라”가 빨간색, “마바”가 파란색 글자로 표현했 되었었고, 문서 정보(DocInfo) 내에 글자 모양 객체가 다음과 같이 저장되었다면
문단 텍스트는
이고, 문단 글자 모양은
으로 저장된다.
앞에서 언급했듯이, HWP 파일의 실제 내용 저장된 “본문”은 구역들이 나열이고, 구역은 문단들이 나열된다.
섹션의 첫 번째 문단은 구역 정의 컨트롤과 단 정의 컨트롤로 시작해야 한다. 위에 그림에서 “문 단1”, “문단9”, “문단12”이 여기에 해당된다.
구역은 새로운 페이지에서 구역/단 정의 컨트롤 내의 정보로 새로운 페이지를 생성한다. 페이지를 생성 후, 문단을 차례대로 채워 나가나 페이지 내의 공간이 부족하면, 페이지를 추가하는 방식으로 전체 페이지를 생성한다.
위에 예제의 hwp 파일은 다음과 같이 전체 페이지를 생성할 것이다.