<strong>한글 없이 HWPX 문서를 Python으로 읽고, 편집하고, 생성하고, 검증합니다.</strong>
<a href="https://pypi.org/project/python-hwpx/"><img src="https://img.shields.io/pypi/v/python-hwpx?color=blue&label=PyPI" alt="PyPI"></a>
<a href="https://pypi.org/project/python-hwpx/"><img src="https://img.shields.io/pypi/pyversions/python-hwpx" alt="Python"></a>
<a href="https://github.com/airmang/python-hwpx/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue" alt="License"></a>
<a href="https://airmang.github.io/python-hwpx/"><img src="https://img.shields.io/badge/docs-Sphinx-8CA1AF" alt="Docs"></a>
| 계층 | 레포 | 역할 |
|---|---|---|
| 📦 라이브러리 | python-hwpx |
순수 파이썬 HWPX 파싱·편집·생성 코어 |
| 🔌 MCP 서버 | hwpx-mcp-server |
MCP 클라이언트(Claude Desktop, VS Code 등)에서 HWPX 조작 |
| 🎯 에이전트 스킬 | hwpx-skill |
에이전트가 HWPX를 바로 쓰게 해주는 공식 온보딩 스킬 |
hwpx-mcp-server와 공식 스킬이 직결됩니다.pip install python-hwpx # Python 3.10+ · lxml ≥ 4.9
from hwpx import HwpxDocument
# 기존 문서 열기 → 편집 → 저장
doc = HwpxDocument.open("보고서.hwpx")
doc.add_paragraph("자동화로 추가한 문단입니다.")
doc.save_to_path("보고서-수정.hwpx")
# 새 문서 만들기
new = HwpxDocument.new()
new.add_paragraph("python-hwpx로 만든 새 문서")
new.save_to_path("새문서.hwpx")
💡 컨텍스트 매니저도 지원합니다 —
with블록을 벗어나면 리소스가 자동 정리됩니다:python with HwpxDocument.open("보고서.hwpx") as doc: doc.add_paragraph("자동으로 리소스가 정리됩니다.") doc.save_to_path("결과물.hwpx")
open/new → edit/extract → save_to_path 흐름만 잡으면 나머지는 필요할 때 확장하면 됩니다.
export_text() · export_html() · export_markdown()export_rich_markdown()은 인라인 서식(**굵게**·*기울임*·~~취소선~~), 중첩 표(colspan/rowspan 안전), 도형 텍스트, 이미지, 각주/미주, 하이퍼링크, 제목(#/##) 자동 감지까지 보존TextExtractor / ObjectFinder — 섹션·문단 순회, 태그·속성·XPath로 객체 탐색 (hp:tab은 \t로 보존, roundtrip 안전)doc = HwpxDocument.open("보고서.hwpx")
md = doc.export_rich_markdown(
image_dir="out/images", # BinData 이미지를 디스크에 추출
image_ref_prefix="images/", # 마크다운 내  경로 접두
detect_headings=True, # Ⅰ./1. 패턴 기반 #/## 자동
)
add_section(after=)·remove_section(), manifest 자동 관리)charPrIDRef로 Run을 필터링해 선택 교체(replace_text_in_runs·find_runs_by_style)# 빨간색 텍스트만 찾아서 치환
doc.replace_text_in_runs("임시", "확정", text_color="#FF0000")
find_cell_by_label)·경로 채우기(fill_by_path)hwpx.patch가 section XML 바이트를 splice해 손대지 않음doc = HwpxDocument.open("신청서.hwpx")
result = doc.fill_by_path({
"성명 > right": "홍길동",
"소속 > right": "플랫폼팀",
})
doc.save_to_path("신청서-작성완료.hwpx")
print(result["applied_count"], result["failed_count"])
hwpx.builder — Section/Heading/Table/Image/Header 조립형 생성 + 하드게이트 저장 리포트official_lint(항목기호 위계·"끝." 표시·붙임·날짜 lint), 결재란 프리셋advanced_generators — 사진대지(image_grid)·회의 명패·표 기반 조직도mail_merge — 템플릿+데이터 N부 대량 생성, 표 합계·평균 계산doc_diff — 문단 LCS diff·신구대조표·참조 정합 lintstyle_profile — 참조 문서 프로파일 추출·적용, 템플릿 레지스트리hwpx-validate · hwpx-validate-package, hwpx-analyze-templatevalidate_editor_open_safety — 저장/팩/리페어/빌더 출력 게이트, openSafety 증거 반환hwpx.tools.fuzz(시드 결정적 시나리오·3중 오라클) · hwpx.tools.layout_preview(페이지 박스 근사 HTML/PNG 자기검증) · opc.security(XML entity·ZIP 압축 폭탄 가드)hwpx.oxml 데이터클래스로 OWPML 스키마 ↔ Python 객체 직접 조작, HWPML 2016→2011 네임스페이스 자동 정규화hwpx-validate-package 보고서.hwpx
hwpx-analyze-template 보고서.hwpx
| python-hwpx | pyhwpx | pyhwp | |
|---|---|---|---|
| 대상 포맷 | .hwpx (OWPML/OPC) |
.hwpx |
.hwp (v5 바이너리) |
| 한/글 설치 | 불필요 | 필요 (Windows COM) | 불필요 |
| 크로스 플랫폼 | ✅ Linux / macOS / Windows / CI | ❌ Windows 전용 | ✅ |
| 편집/생성 API | ✅ | ✅ (COM) | ❌ 대부분 읽기 |
| 스키마 검증 | ✅ | ❌ | ❌ |
| AI 에이전트 연동 (MCP) | ✅ hwpx-mcp-server |
❌ | ❌ |
HWP(v5 바이너리) 파일은 지원하지 않습니다. 한컴오피스에서 HWPX로 변환 후 사용하세요.
add_shape() / add_control()은 한/글이 요구하는 모든 하위 요소를 생성하지 않습니다. 복잡한 개체 추가 시 한/글에서 열어 검증하세요.<hp:pic> 요소의 완전 자동 생성은 제공하지 않습니다.examples/ — build_release_checklist.py(메모·스타일 편집 HWPX 생성), extract_text.py(CLI 텍스트 추출), find_objects.py(OWPML 노드 추적) 등버그 리포트, 기능 제안, PR 모두 환영합니다.
git clone https://github.com/airmang/python-hwpx.git
cd python-hwpx
pip install -e ".[dev]"
pytest
Apache License 2.0. See LICENSE and NOTICE.
Primary maintainer/contact: 고규현 — 광교고등학교 정보·컴퓨터 교사
$ claude mcp add python-hwpx \
-- python -m otcore.mcp_server <graph>