A newer version of the Gradio SDK is available:
6.5.1
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?)
์ด ํ๋ก์ ํธ๋ ๋จ์ํ ๋ฒ์ ์ ๊ทธ๋ ์ด๋๊ฐ ์๋๋๋ค. "์ฃฝ์ด์๋" ์ฝ๋๋ฅผ ํ๋์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ๋์ด๋ ค๋์ต๋๋ค.
Python 3.11 ์์ ์ง์:
2to3์๋ ๋ณํ์ ๊ทธ์น์ง ์๊ณ ,metaclass,bytes/str์ฒ๋ฆฌ,ugettext๋ฑ Python 2 ๊ธฐ๋ฐ์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์ ๋ฉด ๋ฆฌํฉํ ๋งํ์ต๋๋ค.six๋ชจ๋ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ ํ๋์ ์ธ Python ๋ฌธ๋ฒ์ ์ ์ฉํ์ต๋๋ค.
AI ์ต์ ํ ๋ณํ๊ธฐ (
HwpToHtmlConverter):- ๋ณต์กํ ๋ด๋ถ ๋ก์ง์ ๋ชฐ๋ผ๋ ๋จ ๋ ์ค์ ์ฝ๋๋ก HWP๋ฅผ HTML๋ก ๋ณํํ ์ ์๋ ๋ํผ(Wrapper)๋ฅผ ๊ตฌํํ์ต๋๋ค.
- ๋ณํ๋ HTML์ CSS ์คํ์ผ๊ณผ ์ด๋ฏธ์ง(
bindata)๋ฅผ ํฌํจํ์ฌ ์๋ณธ์ ๋ ์ด์์์ ์ต๋ํ ๋ณด์กดํฉ๋๋ค. ์ด๋ VLM(Vision Language Model)์ด๋ RAG(Retrieval-Augmented Generation) ์์คํ ์ด ๋ฌธ์๋ฅผ ์๊ฐ์ /๊ตฌ์กฐ์ ์ผ๋ก ์ดํดํ๋ ๋ฐ ํฐ ๋์์ ์ค๋๋ค.
ํ๋ซํผ ๋ ๋ฆฝ์ฑ:
- ์๋์ฐ๋ฟ๋ง ์๋๋ผ 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 ๊ฐ๋ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
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 ํ ๋ค์๊ณผ ๊ฐ์ด ์คํํ์ธ์.
# ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (ํ์ผ๋ช
.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 ํ์ผ์ ํตํฉํ์ฌ ๊ด๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค.
# 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 ์ฃผ์ํ์ฌ ๋ฅ์คํธ๋์ธ ๋ํ์ด์ฌ)