5.5 KiB
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 |