Convert Korean HWP 5.0 and HWPX documents to LLM-optimized Markdown
A library and CLI tool that converts Hancom HWP (5.0 binary) and HWPX (ZIP+XML) files into clean Markdown. Extracts text, tables, and document structure while preserving semantic information.
- Python package on PyPI | JavaScript/TypeScript package on npm
- Supports both HWP 5.0 (OLE Compound File) and HWPX (Open XML) formats
- Table extraction with cell merge handling (rowspan/colspan)
- Works in Node.js, browsers, and Python 3.12+
# Python
uvx hwp2md convert input.hwp output.md
# JavaScript
npx hwp2md convert input.hwpx output.mdHWP 5.0 및 HWPX 문서를 LLM에 최적화된 Markdown으로 변환
HWP2MD는 한글(HWP 5.0 및 HWPX) 파일을 깔끔한 Markdown으로 변환하는 라이브러리 및 CLI 도구입니다. 텍스트, 표, 문서 구조를 추출하며 의미 정보를 보존합니다.
두 가지 구현체 제공:
- Python - 원본 구현체 (packages/python/)
- JavaScript/TypeScript - Node.js 및 브라우저용 (packages/js/)
- 🚀 빠르고 정확 - HWP 5.0 바이너리 및 HWPX(ZIP+XML) 직접 파싱
- 📊 표 지원 - 셀 병합 처리를 포함한 표 추출
- 🤖 LLM 최적화 - AI 처리에 최적화된 깔끔한 텍스트 출력
- 🎨 유연한 출력 - 용도에 맞는 포맷 설정
- 💻 CLI & 라이브러리 - 커맨드라인 도구 또는 라이브러리로 사용
- 📝 순수 Markdown - HTML 변환 없이 순수 Markdown 출력
- 🌐 멀티 플랫폼 - Python, Node.js, 브라우저에서 동작
- 📦 TypeScript 지원 - 전체 타입 정의 포함
- 📄 HWP & HWPX - 두 가지 한글 파일 형식 모두 지원
# uvx 사용 (권장)
uvx hwp2md input.hwp
# pip 사용
pip install hwp2md
# 소스에서 설치
cd packages/python
uv pip install -e .# npm
npm install hwp2md
# pnpm
pnpm add hwp2md
# yarn
yarn add hwp2md
# 전역 CLI 설치
npm install -g hwp2md# HWP를 Markdown으로 변환
hwp2md convert input.hwp output.md
# HWPX를 Markdown으로 변환 (자동 감지)
hwp2md convert input.hwpx output.md
# 표 내 줄바꿈을 <br>로 표시
hwp2md convert input.hwp output.md --table-line-breaks=br
# 파일 정보 표시
hwp2md info input.hwp
hwp2md info input.hwpxfrom hwp2md.parser import HWPFile
from hwp2md.converter import convert_hwp_to_markdown
# HWP 변환
with HWPFile('input.hwp') as hwp:
markdown = convert_hwp_to_markdown(hwp)
print(markdown)
# HWPX 변환
from hwp2md.hwpx_parser import HWPXFile
from hwp2md.converter import convert_hwpx_to_markdown
with HWPXFile('input.hwpx') as hwpx:
markdown = convert_hwpx_to_markdown(hwpx)
print(markdown)
# 옵션 지정 (HWP/HWPX 동일)
with HWPFile('input.hwp') as hwp:
markdown = convert_hwp_to_markdown(
hwp,
table_line_break_style='br' # 'space' (기본값) 또는 'br'
)Node.js:
import { convert } from 'hwp2md';
// HWP 또는 HWPX 변환 (자동 감지)
const markdown = await convert('input.hwp'); // HWP
const markdown2 = await convert('input.hwpx'); // HWPX
// 옵션 지정
const markdown3 = await convert('input.hwp', {
tableLineBreakStyle: 'br' // 'space' (기본값) 또는 'br'
});브라우저:
import { convertFromFile } from 'hwp2md/browser';
const fileInput = document.getElementById('file') as HTMLInputElement;
fileInput.addEventListener('change', async (e) => {
const file = (e.target as HTMLInputElement).files?.[0];
if (file) {
const markdown = await convertFromFile(file);
console.log(markdown);
}
});HWP/HWPX 파일을 Markdown으로 변환합니다.
hwp2md convert [OPTIONS] INPUT_FILE [OUTPUT_FILE]인자:
INPUT_FILE- HWP 또는 HWPX 파일 경로 (확장자로 자동 감지)OUTPUT_FILE- 출력 Markdown 파일 (생략 시 입력 파일명에 .md 확장자)
옵션:
--table-line-breaks [space|br]- 표 셀 내 줄바꿈 처리 방식 (기본값:space)space- LLM 최적화: 공백으로 연결하여 깔끔한 텍스트 생성br- 가독성 우선:<br>태그로 시각적 구분
HWP/HWPX 파일 정보를 표시합니다.
hwp2md info INPUT_FILE| 2,000만원까지 3,000만원까지 5,000만원까지 | 3.79 3.07 2.14 |- LLM 파싱에 적합한 깔끔한 텍스트
- 패턴 매칭 친화적
- 토큰 수 절감
| 2,000만원까지<br>3,000만원까지<br>5,000만원까지 | 3.79<br>3.07<br>2.14 |- Markdown 렌더러에서 시각적 구분
- 원본 레이아웃 보존
- 사람이 읽기에 적합
병합된 셀은 내용을 모든 병합 셀에 반복하는 전략을 사용합니다:
원본 표:
┌─────────────┬──────┐
│ 카테고리 │ 값 │
├─────────────┼──────┤
│ │ 100 │
│ 병합셀 ├──────┤
│ │ 200 │
└─────────────┴──────┘
Markdown 출력:
| 카테고리 | 값 |
| 병합셀 | 100 |
| 병합셀 | 200 |LLM이 표 의미를 이해하지 않아도 데이터를 정확히 연결할 수 있습니다.
HWP 파일 읽기를 위한 컨텍스트 매니저입니다.
from hwp2md.parser import HWPFile
with HWPFile('input.hwp') as hwp:
info = hwp.get_file_info()
section_count = hwp.get_section_count()
section_data = hwp.read_section(0)메서드:
get_file_info() -> dict- 파일 메타데이터get_section_count() -> int- 구역 수read_section(index: int) -> bytes- 구역 원시 데이터
HWP 또는 HWPX 파일을 Markdown 문자열로 변환합니다.
from hwp2md.converter import convert_hwp_to_markdown, convert_hwpx_to_markdown
# HWP
markdown = convert_hwp_to_markdown(hwp, table_line_break_style='space')
# HWPX
markdown = convert_hwpx_to_markdown(hwpx, table_line_break_style='space')파라미터:
hwp(HWPFile) /hwpx(HWPXFile) - 열린 파일 객체table_line_break_style(str) - 줄바꿈 처리:'space'(기본값) 또는'br'
반환값:
str- Markdown 형식 텍스트
HWPX (ZIP+XML) 파일 읽기를 위한 컨텍스트 매니저입니다.
from hwp2md.hwpx_parser import HWPXFile
with HWPXFile('input.hwpx') as hwpx:
info = hwpx.get_file_info()
section_count = hwpx.get_section_count()
section_xml = hwpx.get_section_xml(0)메서드:
get_file_info() -> dict- 파일 메타데이터 (포맷, 버전, 섹션 수)get_section_count() -> int- 구역 수get_section_xml(index: int) -> ET.Element- 구역 XML 루트 엘리먼트list_contents() -> list[str]- ZIP 내용물 목록
# 저장소 클론
git clone https://github.com/jc-kim/hwp2md.git
cd hwp2md
# 의존성 설치 (pnpm 모노레포)
pnpm install
# JavaScript 패키지 빌드
cd packages/js
pnpm build
# Python 테스트 실행
cd packages/python
uv run pytesthwp2md/
├── packages/
│ ├── python/ # Python 구현체
│ │ ├── src/hwp2md/
│ │ │ ├── __init__.py
│ │ │ ├── cli.py # CLI 인터페이스
│ │ │ ├── parser.py # HWP 5.0 파일 파서
│ │ │ ├── hwpx_parser.py # HWPX (ZIP+XML) 파서
│ │ │ ├── record.py # 레코드 구조
│ │ │ ├── paragraph.py # 문단 추출
│ │ │ ├── table.py # 표 추출
│ │ │ └── converter.py # Markdown 변환
│ │ └── pyproject.toml
│ │
│ └── js/ # JavaScript/TypeScript 구현체
│ ├── src/
│ │ ├── index.ts # 메인 내보내기
│ │ ├── parser.ts # HWP 5.0 파일 파서
│ │ ├── hwpx_parser.ts # HWPX (ZIP+XML) 파서
│ │ ├── record.ts # 레코드 리더
│ │ ├── paragraph.ts # 문단 파서
│ │ ├── table.ts # 표 파서
│ │ ├── converter.ts # Markdown 변환
│ │ ├── types.ts # TypeScript 타입
│ │ ├── browser.ts # 브라우저 진입점
│ │ ├── cli/index.ts # CLI
│ │ └── utils/ # 유틸리티
│ ├── dist/ # 빌드 결과물
│ └── package.json
│
├── examples/ # 예제 HWP 파일
├── docs/ # 문서
├── pnpm-workspace.yaml # 모노레포 설정
├── package.json # 루트 package.json
└── tsconfig.base.json # 공유 TypeScript 설정
기여를 환영합니다! Pull Request를 자유롭게 제출해 주세요.
- 저장소를 포크합니다
- 기능 브랜치를 생성합니다 (
git checkout -b feature/amazing-feature) - 변경사항을 커밋합니다 (
git commit -m 'Add amazing feature') - 브랜치에 푸시합니다 (
git push origin feature/amazing-feature) - Pull Request를 생성합니다
HWP2MD는 LLM 가독성을 최우선 목표로 설계되었습니다:
- 깔끔한 텍스트: 최적의 토크나이징을 위한 최소한의 포맷팅
- 의미 구조 보존: 시각적 레이아웃보다 문서의 의미 보존
- 패턴 친화적: 패턴 매칭과 데이터 추출에 적합한 출력
- 정보 손실 없음: 모든 텍스트를 잘림 없이 보존
다음 용도에 적합합니다:
- RAG (Retrieval-Augmented Generation) 파이프라인
- 문서 분석 및 요약
- 지식 베이스 구축
- 텍스트 마이닝 및 NLP 작업
- HWP 5.0 및 HWPX 지원 - 이전 HWP 형식(HWP 3.0, HWP 97, HWP 2002 등)은 지원하지 않음
- 레거시 HWP 파일은 한컴오피스에서 HWP 5.0 또는 HWPX로 변환 가능
- 레거시 형식 감지 시 오류 발생
- 텍스트 & 표 - 현재 텍스트와 표만 추출하며, 이미지 및 복잡한 개체는 건너뜀
- 한국어 중심 - 한국어 문서에 최적화 (UTF-16LE 인코딩)
- 기본 서식만 - 글꼴, 색상, 고급 스타일은 보존하지 않음
MIT License - 자세한 내용은 LICENSE 파일을 참고하세요.