Skip to content

airmang/python-hwpx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

118 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

python-hwpx

ν•œκΈ€ 없이 HWPX λ¬Έμ„œλ₯Ό Python으둜 읽고, νŽΈμ§‘ν•˜κ³ , μƒμ„±ν•˜κ³ , κ²€μ¦ν•©λ‹ˆλ‹€.

PyPI Python License Docs


🧩 HWPX Stack (3μ’…)

계측 레포 μ—­ν• 
πŸ“¦ 라이브러리 python-hwpx 순수 파이썬 HWPX νŒŒμ‹±Β·νŽΈμ§‘Β·μƒμ„± μ½”μ–΄
πŸ”Œ MCP μ„œλ²„ hwpx-mcp-server MCP ν΄λΌμ΄μ–ΈνŠΈ(Claude Desktop, VS Code λ“±)μ—μ„œ HWPX μ‘°μž‘
🎯 μ—μ΄μ „νŠΈ μŠ€ν‚¬ hwpx-skill μ—μ΄μ „νŠΈκ°€ HWPXλ₯Ό λ°”λ‘œ μ“°κ²Œ ν•΄μ£ΌλŠ” 곡식 μ˜¨λ³΄λ”© μŠ€ν‚¬

μ™œ python-hwpx인가

  • ν•œμ»΄μ˜€ν”ΌμŠ€ μ„€μΉ˜ λΆˆν•„μš” β€” 순수 파이썬으둜 μ–΄λ””μ„œλ‚˜ λ™μž‘
  • XML-first μ›Œν¬ν”Œλ‘œ β€” μŠ€ν‚€λ§ˆ 검증·unpack/packκΉŒμ§€ 포함
  • μ—μ΄μ „νŠΈΒ·μžλ™ν™” μΉœν™” β€” MCP μ„œλ²„Β·Skill이 같은 μŠ€νƒ μœ„μ—μ„œ 직결

λŒ€ν•­ 라이브러리 비ꡐ

ν•­λͺ© python-hwpx pyhwp(x) λ₯˜ ole+bin μˆ˜μž‘μ—…
HWPX Open XML 지원 βœ… ⚠️ λΆ€λΆ„ ❌
ν•œμ»΄μ˜€ν”ΌμŠ€ μ„€μΉ˜ λΆˆν•„μš” βœ… βœ… βœ…
νŽΈμ§‘/생성 API βœ… ❌ λŒ€λΆ€λΆ„ 읽기 ❌
μŠ€ν‚€λ§ˆ 검증 βœ… ❌ ❌
AI μ—μ΄μ „νŠΈ 연동 (MCP) βœ… (hwpx-mcp-server) ❌ ❌

⚑ 30초 μ•ˆμ— κ°€μΉ˜ 확인

1. κΈ°μ‘΄ λ¬Έμ„œλ₯Ό μ—΄κ³  μˆ˜μ •

from hwpx import HwpxDocument

document = HwpxDocument.open("λ³΄κ³ μ„œ.hwpx")
document.add_paragraph("μžλ™ν™”λ‘œ μΆ”κ°€ν•œ λ¬Έλ‹¨μž…λ‹ˆλ‹€.")
document.save_to_path("λ³΄κ³ μ„œ-μˆ˜μ •.hwpx")

2. μ–‘μ‹ν˜• ν‘œλ₯Ό μ½”λ“œλ‘œ μ±„μš°κΈ°

from hwpx import HwpxDocument

doc = HwpxDocument.open("μ‹ μ²­μ„œ.hwpx")
result = doc.fill_by_path({
    "μ„±λͺ… > right": "홍길동",
    "μ†Œμ† > right": "ν”Œλž«νΌνŒ€",
})
doc.save_to_path("μ‹ μ²­μ„œ-μž‘μ„±μ™„λ£Œ.hwpx")

print(result["applied_count"], result["failed_count"])

3. ν…μŠ€νŠΈ μΆ”μΆœκ³Ό ꡬ쑰 검증

from hwpx import HwpxDocument

text = HwpxDocument.open("λ³΄κ³ μ„œ.hwpx").export_markdown()
print(text[:500])
hwpx-validate-package λ³΄κ³ μ„œ.hwpx
hwpx-analyze-template λ³΄κ³ μ„œ.hwpx

μ²˜μŒμ—λŠ” open/new -> edit/extract -> save_to_path νλ¦„λ§Œ 작으면 λœλ‹€. νŒ¨ν‚€μ§€ ꡬ쑰, XML 파트, ν…œν”Œλ¦Ώ νšŒκ·€ 점검은 ν•„μš”ν•  λ•Œλ§Œ ν™•μž₯ν•˜λ©΄ λœλ‹€.

μ–΄λ””λΆ€ν„° 읽으면 λ˜λ‚˜

ν•„μš”ν•œ μž‘μ—…λΆ€ν„° λ°”λ‘œ λ“€μ–΄κ°€λ©΄ λœλ‹€.

  • 첫 νŒŒμΌμ„ μ—΄κ³  μ €μž₯ν•˜λŠ” μ΅œμ†Œ 경둜 β†’ docs/quickstart.md
  • 문단, ν‘œ, λ©”λͺ¨, μ„Ήμ…˜ νŽΈμ§‘ νŒ¨ν„΄ β†’ docs/usage.md
  • ν…μŠ€νŠΈ μΆ”μΆœ, ꡬ쑰 쑰회, 검증/νŒ¨ν‚€μ§€ μž‘μ—… β†’ docs/usage.md
  • μ‹€ν–‰ κ°€λŠ₯ν•œ 예제 λͺ¨μŒ β†’ docs/examples.md
  • νŒ¨ν‚€μ§€ ꡬ쑰와 μŠ€ν‚€λ§ˆ 심화 β†’ docs/schema-overview.md
  • μ„€μΉ˜ 검증과 개발 ν™˜κ²½ 확인 β†’ docs/installation.md

examples ν•˜μ΄λΌμ΄νŠΈ

build_release_checklist.py
λ©”λͺ¨μ™€ μŠ€νƒ€μΌ νŽΈμ§‘μ΄ ν¬ν•¨λœ 릴리슀 체크리슀트용 HWPXλ₯Ό μƒμ„±ν•œλ‹€.
extract_text.py
λ³Έλ¬Έκ³Ό 쀑첩 객체 ν…μŠ€νŠΈλ₯Ό CLI둜 λΉ λ₯΄κ²Œ μΆ”μΆœν•œλ‹€.
find_objects.py
νƒœκ·ΈΒ·μ†μ„± κΈ°μ€€μœΌλ‘œ OWPML XML λ…Έλ“œλ₯Ό μΆ”μ ν•œλ‹€.

Quick Start

μƒˆ λ¬Έμ„œλ₯Ό λ°”λ‘œ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ μ΄λ ‡κ²Œ μ‹œμž‘ν•˜λ©΄ λœλ‹€.

from hwpx import HwpxDocument

document = HwpxDocument.new()
document.add_paragraph("python-hwpx둜 λ§Œλ“  μƒˆ λ¬Έμ„œ")
document.save_to_path("μƒˆλ¬Έμ„œ.hwpx")

πŸ’‘ μ»¨ν…μŠ€νŠΈ λ§€λ‹ˆμ €λ„ μ§€μ›ν•©λ‹ˆλ‹€:

with HwpxDocument.open("λ³΄κ³ μ„œ.hwpx") as doc:
    doc.add_paragraph("μžλ™μœΌλ‘œ λ¦¬μ†ŒμŠ€κ°€ μ •λ¦¬λ©λ‹ˆλ‹€.")
    doc.save_to_path("κ²°κ³Όλ¬Ό.hwpx")

ν‘œ, λ©”λͺ¨, ν…μŠ€νŠΈ μΆ”μΆœ, 검증, νŒ¨ν‚€μ§€/XML μ‹¬ν™”λŠ” docs/quickstart.md와 docs/usage.mdμ—μ„œ λ°”λ‘œ 이어진닀.

pyhwpx / pyhwp와 λ‹€λ₯Έ 점?

python-hwpx pyhwpx pyhwp
λŒ€μƒ 포맷 .hwpx (OWPML/OPC) .hwpx .hwp (v5 λ°”μ΄λ„ˆλ¦¬)
ν•œ/κΈ€ μ„€μΉ˜ λΆˆν•„μš” ν•„μš” (Windows COM) λΆˆν•„μš”
크둜슀 ν”Œλž«νΌ βœ… Linux / macOS / Windows / CI ❌ Windows μ „μš© βœ…
방식 직접 XML νŒŒμ‹± COM μžλ™ν™” OLE νŒŒμ‹±

🌍 크둜슀 ν”Œλž«νΌ 지원

HWPX νŒŒμΌμ€ ZIP + XML κ΅¬μ‘°μ΄λ―€λ‘œ, ν•œ/κΈ€ ν”„λ‘œκ·Έλž¨ 없이 Python만으둜 읽고 νŽΈμ§‘ν•˜λŠ” μ›Œν¬ν”Œλ‘œλ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν”Œλž«νΌ 읽기 μ“°κΈ° λΉ„κ³ 
βœ… Windows βœ… βœ… ν•œμ»΄μ˜€ν”ΌμŠ€
βœ… macOS βœ… βœ… ν•œμ»΄μ˜€ν”ΌμŠ€ Mac
βœ… Linux βœ… βœ… ν•œμ»΄μ˜€ν”ΌμŠ€ Linux
βœ… CI/CD βœ… βœ… Docker, GitHub Actions λ“±

μ£Όμš” κΈ°λŠ₯ ν•œλˆˆμ— 보기

μΉ΄ν…Œκ³ λ¦¬ κΈ°λŠ₯ μ„€λͺ…
πŸ“„ λ¬Έμ„œ I/O μ—΄κΈ°/μ €μž₯/생성 파일, λ°”μ΄νŠΈ, 슀트림 μž…μΆœλ ₯ Β· μ›μžμ  μ €μž₯ Β· ZIP 무결성 검증
πŸ“ 단락 μΆ”κ°€/μ‚­μ œ/νŽΈμ§‘/μ„œμ‹ ν…μŠ€νŠΈ μ„€μ •, 단락 μ‚­μ œ(remove_paragraph), μŠ€νƒ€μΌ μ°Έμ‘°
✏️ Run ν…μŠ€νŠΈ 쑰각 μΆ”κ°€, ꡐ체, λ³Όλ“œ/이타릭/밑쀄/색상 μ„œμ‹
πŸ“Š ν‘œ(Table) 생성/νŽΈμ§‘/병합 NΓ—M ν‘œ 생성, μ…€ ν…μŠ€νŠΈ, μ…€ 병합/λΆ„ν• , 쀑첩 ν…Œμ΄λΈ”
🧭 ν‘œ μžλ™ν™” 탐색/μ±„μš°κΈ° ν…Œμ΄λΈ” λ§΅, 라벨 기반 μ…€ 탐색, 경둜 기반 배치 μ±„μš°κΈ°
πŸ“‘ μ„Ήμ…˜ μΆ”κ°€/μ‚­μ œ add_section(after=), remove_section(), manifest μžλ™ 관리
πŸ–ΌοΈ 이미지 μž„λ² λ“œ/μ‚­μ œ λ°”μ΄λ„ˆλ¦¬ 데이터 관리, manifest μžλ™ 등둝
✏️ λ„ν˜• μ„ /μ‚¬κ°ν˜•/타원 OWPML λͺ…μ„Έ μ€€μˆ˜ λ„ν˜• μ‚½μž…
πŸ“‘ 머리글/λ°”λ‹₯κΈ€ μ„€μ •/제거 ν™€μˆ˜/짝수/μ–‘μͺ½ νŽ˜μ΄μ§€ ꡬ뢄
πŸ’¬ λ©”λͺ¨ μΆ”κ°€/μ‚­μ œ 액컀 기반 λ©”λͺ¨, λ©”λͺ¨ 셰이프 μ°Έμ‘°
πŸ“Œ 각주/λ―Έμ£Ό μΆ”κ°€ ν…μŠ€νŠΈ μ ‘κ·Ό
πŸ”— 뢁마크/ν•˜μ΄νΌλ§ν¬ μ‚½μž…/쑰회 URL 링크, λ‚΄λΆ€ 뢁마크
πŸ“° 닀단 νŽΈμ§‘ 컬럼 μ •μ˜ 닀단 λ ˆμ΄μ•„μ›ƒ μ œμ–΄
πŸ” ν…μŠ€νŠΈ μΆ”μΆœ νŒŒμ΄ν”„λΌμΈ μ„Ήμ…˜/단락 순회, 주석 λ Œλ”λ§, 쀑첩 객체 μ œμ–΄
πŸ”Ž 객체 검색 νƒœκ·Έ/속성/XPath νŠΉμ • μš”μ†Œ 탐색, 주석 μ΄ν„°λ ˆμ΄ν„°
🎨 μŠ€νƒ€μΌ μΉ˜ν™˜ μ„œμ‹ 기반 ν•„ν„° 색상/밑쀄/charPrIDRef 기반 Run 검색 및 ꡐ체
πŸ“€ 내보내기 ν…μŠ€νŠΈ/HTML/Markdown λ¬Έμ„œ λ³€ν™˜ 좜λ ₯
βœ… μœ νš¨μ„± 검사 XSD + νŒ¨ν‚€μ§€ ꡬ쑰 CLI(hwpx-validate, hwpx-validate-package) 및 API
🧰 μž‘μ—… 도ꡬ unpack/pack/뢄석/비ꡐ pack-ready μž‘μ—… 디렉터리 μΆ”μΆœκ³Ό μž¬κ΅¬μ„± 점검
πŸ—οΈ μ €μˆ˜μ€€ XML λ°μ΄ν„°ν΄λž˜μŠ€ λ§€ν•‘ OWPML μŠ€ν‚€λ§ˆ ↔ Python 객체 직접 μ‘°μž‘
πŸ”„ λ„€μž„μŠ€νŽ˜μ΄μŠ€ ν˜Έν™˜ μžλ™ μ •κ·œν™” HWPML 2016 β†’ 2011 μžλ™ λ³€ν™˜

κΈ°λŠ₯ 상세

πŸ“„ λ¬Έμ„œ νŽΈμ§‘

문단, ν‘œ, λ©”λͺ¨, 머리글/λ°”λ‹₯글을 Python 객체둜 λ‹€λ£Ήλ‹ˆλ‹€.

# 단락 μΆ”κ°€Β·μ‚­μ œ
doc.add_paragraph("μƒˆ 문단")
doc.remove_paragraph(doc.paragraphs[-1])   # λ§ˆμ§€λ§‰ 단락 μ‚­μ œ

# μ„Ήμ…˜ μΆ”κ°€Β·μ‚­μ œ
new_sec = doc.add_section()          # λ¬Έμ„œ 끝에 μ„Ήμ…˜ μΆ”κ°€
new_sec.add_paragraph("두 번째 μ„Ήμ…˜ λ‚΄μš©")
doc.remove_section(1)                # 인덱슀둜 μ„Ήμ…˜ μ‚­μ œ

# 머리글·바λ‹₯κΈ€
doc.set_header_text("κΈ°λ°€ λ¬Έμ„œ", page_type="BOTH")
doc.set_footer_text("1 / 10", page_type="BOTH")

# ν‘œ μ…€ 병합·뢄할
table.merge_cells(0, 0, 1, 1)   # (0,0)~(1,1) 병합
table.set_cell_text(0, 0, "λ³‘ν•©λœ μ…€", logical=True, split_merged=True)

# μ–‘μ‹ν˜• ν‘œ μžλ™ μ±„μš°κΈ°
form = doc.add_table(2, 2)
form.cell(0, 0).text = "μ„±λͺ…:"
form.cell(1, 0).text = "μ†Œμ†"

doc.find_cell_by_label("μ„±λͺ…")    # {"matches": [...], "count": 1}
doc.fill_by_path({
    "μ„±λͺ… > right": "홍길동",
    "μ†Œμ† > right": "ν”Œλž«νΌνŒ€",
})

πŸ” ν…μŠ€νŠΈ μΆ”μΆœ & 검색

from hwpx import TextExtractor, ObjectFinder

# ν…μŠ€νŠΈ μΆ”μΆœ
with TextExtractor("λ¬Έμ„œ.hwpx") as extractor:
    for section in extractor.iter_sections():
        for para in extractor.iter_paragraphs(section):
            print(para.text())

# νŠΉμ • 객체 탐색
for obj in ObjectFinder("λ¬Έμ„œ.hwpx").find_all(tag="tbl"):
    print(obj.tag, obj.path)

hp:tabκ³Ό ctrl id="tab"은 νƒ­ 문자(\t)둜 λ³΄μ‘΄λ©λ‹ˆλ‹€. λ”°λΌμ„œ Paragraph.text, TextExtractor, export_text()/export_html()/export_markdown() κ²½λ‘œμ—μ„œ 같은 νƒ­ 의미λ₯Ό μœ μ§€ν•œ 채 roundtrip ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•„μš”ν•˜λ©΄ preserve_breaks=False둜 μ€„λ°”κΏˆ/탭을 곡백 기반으둜 평탄화할 수 μžˆμŠ΅λ‹ˆλ‹€.

🎨 μŠ€νƒ€μΌ 기반 ν…μŠ€νŠΈ μΉ˜ν™˜

μ„œμ‹(색상, 밑쀄, charPrIDRef)으둜 λŸ°μ„ 필터링해 μ„ νƒμ μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€.

# 빨간색 ν…μŠ€νŠΈλ§Œ μ°Ύμ•„μ„œ μΉ˜ν™˜
doc.replace_text_in_runs(
    "μž„μ‹œ", "ν™•μ •",
    text_color="#FF0000",
)

# νŠΉμ • μ„œμ‹μ˜ 런 검색
runs = doc.find_runs_by_style(underline_type="SINGLE")

πŸ“€ 내보내기

# ν…μŠ€νŠΈ, HTML, Markdown으둜 λ³€ν™˜
text = doc.export_text()
html = doc.export_html()
md   = doc.export_markdown()

πŸ—οΈ μ €μˆ˜μ€€ XML μ œμ–΄

OWPML μŠ€ν‚€λ§ˆμ— λ§€ν•‘λœ λ°μ΄ν„°ν΄λž˜μŠ€λ‘œ XML ꡬ쑰λ₯Ό 직접 λ‹€λ£Ήλ‹ˆλ‹€.

# 헀더 μ°Έμ‘° λͺ©λ‘
doc.border_fills    # ν…Œλ‘λ¦¬ μ±„μš°κΈ°
doc.bullets         # κΈ€λ¨Έλ¦¬ν‘œ
doc.styles          # μŠ€νƒ€μΌ
doc.track_changes   # λ³€κ²½ 좔적

# 바탕μͺ½Β·μ΄λ ₯·버전 파트
doc.master_pages
doc.histories
doc.version

μ•„ν‚€ν…μ²˜

python-hwpx
β”œβ”€β”€ hwpx.document        # κ³ μˆ˜μ€€ νŽΈμ§‘ API (HwpxDocument)
β”œβ”€β”€ hwpx.opc             # OPC μ»¨ν…Œμ΄λ„ˆ 읽기/μ“°κΈ° (μ›μžμ  μ €μž₯, ZIP 무결성 검증)
β”œβ”€β”€ hwpx.oxml            # OWPML XML ↔ λ°μ΄ν„°ν΄λž˜μŠ€ λ§€ν•‘
β”‚   β”œβ”€β”€ document.py      #   μ„Ήμ…˜, 문단, ν‘œ, 런, λ©”λͺ¨, λ„ν˜•, λ…ΈνŠΈ
β”‚   β”œβ”€β”€ header.py        #   헀더 μ°Έμ‘° λͺ©λ‘ (μŠ€νƒ€μΌ, κΈ€λ¨Έλ¦¬ν‘œ, 변경좔적 λ“±)
β”‚   β”œβ”€β”€ body.py          #   νƒ€μž…μ΄ μ§€μ •λœ λ³Έλ¬Έ λͺ¨λΈ
β”‚   └── common.py        #   λ²”μš© XML ↔ λ°μ΄ν„°ν΄λž˜μŠ€
β”œβ”€β”€ hwpx.tools
β”‚   β”œβ”€β”€ archive_cli      #   unpack/pack CLI 및 μž¬νŒ¨ν‚Ή 메타데이터
β”‚   β”œβ”€β”€ text_extractor   #   ν…μŠ€νŠΈ μΆ”μΆœ νŒŒμ΄ν”„λΌμΈ
β”‚   β”œβ”€β”€ text_extract_cli #   ν…μŠ€νŠΈ μΆ”μΆœ CLI
β”‚   β”œβ”€β”€ object_finder    #   객체 탐색 μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ exporter         #   ν…μŠ€νŠΈ/HTML/Markdown 내보내기
β”‚   β”œβ”€β”€ validator        #   μŠ€ν‚€λ§ˆ μœ νš¨μ„± 검사 (hwpx-validate CLI)
β”‚   β”œβ”€β”€ package_validator#   ZIP/OPC/HWPX ꡬ쑰 검사
β”‚   β”œβ”€β”€ page_guard       #   ꡬ쑰 λ³€ν™” μ§•ν›„ 점검
β”‚   └── template_analyzer#   레퍼런슀 λ¬Έμ„œ 뢄석/μΆ”μΆœ
└── hwpx.templates       # λ‚΄μž₯ 빈 λ¬Έμ„œ ν…œν”Œλ¦Ώ

λ¬Έμ„œ

πŸ“– 전체 λ¬Έμ„œ Sphinx 기반 API 레퍼런슀, μ‚¬μš© κ°€μ΄λ“œ, FAQ
πŸš€ λΉ λ₯Έ μ‹œμž‘ 5λΆ„ μ•ˆμ— HWPX λ¬Έμ„œ 닀루기
πŸ“š μ‚¬μš© κ°€μ΄λ“œ 50+ μ‹€μ „ μ‚¬μš© νŒ¨ν„΄
πŸ”§ API 레퍼런슀 ν΄λž˜μŠ€Β·λ©”μ„œλ“œ 상세 λͺ…μ„Έ
πŸ“ μŠ€ν‚€λ§ˆ κ°œμš” OWPML μŠ€ν‚€λ§ˆ ꡬ쑰 μ„€λͺ…
πŸ§ͺ μŠ€νƒ 톡합 자료 fixture, smoke, validation, compatibility 운영 자료

지원 포맷

포맷 ν™•μž₯자 읽기 μ“°κΈ°
HWPX .hwpx βœ… βœ…
HWP .hwp ❌ ❌

Note: HWP(v5 λ°”μ΄λ„ˆλ¦¬) νŒŒμΌμ€ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•œμ»΄μ˜€ν”ΌμŠ€μ—μ„œ HWPX둜 λ³€ν™˜ ν›„ μ‚¬μš©ν•˜μ„Έμš”.

μš”κ΅¬ 사항

  • Python 3.10+
  • lxml β‰₯ 4.9

μ•Œλ €μ§„ μ œμ•½

  • add_shape() / add_control()은 ν•œ/글이 μš”κ΅¬ν•˜λŠ” λͺ¨λ“  ν•˜μœ„ μš”μ†Œλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ³΅μž‘ν•œ 개체λ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” ν•œ/κΈ€μ—μ„œ μ—΄μ–΄ 검증해 μ£Όμ„Έμš”.
  • 이미지 μ‚½μž… μ‹œ λ°”μ΄λ„ˆλ¦¬ μž„λ² λ“œλŠ” μ§€μ›ν•˜μ§€λ§Œ, <hp:pic> μš”μ†Œμ˜ μ™„μ „ν•œ μžλ™ 생성은 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ•”ν˜Έν™”λœ HWPX 파일의 μ•”λ³΅ν˜Έν™”λŠ” μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κΈ°μ—¬ν•˜κΈ°

버그 리포트, κΈ°λŠ₯ μ œμ•ˆ, PR λͺ¨λ‘ ν™˜μ˜ν•©λ‹ˆλ‹€. 개발 ν™˜κ²½ μ„€μ •κ³Ό ν…ŒμŠ€νŠΈ 방법은 CONTRIBUTING.mdλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

git clone https://github.com/airmang/python-hwpx.git
cd python-hwpx
pip install -e ".[dev]"
pytest

λ¨Έμ§€λœ κΈ°μ—¬μž λͺ©λ‘μ€ CONTRIBUTORS.mdμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

License

Apache License 2.0. See LICENSE and NOTICE.


Maintainer

Primary maintainer/contact: κ³ κ·œν˜„ β€” 광ꡐ고등학ꡐ 정보·컴퓨터 ꡐ사

About

Pure Python HWPX automation: read, edit, generate, and validate documents without Hancom Office.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages