Files
_Geulbeot/03.Code/geulbeot_업로드용/domain/hwpx/hwpx_domain_guide.md
T

5.5 KiB

HWP/HWPX ↔ HTML/CSS 도메인 가이드

목적: HWPX에서 문서 유형·스타일·템플릿을 추출하거나, HTML → HWPX → HWP 변환 시
하드코딩 없이 이 가이드를 참조하여 정확한 매핑을 수행한다.
출처: 한글과컴퓨터 공식 "글 문서 파일 구조 5.0" (revision 1.3, 2018-11-08)
범위: HWP 5.0 바이너리 스펙의 개념 체계 + HWPX XML 태그 + HTML/CSS 매핑


0. 문서 형식 관계

HWP (바이너리)          HWPX (XML)              HTML/CSS
─────────────────   ─────────────────────   ─────────────────
Compound File       ZIP Archive             단일 HTML 파일
├─ FileHeader       ├─ META-INF/            ├─ <head>
├─ DocInfo          │   └─ manifest.xml     │   ├─ <meta>
│  (글꼴, 스타일,   ├─ Contents/            │   └─ <style>
│   테두리/배경,     │   ├─ header.xml       └─ <body>
│   글자모양 등)     │   │  (DocInfo 대응)       ├─ 헤더 영역
├─ BodyText/        ├─ section0.xml     │   ├─ 본문
│  └─ Section0      │   │  (본문 대응)       │   └─ 푸터 영역
├─ BinData/         │   └─ section1.xml     └─ @page CSS
│  └─ 이미지 등     ├─ BinData/
└─ PrvImage         │   └─ 이미지 파일
                    └─ version.xml

핵심: HWP 바이너리의 레코드 구조와 HWPX XML의 엘리먼트는 1:1 대응한다.
이 가이드는 두 형식의 공통 개념 체계를 기준으로, CSS 변환까지 연결한다.


1. 단위 체계

1.1 HWPUNIT (글 내부 단위)

HWP는 1/7200 인치를 기본 단위로 사용한다.

변환 대상 공식 예시
HWPUNIT → mm hwpunit / 7200 * 25.4 7200 → 25.4mm (= 1인치)
HWPUNIT → pt hwpunit / 7200 * 72 7200 → 72pt
HWPUNIT → px (96dpi) hwpunit / 7200 * 96 7200 → 96px
mm → HWPUNIT mm / 25.4 * 7200 25.4mm → 7200
pt → HWPUNIT pt / 72 * 7200 10pt → 1000
def hwpunit_to_mm(hwpunit):  return hwpunit / 7200 * 25.4
def hwpunit_to_pt(hwpunit):  return hwpunit / 7200 * 72
def hwpunit_to_px(hwpunit, dpi=96):  return hwpunit / 7200 * dpi
def mm_to_hwpunit(mm):       return mm / 25.4 * 7200

1.2 글자 크기 (CharShape)

HWP의 글자 크기는 HWPUNIT 단위이지만 100배 스케일이 적용되어 있다.

HWP 값 실제 크기 CSS
1000 10pt font-size: 10pt
1200 12pt font-size: 12pt
2400 24pt font-size: 24pt
def charsize_to_pt(hwp_size):  return hwp_size / 100  # 1000 → 10pt

1.3 COLORREF (색상)

HWP는 0x00BBGGRR 형식(리틀 엔디안 BGR). CSS는 #RRGGBB.

HWP COLORREF 분해 CSS
0x00000000 R=0, G=0, B=0 #000000 (검정)
0x00FF0000 R=0, G=0, B=255 #0000ff (파랑)
0x0000FF00 R=0, G=255, B=0 #00ff00 (초록)
0x000000FF R=255, G=0, B=0 #ff0000 (빨강)
0x00FFFFFF R=255, G=255, B=255 #ffffff (흰색)
def colorref_to_css(colorref):
    r = colorref & 0xFF
    g = (colorref >> 8) & 0xFF
    b = (colorref >> 16) & 0xFF
    return f'#{r:02x}{g:02x}{b:02x}'

HWPX XML에서의 색상: #RRGGBB 형식으로 직접 기록됨 (변환 불필요).


2. 테두리/배경 (BorderFill)

HWP: HWPTAG_BORDER_FILL (DocInfo 레코드)
HWPX: <hh:borderFill> (header.xml 내)
용도: 표 셀, 문단, 쪽 테두리/배경에 공통 적용

2.1 테두리선 종류

HWP 값 이름 HWPX type 속성 CSS border-style
0 실선 SOLID solid
1 긴 점선 DASH dashed
2 점선 DOT dotted
3 -.-.-. DASH_DOT dashed (근사)
4 -..-.. DASH_DOT_DOT dashed (근사)
5 긴 Dash LONG_DASH dashed
6 큰 동그라미 CIRCLE dotted (근사)
7 2중선 DOUBLE double
8 가는선+굵은선 THIN_THICK double (근사)
9 굵은선+가는선 THICK_THIN double (근사)
10 가는+굵은+가는 THIN_THICK_THIN double (근사)
11 물결 WAVE solid (근사)
12 물결 2중선 DOUBLE_WAVE double (근사)
13 두꺼운 3D THICK_3D ridge
14 두꺼운 3D(역) THICK_3D_REV groove
15 3D 단선 3D outset
16 3D 단선(역) 3D_REV inset
— 없음 NONE none

2.2 테두리선 굵기

HWP 값 실제 굵기 HWPX width 속성 CSS border-width
0 0.1 mm 0.1mm 0.1mm ≈ 0.4px
1 0.12 mm 0.12mm 0.12mm ≈ 0.5px
2 0.15 mm 0.15mm 0.15mm ≈ 0.6px
3 0.2 mm 0.2mm 0.2mm ≈ 0.8px
4 0.25 mm 0.25mm 0.25mm ≈ 1px
5 0.3 mm 0.3mm 0.3mm ≈ 1.1px
6 0.4 mm 0.4mm 0.4mm ≈ 1.5px
7 0.5 mm 0.5mm 0.5mm ≈ 1.9px
8 0.6 mm 0.6mm 0.6mm ≈ 2.3px
9 0.7 mm 0.7mm 0.7mm ≈ 2.6px
10 1.0 mm 1.0mm 1mm ≈ 3.8px
11 1.5 mm 1.5mm 1.5mm ≈ 5.7px
12 2.0 mm 2.0mm 2mm ≈ 7.6px
13 3.0 mm 3.0mm 3mm ≈ 11.3px
14 4.0 mm 4.0mm 4mm ≈ 15.1px
15 5.0 mm 5.0mm 5mm ≈ 18.9px