1313
1414---
1515
16- ` python-hwpx ` 는 한컴오피스의 [ HWPX 포맷] ( https://www.hancom.com/ ) 을 순수 Python으로 다루는 라이브러리입니다 .
16+ ` python-hwpx ` 는 한컴오피스의 [ HWPX 포맷] ( https://www.hancom.com/ ) 을 순수 Python으로 다루는 라이브러리이자 CLI 도구 모음입니다 .
1717한/글 설치 없이, OS에 관계없이 HWPX 문서의 구조를 파싱하고 콘텐츠를 조작할 수 있습니다.
18+ 문서 편집 API뿐 아니라 스키마/패키지 검증, unpack/pack, 템플릿 분석 같은 XML-first 워크플로도 함께 제공합니다.
1819
1920> ** pyhwpx / pyhwp와 다른 점?**
2021> | | python-hwpx | pyhwpx | pyhwp |
2627
2728## 🌍 크로스 플랫폼 지원
2829
29- HWPX 파일은 ** ZIP + XML** 구조이므로, 한/글 프로그램 없이 Python만으로 완벽하게 읽고 쓸 수 있습니다.
30+ HWPX 파일은 ** ZIP + XML** 구조이므로, 한/글 프로그램 없이 Python만으로 읽고 편집하는 워크플로를 구성할 수 있습니다.
3031
3132| 플랫폼 | 읽기 | 쓰기 | 비고 |
3233| --------| ------| ------| ------|
@@ -48,24 +49,23 @@ pip install python-hwpx
4849``` python
4950from hwpx import HwpxDocument
5051
51- # 기존 문서 열기
52- doc = HwpxDocument.open(" 보고서.hwpx" )
53-
5452# 빈 문서 새로 만들기
5553doc = HwpxDocument.new()
5654
55+ # 기존 문서를 수정하려면:
56+ # doc = HwpxDocument.open("보고서.hwpx")
57+
5758# 문단 추가
58- doc.add_paragraph(" python-hwpx로 생성한 문단입니다." )
59+ paragraph = doc.add_paragraph(" python-hwpx로 생성한 문단입니다." )
5960
6061# 표 추가 (2×3)
6162table = doc.add_table(rows = 2 , cols = 3 )
6263table.set_cell_text(0 , 0 , " 이름" )
6364table.set_cell_text(0 , 1 , " 부서" )
6465table.set_cell_text(0 , 2 , " 연락처" )
6566
66- # 메모 추가 (한/글에서 바로 표시)
67- paragraph = doc.paragraphs[0 ]
68- doc.add_memo_with_anchor(" 검토 필요" , paragraph = paragraph)
67+ # 메모 추가 (기본 템플릿의 memo shape 사용)
68+ doc.add_memo_with_anchor(" 검토 필요" , paragraph = paragraph, memo_shape_id_ref = " 0" )
6969
7070# 저장
7171doc.save_to_path(" 결과물.hwpx" )
@@ -99,15 +99,15 @@ doc.save_to_path("결과물.hwpx")
9999| 🎨 ** 스타일 치환** | 서식 기반 필터 | 색상/ 밑줄/ charPrIDRef 기반 Run 검색 및 교체 |
100100| 📤 ** 내보내기** | 텍스트/ HTML / Markdown | 문서 변환 출력 |
101101| ✅ ** 유효성 검사** | XSD + 패키지 구조 | CLI(`hwpx- validate` , `hwpx- validate- package` ) 및 API |
102- | 🧰 ** 작업 도구** | unpack/ pack/ 분석/ 비교 | 패키지 점검과 재구성 작업 보조 |
102+ | 🧰 ** 작업 도구** | unpack/ pack/ 분석/ 비교 | pack - ready 작업 디렉터리 추출과 재구성 점검 |
103103| 🏗️ ** 저수준 XML ** | 데이터클래스 매핑 | OWPML 스키마 ↔ Python 객체 직접 조작 |
104104| 🔄 ** 네임스페이스 호환** | 자동 정규화 | HWPML 2016 → 2011 자동 변환 |
105105
106106# # 기능 상세
107107
108108# ## 📄 문서 편집
109109
110- 문단, 표, 메모, 머리말 / 꼬리말을 Python 객체로 다룹니다.
110+ 문단, 표, 메모, 머리글 / 바닥글을 Python 객체로 다룹니다.
111111
112112```python
113113# 단락 추가·삭제
@@ -119,9 +119,9 @@ new_sec = doc.add_section() # 문서 끝에 섹션 추가
119119new_sec.add_paragraph(" 두 번째 섹션 내용" )
120120doc.remove_section(1 ) # 인덱스로 섹션 삭제
121121
122- # 머리말·꼬리말
122+ # 머리글·바닥글
123123doc.set_header_text(" 기밀 문서" , page_type = " BOTH" )
124- doc.set_footer_text(" — 1 — " , page_type = " BOTH" )
124+ doc.set_footer_text(" 1 / 10 " , page_type = " BOTH" )
125125
126126# 표 셀 병합·분할
127127table.merge_cells(0 , 0 , 1 , 1 ) # (0,0)~(1,1) 병합
@@ -134,13 +134,14 @@ table.set_cell_text(0, 0, "병합된 셀", logical=True, split_merged=True)
134134from hwpx import TextExtractor, ObjectFinder
135135
136136# 텍스트 추출
137- for section in TextExtractor(" 문서.hwpx" ):
138- for para in section.paragraphs:
139- print (para.text)
137+ with TextExtractor(" 문서.hwpx" ) as extractor:
138+ for section in extractor.iter_sections():
139+ for para in extractor.iter_paragraphs(section):
140+ print (para.text())
140141
141142# 특정 객체 탐색
142- for obj in ObjectFinder(" 문서.hwpx" ).find( " tbl" ):
143- print (obj.tag, obj.attributes )
143+ for obj in ObjectFinder(" 문서.hwpx" ).find_all( tag = " tbl" ):
144+ print (obj.tag, obj.path )
144145```
145146
146147### 🎨 스타일 기반 텍스트 치환
0 commit comments