한컴테크를 통해 한컴의 기술을 공유합니다. 한컴의 프로그래밍, 프레임워크, 라이브러리 및 도구 등 다양한 기술을 만나보세요. 한컴 개발자들의 다양한 지식을 회사라는 울타리를 넘어 여러분과 공유합니다. 한컴이 제공하는 기술블로그에서 새로운 아이디어와 도전을 마주하고, 개발자가 꿈꾸는 미래를 실현하세요.

한컴테크

한/글 문서 파일 형식 : HWPX 포맷 구조 살펴보기


요약

이 글은 개방형 문서 포맷인 HWPX의 구조와 데이터를 저장하고 관리하는 방식을 다룹니다. HWPX와 기존 HWP 포맷의 차이를 설명하며, HWPX 포맷의 주요 구성 요소와 각 파일의 역할을 분석합니다. HWPX 문서 데이터를 활용하기 위한 기초 지식을 제공하는 글입니다.

서론


이전 글을 통해 HWP 포맷을 알아봤다면, 이번 글에서는 HWPX 포맷에 대해 알아보겠습니다.

HWP는 바이너리 포맷이고, HWPX는 XML 파일들이 ZIP 구조로 구성되어 있다는 점에서 가장 큰 차이가 있습니다. HWP 포맷의 경우 스트림이 레코드 형식으로 구성되어 있어서 데이터를 추출하기 위해 별도의 분석 과정을 거쳐야 하는 반면, HWPX 포맷은 주요 파일들이 XML이기 때문에 데이터 추출이 용이합니다.

개방형 포맷으로 알려진 HWPX 파일이 어떤 구조로 이루어져 있고, 각 구성 요소가 어떤 역할을 하는지 알아보겠습니다.

HWPX란?


KS X 6101 표준 표지 이미지

한글의 표준 포맷 HWPX는 국가 표준(KS X 6101)인 OWPML을 따르는 개방형 문서 포맷입니다.

OWPML은 XML 기반의 ‘개방형 워드프로세서 마크업 언어(Open Word-Processor Markup Language)’를 의미합니다. 2011년 12월 30일 제정된 한국산업표준(KS)으로, 약 2년에 걸쳐 국내 문서 표준화 위원회를 통해 표준 개발이 진행되었으며, 국내 표준 개발에 직접 참여하고 있는 전문가들과 함께 공동 개발된 국가 표준입니다.

HWP 형식의 바이너리 포맷에 대한 개방성, 호환성, 보존성을 확보하기 위해 개발된 파일 형식이며, 이를 위해 바이너리 포맷보다 개방성과 기술적 해석이 용이한 XML 기반의 패키지 포맷으로 구성되었습니다.

아래 링크를 통해 한글(HWP, HWPX) 문서 포맷의 공식 자료를 확인할 수 있습니다.

HWPX 파일 구조


HWPX는 ZIP 파일 구조를 가진 XML 기반 포맷이며, 관련된 파일들이 동일 디렉터리에 위치하도록 구성되어 있습니다. 압축 파일이기 때문에 확장자를 변경하여 압축을 해제할 수 있습니다. 위 이미지는 .hwpx 파일의 확장자를 .zip으로 변경한 후 압축을 해제한 결과입니다.

HWP 포맷의 경우 스트림이 레코드 형식으로 구성되어 있어서 데이터를 추출하기 위해 별도의 분석 과정을 거쳐야 하는 반면, HWPX 포맷은 주요 파일들이 XML이기 때문에 데이터 추출이 용이합니다.

HWPX는 HWP와 비슷하면서도 다른 형태로 구성되어 있으며, 각각의 포맷 구조는 아래의 그림과 같습니다.

전체적인 틀은 비슷하지만 저장되는 스트림 또는 파일 이름만으로도 약간의 차이가 있음을 확인하실 수 있습니다. 문서의 내용에 따라 구성요소는 그림에 표기된 것과 달라질 수 있습니다. (변경 추적/문서 이력/이미지 제거/스크립트 제거 등)

HWPX 구성요소 역할


구조도를 통해 HWPX가 어떻게 구성되어 있는지 간단하게 확인해 보았습니다.
그렇다면 HWPX를 구성하고 있는 각 요소들은 어떤 역할을 하는지 핵심적인 파일 위주로 살펴보겠습니다.

mimetype : 파일 형식 정보

mimetype 파일은 HWPX 포맷임을 확인할 수 있는 시그니처 정보입니다.
저장된 mimetype을 통해 실제 HWPX 포맷인지를 구분하게 됩니다.

settings.xml : 커서 위치 정보, 외부 설정 요소 정보

settings.xml 파일에는 외부 설정 요소 정보가 포함됩니다.
한글 프로그램에서는 저장 시점의 커서 위치 정보(CaretPosition)를 아래와 같이 해당 파일에 저장하고 있습니다.

version.xml : 버전 정보

version.xml 파일에서는 OWPML 파일 형식 버전 정보와 해당 한글 문서를 저장한 환경 정보 등을 확인할 수 있습니다.

BinData/ : 문서에 포함된 바이너리 정보

BinData 폴더에는 문서에 포함된 이미지, OLE 개체 등의 바이너리 파일들로 구성되어 있습니다. 문서에서 사용되는 이미지와 같은 개체들은 바이너리 파일로 HWPX 파일 구조에 포함됩니다.

Contents/ : 서식을 포함한 문서 내용

Contents 폴더에는 문서에서 사용되는 서식 정보와 본문 내용이 포함되어 있습니다.
문서를 구성하는 데 있어서 무엇보다도 중요한 본문 내용을 포함하는 폴더로 각 파일에 어떤 정보가 담겨있는지 자세히 살펴보겠습니다.

Contents/content.hpf : 패키징 주요 파일 목록

content.hpf 파일에는 패키징 주요 파일 목록이 있습니다. OPF(Open Packaging Format) 표준에 따라 정의되었으며, metadata, manifest, spine 세 부분으로 나누어 구성되어 있습니다.

metadata에는 작성자, 제목, 생성 날짜 등 문서의 메타데이터가 들어있고, manifest에는 패키지를 이루는 파일 목록이 들어있습니다. spine은 manifest에 정의된 item을 참조하여 문서 내부 구조를 구성합니다. manifest의 순서는 중요하지 않지만, spine에서는 순서가 중요합니다. spine에 나열된 순서에 따라 문서를 읽어야 합니다.

Contents/header.xml : 서식 관련 매핑 정보(Shape Table) 등 문서 내용에 관련된 모든 설정

header.xml 파일은 문서 내용에 관련된 모든 설정을 가지고 있습니다.
대표적으로 본문에서 사용되는 글자 모양, 문단 모양 등의 데이터에 대한 매핑 정보를 포함합니다. 그 밖에도 금칙 문자, 문서 호환성 설정, 변경 추적 정보 등의 정보가 있습니다.

HWP 포맷의 DocInfo 스트림과 거의 동일한 내용들이 담겨 있고, section.xml에서는 header.xml 파일을 참조하여 여러 가지 속성을 지정하게 됩니다. 보다 자세한 내용은 실전 편에서 예시와 함께 알아보겠습니다.

Contents/section0.xml : 구역별 본문 내용

한글 문서는 한 개 이상의 구역으로 이루어져 있으며, 각각의 구역이 별도의 파일로 저장됩니다.
본문의 구역 개수만큼 파일이 존재하고 section0.xml, section1.xml, … 과 같이 이름이 지정됩니다. 각 구역의 내용을 구성하는 문단들이 구역 하위에 포함되어 있습니다.

많은 내용이 담겨 있지만 간단하게 살펴보면, <hp:p> 단위로 구분되어 문서 내용을 표현하고 있고, 글자 모양으로 구분되는 <hp:run> 하위의 <hp:t>가 문서 내부의 텍스트를 담고 있는 형태입니다. <hp:t> 태그 안의 정보만 가지고도 문서에 포함된 텍스트를 추출할 수 있습니다.

META-INF/ : 컨테이너 주요 파일 목록 및 암호화 정보

META-INF/ 폴더에는 manifest.xml, container.rdf, container.xml 파일이 담겨 있습니다. 암호 문서인 경우 manifest.xml 파일에 HWPX 내부의 각 파일별 암호화를 위한 정보가 저장되며, container.rdf, container.xml 파일은 컨테이너를 구성하는 주요 파일 목록으로 구성되어 있습니다.

Scripts/ : 스크립트 정보

Scripts 폴더에는 문서에 저장된 스크립트 정보가 담겨 있습니다. headerScripts, sourceScripts 파일에 스크립트 내용이 저장됩니다.

Preview/ : 미리보기 정보

Preview 폴더에는 미리보기 이미지와 텍스트 파일이 담겨 있습니다. 파일 탐색기에서 미리보기 창을 열었을 때 표시되는 이미지나 파일에 마우스를 올려놓았을 때 표시되는 텍스트 내용이 바로 이 정보를 참조합니다. 암호 문서의 경우 보안을 위해 해당 파일을 저장하지 않습니다.

마치며


HWPX를 활용하기에 앞서 전체적인 구조와 내부를 구성하는 각 파일의 역할을 알아보았습니다. 문서를 구성하는 모든 내용을 설명하기에는 분량이 너무 길어질 것 같아서 전체적으로 간략하게 정리하고 주요 파일들만 추가적인 내용을 덧붙여서 설명드렸습니다. 이후 시리즈에서는 실제 HWPX 문서에서 원하는 데이터를 추출하는 예제를 공유하려고 합니다. 오늘 정리한 내용이 HWPX의 어떤 구성 요소에 어떤 데이터가 있는지 파악하고 문서의 데이터를 활용하는 데 도움이 되었으면 좋겠습니다. 감사합니다.

Scroll to Top