| name | hwp |
| description | Use kordoc for agent-native HWP/HWPX document parsing, JSON extraction, diffing, form-field extraction, and MarkdownโHWPX reverse conversion (read/convert only โ for binary editing use rhwp-edit). |
| license | MIT |
| metadata | {"category":"documents","locale":"ko-KR","phase":"v1"} |
HWP
What this skill does
kordoc์ผ๋ก .hwp / .hwpx / .hwpml ๋ฌธ์๋ฅผ AI๊ฐ ์ฝ๊ธฐ ์ข์ Markdown ๋๋ JSON์ผ๋ก ๋ฐ๊พธ๊ณ ,
ํ์ํ๋ฉด ๋ฌธ์ ๋น๊ต, ์์ ํ๋ ์ถ์ถ, MarkdownโHWPX ์ญ๋ณํ๊น์ง ์ํํ๋ค.
์ด ์คํฌ์ ๊ธฐ๋ณธ ์์ง์ ํญ์ kordoc ์ด๋ค. ๋ฌธ์ ๋ณํ, ๋น๊ต, ํ๋ ์ถ์ถ, ์ญ๋ณํ๊น์ง ๊ฐ์ ๋๊ตฌ๋ก ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ๋ค.
์คํฌ ๋ผ์ฐํ
โ ์ด hwp ์คํฌ์ ์กฐํ/๋ณํ(read-only) ์ ์ฉ์ด๋ค.
HWP ๋ฐ์ด๋๋ฆฌ ํธ์ง(๋ณธ๋ฌธ ํ
์คํธ ์ฝ์
/์ญ์ , ํ ์์ฑ, ์
์์ , replace-all)์ rhwp-edit ์คํฌ์ด,
๋ ์ด์์ ๋๋ฒ๊น
ยทIR ๋คํยท์ธ๋ค์ผยท๋ฐฐํฌ์ฉ ๋ฌธ์ ์ ๊ธ ํด์ ๊ฐ์ ๊ณ ๊ธ ๊ฒ์ฌ๋ rhwp-advanced ์คํฌ์ด ๋งก๋๋ค.
When to use
- "์ด HWP ํ์ผ์ Markdown์ผ๋ก ๋ฐ๊ฟ์ค"
- "๊ณต๋ฌธ์๋ฅผ JSON ๊ตฌ์กฐ๋ก ๋ฝ์์ AI๊ฐ ์ฝ๊ฒ ํด์ค"
- "๋ ๋ฒ์ ๋ฌธ์ ์ฐจ์ด์ ์ ๋ณด๊ณ ์ถ์ด"
- "์ ์ฒญ์ HWPX ์์ ์ด๋ค ์์ ํ๋๊ฐ ์๋์ง ๋ฝ์์ค"
- "AI๊ฐ ๋ง๋ Markdown์ ๋ค์ HWPX๋ก ์ ์ฅํด์ค"
- "ํด๋ ์ ๋ฌธ์๋ฅผ ํ ๋ฒ์ ๋ณํํด์ค"
When not to use
- OCR์ด ํ์์ธ๋ฐ OCR provider ์ฐ๊ฒฐ์ด ์ ํ ์๋ ์ด๋ฏธ์ง ๊ธฐ๋ฐ PDF๋ง ์๋ ๊ฒฝ์ฐ
.docx, .xlsx, .pdf ๋ง ๋ค๋ฃจ๋๋ผ๋ ๋ฌธ์ ํ์ฑ ์์ฒด๊ฐ ์๋๋ผ ํธ์ง๊ธฐ GUI ์๋ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ
- ์๋ณธ ํ๋ก๊ทธ๋จ์ ์ค์๊ฐ UI ์ ์ด๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ
- ๋ณธ๋ฌธ ํ
์คํธ ์ง์ ์ฝ์
ยท์ญ์ ยท์นํ ๋๋ ํ ๊ตฌ์กฐ ๋ณ๊ฒฝ โ
rhwp-edit ์คํฌ์ k-skill-rhwp CLI ๋ฅผ ์ฌ์ฉํ๋ค.
- ํ์ด์ง SVG ๋ ๋ ๋๋ฒ๊น
ยทIR ๋คํยทir-diffยท์ธ๋ค์ผ ์ถ์ถ โ
rhwp-advanced ์คํฌ์ ์
์คํธ๋ฆผ rhwp CLI ๋ฅผ ์ฌ์ฉํ๋ค.
Prerequisites
- Node.js 18+
- ์ถ๋ ฅ ๊ฒฝ๋ก ์ฐ๊ธฐ ๊ถํ
kordoc๊ณผ pdfjs-dist๋ฅผ ๊ฐ์ ์ ์ญ/๋ก์ปฌ ํ๊ฒฝ์ ์ค์นํ๊ฑฐ๋, ๋ ๋ค ํฌํจ๋ npx --yes --package kordoc --package pdfjs-dist kordoc ... ์คํ ํ๊ฒฝ
- ํ์ฌ ๋ฐฐํฌ๋
kordoc CLI๋ ์์ ์ pdfjs-dist๋ฅผ ๋ฐ๋ก ๋ก๋ํ๋ฏ๋ก PDF๋ฅผ ์ ์จ๋ ํจ๊ป ์ค์นํด์ผ ํ๋ค
Inputs
- ์๋ณธ
.hwp, .hwpx, .hwpml ํ์ผ ๊ฒฝ๋ก ๋๋ ํด๋/๊ธ๋กญ ๊ฒฝ๋ก
- ์ํ๋ ๊ฒฐ๊ณผ ํํ:
markdown, json, hwpx
- ์ถ๋ ฅ ํ์ผ/๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก
- ํ์ด์ง ๋ฒ์ ์ง์ ์ฌ๋ถ
- ๋น๊ต / ์์ ํ๋ ์ถ์ถ / ์ญ๋ณํ ์ฌ๋ถ
Routing policy
Default: kordoc
๋ค์ ์์
์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก kordoc์ผ๋ก ์ฒ๋ฆฌํ๋ค.
- HWP/HWPX/HWPML โ Markdown
- HWP/HWPX/HWPML โ JSON (
blocks, metadata)
- ๋ฐฐ์น ๋ณํ
- ํ์ด์ง ๋ฒ์ ํ์ฑ
- ์ด๋ฏธ์ง/ํ/์์์ด ํฌํจ๋ ๊ณต๋ฌธ์ ๊ตฌ์กฐ ์ถ์ถ
- ๋๋ ํฐ๋ฆฌ ๊ฐ์ ๋ณํ (
watch)
- MarkdownโHWPX ์ญ๋ณํ
- HWPX ์์ ํ๋ ์ถ์ถ
Optional library path
CLI๋ง์ผ๋ก ๋ถ์กฑํ๋ฉด Node API๋ฅผ ์ฌ์ฉํ๋ค.
parse() โ Markdown + ๊ตฌ์กฐํ ๋ธ๋ก
compare() โ ์ ๊ตฌ ๋ฌธ์ ๋น๊ต
extractFormFields() โ ํ์ฑ๋ ๋ธ๋ก์์ ์์ ํ๋ ์ถ์ถ
markdownToHwpx() โ MarkdownโHWPX ์ญ๋ณํ
Workflow
1. Prepare the CLI runtime
์ผํ์ฑ ๋ณํ์ด๋ฉด ๋ ๋ค ํฌํจํ npx ํํ๋ฅผ ๋ฐ๋ก ์ด๋ค.
npx --yes --package kordoc --package pdfjs-dist kordoc --help
๋ฐ๋ณต ์คํ์ฉ ์ ์ญ ์ค์น๊ฐ ํ์ํ๋ฉด:
npm install -g kordoc pdfjs-dist
ํ์ฌ ๋ฐฐํฌ๋ kordoc CLI๋ pdfjs-dist๊ฐ ์์ผ๋ฉด kordoc --help ๋จ๊ณ๋ถํฐ ์คํจํ๋ฏ๋ก
๊นจ๋ํ ํ๊ฒฝ์์๋ ๋ ํจํค์ง๋ฅผ ๊ฐ์ด ์ค์นํ ๋ค ์คํํ๋ค.
2. Prepare a local project for Node API examples
parse(), compare(), extractFormFields(), markdownToHwpx() ๊ฐ์ ESM ์์๋
์ ์ญ NODE_PATH๊ฐ ์๋๋ผ ๋ก์ปฌ ํ๋ก์ ํธ ์ค์น ๊ธฐ์ค์ผ๋ก ์คํํ๋ค.
mkdir -p ./kordoc-local && cd ./kordoc-local
npm init -y
npm install kordoc pdfjs-dist
์ด๋ฏธ package.json์ด ์๋ ์์
๋๋ ํฐ๋ฆฌ๋ผ๋ฉด npm install kordoc pdfjs-dist๋ง ์ถ๊ฐ๋ก ์คํํ๋ฉด ๋๋ค.
3. Convert a document to Markdown
npx --yes --package kordoc --package pdfjs-dist kordoc ๋ณด๊ณ ์.hwp -o ๋ณด๊ณ ์.md
์ฌ๋ฌ ๋ฌธ์๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ค๋ฉด:
npx --yes --package kordoc --package pdfjs-dist kordoc ./๋ฌธ์ํจ/* -d ./๋ณํ๊ฒฐ๊ณผ
ํน์ ํ์ด์ง ๋ฒ์๋ง ์ฝ๊ณ ์ถ์ผ๋ฉด:
npx --yes --package kordoc --package pdfjs-dist kordoc ๋ณด๊ณ ์.hwp --pages 1-3
4. Extract structured JSON for AI/automation
npx --yes --package kordoc --package pdfjs-dist kordoc ๊ฒํ ์.hwpx --format json > ๊ฒํ ์.json
JSON ๊ฒฐ๊ณผ์์๋ success, markdown, blocks, metadata๋ฅผ ์ฐ์ ํ์ธํ๋ค.
ํ๋ ์ด๋ฏธ์ง๊ฐ ์ค์ํ๋ฉด blocks ์์ table, image ํ์
์ ํ์ธํ๋ค.
5. Inspect HWPX form fields from parsed blocks
node --input-type=module - <<'EOF'
import { parse, extractFormFields } from "kordoc";
const result = await parse("์ ์ฒญ์.hwpx");
if (!result.success) {
console.error(result.error);
process.exit(1);
}
const fields = extractFormFields(result.blocks);
console.log(JSON.stringify(fields, null, 2));
EOF
์๋ ๋ณํ์ด ๊ณ์ ๋ค์ด์ค๋ ํด๋๋ฉด CLI์ watch ๋ช
๋ น์ ์ด๋ค.
npx --yes --package kordoc --package pdfjs-dist kordoc watch ./๋ฌธ์ํจ
6. Reverse-convert Markdown back to HWPX
node --input-type=module - <<'EOF'
import { markdownToHwpx } from "kordoc";
import { writeFileSync } from "node:fs";
const hwpx = await markdownToHwpx("# ์ ๋ชฉ\n\n๋ณธ๋ฌธ\n\n| ํญ๋ชฉ | ๊ฐ |\n| --- | --- |\n| ์ฑ๋ช
| ํ๊ธธ๋ |");
writeFileSync("์ถ๋ ฅ.hwpx", Buffer.from(hwpx));
EOF
7. Compare two document versions when diff matters
node --input-type=module - <<'EOF'
import { compare } from "kordoc";
import { readFileSync } from "node:fs";
const before = readFileSync("์ด์ ๋ฒ์ .hwp");
const after = readFileSync("์ต์ ๋ฒ์ .hwpx");
const diff = await compare(before, after);
console.log(diff.stats);
EOF
Verify outputs after every run
- Markdown: ํ์ผ์ด ์์ฑ๋์๊ณ ์ ๋ชฉ/๋ณธ๋ฌธ/ํ ๊ตฌ์กฐ๊ฐ ๊นจ์ง์ง ์์๋์ง ํ์ธ
- JSON:
success: true ์ blocks / metadata ์กด์ฌ ์ฌ๋ถ ํ์ธ
- ๋ฐฐ์น ์ฒ๋ฆฌ: ์
๋ ฅ ์์ ์ถ๋ ฅ ์๊ฐ ํฌ๊ฒ ์ด๊ธ๋์ง ์๋์ง ํ์ธ
- ์์ ํ๋ ์ถ์ถ:
extractFormFields(result.blocks) ๊ฒฐ๊ณผ๊ฐ ๋น์ด ์์ง ์์์ง ํ์ธ
- ์ญ๋ณํ: ์์ฑ๋
.hwpx ํ์ผ์ด ์ด๋ฆฌ๊ณ ๊ธฐ๋ณธ ์์/ํ
์ด๋ธ ๊ตฌ์กฐ๊ฐ ์ ์ง๋๋์ง ํ์ธ
- ๋น๊ต:
diff.stats ์ added / removed / modified ๊ฐ์ด ํฉ๋ฆฌ์ ์ธ์ง ํ์ธ
Done when
- ์์ฒญํ Markdown / JSON / HWPX ๊ฒฐ๊ณผ๋ฌผ์ด ์์ฑ๋์ด ์๋ค
- ๊ณต๋ฌธ์ ํยท์ด๋ฏธ์งยท๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์ํ ์์ค์ผ๋ก ํ์ธ๋์ด ์๋ค
- ์์ ํ๋ ์ถ์ถ์ด๋ ์ญ๋ณํ ์์ฒญ์ด ์์๋ค๋ฉด ๊ฒฐ๊ณผ/์ถ๋ ฅ ๊ตฌ์กฐ๊น์ง ๊ฒ์ฆ๋์ด ์๋ค
- ๋ฐฐ์น ์์ฒญ์ด๋ฉด ์ฒ๋ฆฌ ๋ฒ์์ ์คํจ ๊ฑด์๊ฐ ์ ๋ฆฌ๋์ด ์๋ค
Failure modes
- ์์๋ HWP/HWPX/HWPML ํ์ผ
- ์ํธํ/๋ฐฐํฌ ์ ํ ๋ฌธ์์์ ์ผ๋ถ ํ์ฑ ํ๊ณ ๋ฐ์
- ์ด๋ฏธ์ง ๊ธฐ๋ฐ PDF์ธ๋ฐ OCR provider๊ฐ ์์
- ์ถ๋ ฅ ๋๋ ํฐ๋ฆฌ ๊ถํ ๋ถ์กฑ
- ์์ ๋ผ๋ฒจ์ด ํ
ํ๋ฆฟ ์์์ ์์๊ณผ ๋ค๋ฅด๊ฒ ๋ฐฐ์น๋์ด ์ผ๋ถ ํ๋๊ฐ ์ธ์๋์ง ์์
Notes
kordoc์ HWP/HWPX๋ฟ ์๋๋ผ HWPML, PDF, XLSX, DOCX๋ ํจ๊ป ๋ค๋ฃฌ๋ค.
- ๊ธฐ๋ณธ ๋ชฉ์ ์ AI๊ฐ ์ฝ์ ์ ์๋ Markdown/JSON ๋ณํ ์ด๋ค.
- ํ์ฌ ๋ฐฐํฌ๋ณธ ๊ธฐ์ค์ผ๋ก ๋ฌธ์ํ๋ CLI ๋ช
๋ น์ ๊ธฐ๋ณธ ๋ณํ๊ณผ
watch ์ด๋ฉฐ, ์์ ์ฒ๋ฆฌ๋ extractFormFields() ๊ฐ์ Node API๋ก ์ฐ๊ฒฐํ๋ค.