toss-hwp / ORIGINAL_README.md
seawolf2357's picture
Upload ORIGINAL_README.md with huggingface_hub
59d4c35 verified

A newer version of the Gradio SDK is available: 6.5.1

Upgrade

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 ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์ฃผ์‹ํšŒ์‚ฌ ๋„ฅ์ŠคํŠธ๋‚˜์ธ ๋Œ€ํ‘œ์ด์‚ฌ)