File size: 7,157 Bytes
59d4c35 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | # AI๋ฅผ ์ํ HWP ๋ณํ๊ธฐ (pyhwp Python 3 Port)
> "AI๊ฐ ์ HWP ํ์ผ์ ์ธ์ํ์ง ๋ชปํฉ๋๊น?"
์ด ํ๋ก์ ํธ๋ ํ๊ตญ์ ๊ตญ์ ๊ฐ์ฌ์์ ์ด์ฌ๋ช
๋ํต๋ น์ ์ด ํ ๋ง๋ ๋ฐ์ธ์์ ์์๋์์ต๋๋ค. ๋น๋ก ์ ๋ถ๊ฐ ๊ฐ๋ฐฉํ ํฌ๋งท์ธ HWPX ๋์
์ ์ถ์งํ๊ณ ์์ง๋ง, ์ฌ์ ํ ์๋ง์ ๊ณต๊ณต ๋ฐ์ดํฐ์ ์ผ๋ฐ ์ฌ์ฉ์๋ค์ ๋ฌธ์๋ ๋ ๊ฑฐ์ HWP ํฌ๋งท(OLE ๊ธฐ๋ฐ)์ผ๋ก ์ ๊ฒจ ์์ต๋๋ค. ๋๋ค์์ ์ฌ์ฉ์๋ค์ HWP์ HWPX์ ์ฐจ์ด์กฐ์ฐจ ์ธ์ํ์ง ๋ชปํ๋ฉฐ, AI ๊ธฐ์ ์ ํํ์์ ์์ธ๋๊ณ ์์ต๋๋ค.
## ๐ ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉ์
**"ํ๊ธ(HWP) ์ค์น ์์ด, ๋ชจ๋ ํ๊ฒฝ์์ HWP๋ฅผ ์ดํดํ๋ค."**
๊ธฐ์กด์ AI๊ฐ HWP ํ์ผ์ ํ์ตํ๊ฑฐ๋ ์ธ์ํ๊ฒ ํ๋ ค๋ฉด, ๊ณ ๊ฐ์ '์๋์ํ๊ธ' ์๋ํ๋ก์ธ์๊ฐ ์ค์น๋ ์๋์ฐ ํ๊ฒฝ์์ OLE Automation์ ์ด์ฉํด ํ
์คํธ๋ฅผ ์ถ์ถํ๋ ๊ฒ์ด ์ ์ผํ ๋์์ด์์ต๋๋ค. ์ด๋ ๋ฆฌ๋
์ค ์๋ฒ, ๋งฅ(Mac), ๋ชจ๋ฐ์ผ ํ๊ฒฝ, ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ์ AI ์์ด์ ํธ(Cursor, Antigravity ๋ฑ)๊ฐ HWP ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๋ฐ ์น๋ช
์ ์ธ ์ฅ๋ฒฝ์ด์์ต๋๋ค.
๊ธฐ์กด์ `pyhwp`๋ผ๋ ํ๋ฅญํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ์ผ๋, ์ค๋ ๊ธฐ๊ฐ Python 2.7 ํ๊ฒฝ์ ๋จธ๋ฌผ๋ฌ ์์ด ํ๋์ ์ธ AI ํ์ดํ๋ผ์ธ(Python 3.10+)์ ํตํฉํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ **pyhwp๋ฅผ Python 3.11๋ก ์๋ฒฝํ๊ฒ ํฌํ
ํ๊ณ , AI๊ฐ ์ฆ์ ์ดํดํ ์ ์๋ HTML ๋ณํ ๊ธฐ๋ฅ์ ์ถ๊ฐ**ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
> **Note:** ๋ณธ๋ ์ด๋ฌํ ์ํธ์ด์ฉ์ฑ ์ง์์ HWP ํฌ๋งท์ ๋ง๋ ์ ์กฐ์ฌ(ํ๊ธ๊ณผ์ปดํจํฐ) ์ฐจ์์์ ์ง์ ์ ๊ณต๋์์ด์ผ ๋ง๋
ํ ๊ธฐ๋ฅ์
๋๋ค. ํ์ง๋ง ์ ์กฐ์ฌ์ ์ง์ ๋ถ์ฌ๋ก ์ธํด ์๋ง์ ๊ฐ๋ฐ์์ ์ฌ์ฉ์๊ฐ ๋ถํธ์ ๊ฒช์ด์์ผ๋ฉฐ, ๊ฒฐ๊ตญ ์ปค๋ฎค๋ํฐ ์ฃผ๋์ ์คํ์์ค ํ๋ก์ ํธ๊ฐ ์ด ๊ณต๋ฐฑ์ ๋ฉ์ฐ๊ฒ ๋์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ์ํฐ๊ทธ๋ํผํฐ์ ์์ด์ ํธ๋ฉ๋์ , ํด๋ก๋ ์๋ท4.5 ๋ฒ์ ์ ์ด์ฉํ์ฌ 2์๊ฐ์ ๋์ ์์
์ ํตํด ์๋ฃ ๋์์ต๋๋ค.
๊ทธ ๋งํผ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๊ฐ์ ํ ์ ์๋ ์์
์์๋ ๋ถ๊ตฌํ๊ณ 20๋
๊ฐ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง์ง ์์๋ ๊ฒ์ ๋งค์ฐ ์์ฌ์ด ์ ์ด๋ฉฐ, ์ด ํ๋ก์ ํธ์ ์๊ฐ์ ์ฃผ์ ,
๊ทธ๋ฆฌ๊ณ ์ด ํ๋ก์ ํธ๊ฐ ๊ฐ๋ฅํ ์ ์์๋ ๊ธฐ์ด๊ฐ ๋์ด์ค pyhwp ๊ฐ๋ฐ์ ์ ๋งค์ฐ ํฐ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค.
## ๐ ๏ธ ๊ธฐ์ ์ ๊ฐ์ ์ฌํญ (Why This Fork?)
์ด ํ๋ก์ ํธ๋ ๋จ์ํ ๋ฒ์ ์
๊ทธ๋ ์ด๋๊ฐ ์๋๋๋ค. "์ฃฝ์ด์๋" ์ฝ๋๋ฅผ ํ๋์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ๋์ด๋ ค๋์ต๋๋ค.
1. **Python 3.11 ์์ ์ง์**:
- `2to3` ์๋ ๋ณํ์ ๊ทธ์น์ง ์๊ณ , `metaclass`, `bytes/str` ์ฒ๋ฆฌ, `ugettext` ๋ฑ Python 2 ๊ธฐ๋ฐ์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์ ๋ฉด ๋ฆฌํฉํ ๋งํ์ต๋๋ค.
- `six` ๋ชจ๋ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ ํ๋์ ์ธ Python ๋ฌธ๋ฒ์ ์ ์ฉํ์ต๋๋ค.
2. **AI ์ต์ ํ ๋ณํ๊ธฐ (`HwpToHtmlConverter`)**:
- ๋ณต์กํ ๋ด๋ถ ๋ก์ง์ ๋ชฐ๋ผ๋ ๋จ ๋ ์ค์ ์ฝ๋๋ก HWP๋ฅผ HTML๋ก ๋ณํํ ์ ์๋ ๋ํผ(Wrapper)๋ฅผ ๊ตฌํํ์ต๋๋ค.
- ๋ณํ๋ HTML์ CSS ์คํ์ผ๊ณผ ์ด๋ฏธ์ง(`bindata`)๋ฅผ ํฌํจํ์ฌ ์๋ณธ์ ๋ ์ด์์์ ์ต๋ํ ๋ณด์กดํฉ๋๋ค. ์ด๋ VLM(Vision Language Model)์ด๋ RAG(Retrieval-Augmented Generation) ์์คํ
์ด ๋ฌธ์๋ฅผ ์๊ฐ์ /๊ตฌ์กฐ์ ์ผ๋ก ์ดํดํ๋ ๋ฐ ํฐ ๋์์ ์ค๋๋ค.
3. **ํ๋ซํผ ๋
๋ฆฝ์ฑ**:
- ์๋์ฐ๋ฟ๋ง ์๋๋ผ **Linux, macOS, Mobile** ๋ฑ Python์ด ๋๋ ๋ชจ๋ ํ๊ฒฝ์์ ์๋ํฉ๋๋ค.
- ๋ฌด๊ฑฐ์ด ํ๊ธ ์๋ํ๋ก์ธ์ ์ค์น๊ฐ **์ ํ ํ์ ์์ต๋๋ค**.
## ๐ฆ ์ค์น ๋ฐฉ๋ฒ
# PyPI์์ ์ค์น (์ถ์ฒ)
pip install pyhwp2
# ์์ค ์ฝ๋์์ ์ค์น (๊ฐ๋ฐ ๋ฒ์ )
git clone https://github.com/your-repo/pyhwp-py3.git
cd pyhwp-py3
pip install -e .
## ๐ป ์ฌ์ฉ ์์ (Python Code)
AI ์์ด์ ํธ ๊ฐ๋ฐ์๋ Python ๊ฐ๋ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
```python
from pyhwp.html_converter import HwpToHtmlConverter
# HWP ํ์ผ์ HTML๋ก ๋ณํ
# styles.css ์์ฑ ๋ฐ bindata(์ด๋ฏธ์ง) ํด๋ ์๋ ์ถ์ถ
hwp_file = "document.hwp"
html_output = "document.html"
try:
converter = HwpToHtmlConverter(hwp_file)
converter.convert(html_output)
print(f"๋ณํ ์๋ฃ: {html_output}")
# ์ดํ ์์ฑ๋ HTML์ AI ๋ชจ๋ธ(OpenAI, Claude ๋ฑ)์ ์ปจํ
์คํธ๋ก ์ฃผ์
ํ๋ฉด ๋ฉ๋๋ค.
except Exception as e:
print(f"๋ณํ ์คํจ: {e}")
```
## ๐ฅ๏ธ ์ปค๋งจ๋๋ผ์ธ ์ฌ์ฉ๋ฒ (CLI Usage)
ํ์ด์ฌ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ํฐ๋ฏธ๋(CMD, PowerShell, Bash)์์ ๋ฐ๋ก ๋ณํํ ์ ์์ต๋๋ค.
### 1. Python ๋ชจ๋๋ก ์คํ
`pip install pyhwp2` ํ ๋ค์๊ณผ ๊ฐ์ด ์คํํ์ธ์.
```bash
# ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (ํ์ผ๋ช
.html๋ก ์๋ ์ ์ฅ)
python -m pyhwp.html_converter ๋ฌธ์.hwp
# ์ถ๋ ฅ ํ์ผ๋ช
์ง์
python -m pyhwp.html_converter ๋ฌธ์.hwp -o ๊ฒฐ๊ณผ๋ฌผ.html
```
### 3. ๋จ์ผ HTML ํ์ผ๋ก ๋ณํ (CSS์ ์ด๋ฏธ์ง ํฌํจ)
๊ธฐ๋ณธ์ ์ผ๋ก HWP๋ฅผ HTML๋ก ๋ณํํ๋ฉด HTML ํ์ผ, CSS ํ์ผ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง ํด๋(bindata)๊ฐ ๊ฐ๊ฐ ์์ฑ๋ฉ๋๋ค.
ํ์ง๋ง `--embed-image` ์ต์
์ ์ฌ์ฉํ๋ฉด **๋ชจ๋ CSS์ ์ด๋ฏธ์ง๋ฅผ ํ๋์ HTML ํ์ผ์ ํตํฉ**ํ์ฌ ๊ด๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค.
```bash
# hwp5html ๋ช
๋ น์ด ์ฌ์ฉ (๋จ์ผ ํ์ผ ์์ฑ)
python -m hwp5.hwp5html --embed-image ๋ฌธ์.hwp --output ๋จ์ผํ์ผ.html
# ๋๋ hwp2html ๋ช
๋ น์ด ์ฌ์ฉ (์ค์น๋ ๊ฒฝ์ฐ)
hwp5html --embed-image ๋ฌธ์.hwp --output ๋จ์ผํ์ผ.html
```
์ด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉํฉ๋๋ค:
- ์ด๋ฉ์ผ๋ก HTML ํ์ผ์ ์ฒจ๋ถํ ๋
- ์น ์๋ฒ ์์ด ๋ก์ปฌ์์ HTML์ ์ด์ด๋ณผ ๋
- AI ๋ชจ๋ธ์ ๋จ์ผ ํ์ผ๋ก ์ ๋ฌํ ๋
```
### 2. ๋จ๋
์คํ ํ์ผ (.exe) ์ฌ์ฉ (Windows)
Python ์ค์น๊ฐ ์๋ ํ๊ฒฝ์์๋ `hwp2html.exe` ํ์ผ ํ๋๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. (`dist/` ํด๋ ํ์ธ)
```bash
# ๊ทธ๋ฅ ๋๋๊ทธ ์ค ๋๋กญ ํ๊ฑฐ๋ ํฐ๋ฏธ๋์์ ์คํ
hwp2html.exe ๋ฌธ์.hwp
# ์ต์
์ฌ์ฉ
hwp2html.exe ๋ฌธ์.hwp -o ๊ฒฐ๊ณผ/๋ณด๊ณ ์.html
```
## ๐ค AI ์์ด์ ํธ ํ์ฉ (MCP & Automation)
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ **MCP (Model Context Protocol)** ์๋ฒ๋ **Cursor**, **์ํฐ๊ทธ๋ํผํฐ(Antigravity)** ๊ฐ์ AI ์ฝ๋ฉ ์์ด์ ํธ ๋ด์์ HWP ์ฒ๋ฆฌ ๋๊ตฌ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
- **Before**: ์์ด์ ํธ๊ฐ HWP ํ์ผ์ ๋ง๋๋ฉด "์ฝ์ ์ ์๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์
๋๋ค"๋ผ๊ณ ํฌ๊ธฐํจ.
- **After**: ์์ด์ ํธ๊ฐ ๋ด๋ถ์ ์ผ๋ก `HwpToHtmlConverter`๋ฅผ ํธ์ถํด HTML ํ
์คํธ๋ก ๋ณํํ ๋ค, ๋ด์ฉ์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ์์ฝ/๋ถ์ํจ.
## ๐ ๊ธฐ์ฌ ์์ฒญ
์ด ํ๋ก์ ํธ๊ฐ Python 3๋ก์ ์๋ช
๋ ฅ์ ์ป์์ง๋ง, ์ฌ์ ํ ๊ฐ์ ํ ์ ์ ๋ง์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์๊ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ์๊ฐ์ด ๋์ด, **"ํ์์ ์ธ ํฌ๋งท์ ๊ฐ๋ฐฉํ์ฌ AI์ ์์ญ์ผ๋ก ๊ฐ์ ธ์ค๋"** ์์ง์์ ๋์ฐธํ๊ฒ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์คํ์์ค ์ ์ ์ ํตํด, ๋ ๋ง์ ๊ณต๊ณต ๋ฐ์ดํฐ๊ฐ AI์ ์ฐ๊ฒฐ๋ ์ ์๋๋ก ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฐ์ ์ค (june9713@gmail.com ์ฃผ์ํ์ฌ ๋ฅ์คํธ๋์ธ ๋ํ์ด์ฌ) |