
Kordoc Korean Document Parser
- 726 installs
- 66 repo stars
- Updated July 9, 2026
- aradotso/trending-skills
Kordoc Korean Document Parser is a Claude Code skill that parses Korean HWP, HWPX, and PDF government documents into clean Markdown and structured data using the kordoc TypeScript library, CLI, and MCP server.
About
Kordoc Korean Document Parser is a document ingestion skill from aradotso/trending-skills built around kordoc, a TypeScript library and CLI for parsing Korean government documents including HWP 5.x, HWPX, and PDF into Markdown and structured data. Triggers cover parse hwp file to markdown, convert korean document to text, extract text from hwpx, compare two hwp documents, extract form fields, and set up kordoc mcp server. The skill supports CLI usage, programmatic API integration, and MCP server setup for agent and RAG pipeline workflows. Developers reach for Kordoc Korean Document Parser when building Korean-language document automation that must handle legacy HWP formats beyond standard PDF text extraction. Output targets clean Markdown suitable for downstream indexing and agent consumption.
- Parses HWP 5.x, HWPX, and PDF files into Markdown and IRBlock[] structured data
- Supports CLI, programmatic TypeScript API, and MCP server integration
- Extracts tables, form fields, metadata, and performs document diffing
- Includes reverse Markdown-to-HWPX generation capability
- Auto-detects document type with zero-configuration parsing
Kordoc Korean Document Parser by the numbers
- 726 all-time installs (skills.sh)
- +8 installs in the week ending Jul 13, 2026 (Skillselion tracking)
- Ranked #324 of 1,901 Documentation skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 19, 2026 (Skillselion catalog sync)
npx skills add https://github.com/aradotso/trending-skills --skill kordoc-korean-document-parserAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 726 |
|---|---|
| repo stars | ★ 66 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 9, 2026 |
| Repository | aradotso/trending-skills ↗ |
How do you parse Korean HWP files to Markdown?
Parse Korean HWP, HWPX, and PDF government documents into clean Markdown and structured data for RAG pipelines or agent workflows.
Who is it for?
Developers building Korean document RAG pipelines or agent workflows that must ingest HWP 5.x, HWPX, and PDF government files.
Skip if: English-only PDF workflows without Korean HWP/HWPX formats or teams with no need for kordoc CLI, API, or MCP integration.
When should I use this skill?
A developer asks to parse HWP to markdown, convert HWPX or Korean PDF documents, compare HWP files, or set up the kordoc MCP server.
What you get
Markdown output, structured document data, form field extractions, and optional MCP server configuration for Korean HWP/HWPX/PDF files.
- Markdown document output
- Structured parsed data
By the numbers
- Supports 3 document formats: HWP 5.x, HWPX, and PDF
- Defines 8 trigger phrases for Korean document parsing and MCP setup
Files
kordoc Korean Document Parser
Skill by ara.so — Daily 2026 Skills collection.
kordoc is a TypeScript library and CLI for parsing Korean government documents (HWP 5.x, HWPX, PDF) into Markdown and structured IRBlock[] data. It handles proprietary HWP binary formats, table extraction, form field recognition, document diffing, and reverse Markdown→HWPX generation.
---
Installation
# Core library
npm install kordoc
# PDF support (optional peer dependency)
npm install pdfjs-dist
# CLI (no install needed)
npx kordoc document.hwpx---
Core API
Auto-detect and Parse Any Document
import { parse } from "kordoc"
import { readFileSync } from "fs"
const buffer = readFileSync("document.hwpx")
const result = await parse(buffer.buffer) // ArrayBuffer required
if (result.success) {
console.log(result.markdown) // string: full Markdown
console.log(result.blocks) // IRBlock[]: structured data
console.log(result.metadata) // { title, author, createdAt, pageCount, ... }
console.log(result.outline) // OutlineItem[]: document structure
console.log(result.warnings) // ParseWarning[]: skipped elements
} else {
console.error(result.error) // string message
console.error(result.code) // ErrorCode: "ENCRYPTED" | "ZIP_BOMB" | "IMAGE_BASED_PDF" | ...
}Format-Specific Parsers
import { parseHwpx, parseHwp, parsePdf, detectFormat } from "kordoc"
// Detect format first
const fmt = detectFormat(buffer.buffer) // "hwpx" | "hwp" | "pdf" | "unknown"
// Parse by format
const hwpxResult = await parseHwpx(buffer.buffer)
const hwpResult = await parseHwp(buffer.buffer)
const pdfResult = await parsePdf(buffer.buffer)Parse Options
import { parse, ParseOptions } from "kordoc"
const result = await parse(buffer.buffer, {
pages: "1-3", // page range string
// pages: [1, 5, 10], // or specific page numbers
ocr: async (pageImage, pageNumber, mimeType) => {
// Pluggable OCR for image-based PDFs
// pageImage: ArrayBuffer of the page image
return await myOcrService.recognize(pageImage)
}
})---
Working with IRBlocks
import type { IRBlock, IRBlockType, IRTable, IRCell } from "kordoc"
// IRBlock types: "heading" | "paragraph" | "table" | "list" | "image" | "separator"
for (const block of result.blocks) {
if (block.type === "heading") {
console.log(`H${block.level}: ${block.text}`)
console.log(block.bbox) // { x, y, width, height, page }
}
if (block.type === "table") {
const table = block as IRTable
for (const row of table.rows) {
for (const cell of row) {
console.log(cell.text, cell.colspan, cell.rowspan)
}
}
}
if (block.type === "paragraph") {
console.log(block.text)
console.log(block.style) // InlineStyle: { bold, italic, fontSize, ... }
console.log(block.pageNumber)
}
}Convert Blocks Back to Markdown
import { blocksToMarkdown } from "kordoc"
const markdown = blocksToMarkdown(result.blocks)---
Document Comparison
import { compare } from "kordoc"
const bufA = readFileSync("v1.hwp").buffer
const bufB = readFileSync("v2.hwpx").buffer // cross-format supported
const diff = await compare(bufA, bufB)
console.log(diff.stats)
// { added: 3, removed: 1, modified: 5, unchanged: 42 }
for (const d of diff.diffs) {
// d.type: "added" | "removed" | "modified" | "unchanged"
// d.blockA, d.blockB: IRBlock
// d.cellDiffs: CellDiff[] for table blocks
console.log(d.type, d.blockA?.text ?? d.blockB?.text)
}---
Form Field Extraction
import { parse, extractFormFields } from "kordoc"
const result = await parse(buffer.buffer)
if (result.success) {
const form = extractFormFields(result.blocks)
console.log(form.confidence) // 0.0–1.0
for (const field of form.fields) {
// { label: "성명", value: "홍길동", row: 0, col: 0 }
console.log(`${field.label}: ${field.value}`)
}
}---
Markdown → HWPX Generation
import { markdownToHwpx } from "kordoc"
import { writeFileSync } from "fs"
const markdown = `
# 제목
본문 내용입니다.
| 구분 | 내용 |
| --- | --- |
| 항목1 | 값1 |
| 항목2 | 값2 |
`
const hwpxBuffer = await markdownToHwpx(markdown)
writeFileSync("output.hwpx", Buffer.from(hwpxBuffer))---
CLI Usage
# Basic conversion — output to stdout
npx kordoc document.hwpx
# Save to file
npx kordoc document.hwp -o output.md
# Batch convert all PDFs to a directory
npx kordoc *.pdf -d ./converted/
# JSON output with blocks + metadata
npx kordoc report.hwpx --format json
# Parse specific pages only
npx kordoc report.hwpx --pages 1-3
# Watch mode — auto-convert new files
npx kordoc watch ./incoming -d ./output
# Watch with webhook notification on conversion
npx kordoc watch ./docs --webhook https://api.example.com/hook---
MCP Server Setup
Add to your MCP config (Claude Desktop, Cursor, Windsurf):
{
"mcpServers": {
"kordoc": {
"command": "npx",
"args": ["-y", "kordoc-mcp"]
}
}
}Available MCP Tools
| Tool | Description |
|---|---|
parse_document | Parse HWP/HWPX/PDF → Markdown + metadata + outline + warnings |
detect_format | Detect file format via magic bytes |
parse_metadata | Extract only metadata (fast, no full parse) |
parse_pages | Parse a specific page range |
parse_table | Extract the Nth table from a document |
compare_documents | Diff two documents (cross-format supported) |
parse_form | Extract form fields as structured JSON |
---
TypeScript Types Reference
import type {
// Results
ParseResult, ParseSuccess, ParseFailure,
ErrorCode, // "ENCRYPTED" | "ZIP_BOMB" | "IMAGE_BASED_PDF" | ...
// Blocks
IRBlock, IRBlockType, IRTable, IRCell, CellContext,
// Metadata & structure
DocumentMetadata, OutlineItem,
ParseWarning, WarningCode,
BoundingBox, // { x, y, width, height, page }
InlineStyle, // { bold, italic, fontSize, color, ... }
// Options
ParseOptions, FileType,
OcrProvider, // async (image, pageNum, mime) => string
WatchOptions,
// Diff
DiffResult, BlockDiff, CellDiff, DiffChangeType,
// Forms
FormField, FormResult,
} from "kordoc"---
Common Patterns
Batch Process Files with Error Handling
import { parse, detectFormat } from "kordoc"
import { readFileSync } from "fs"
import { glob } from "glob"
const files = await glob("./docs/**/*.{hwp,hwpx,pdf}")
for (const file of files) {
const buffer = readFileSync(file)
const fmt = detectFormat(buffer.buffer)
if (fmt === "unknown") {
console.warn(`Skipping unknown format: ${file}`)
continue
}
const result = await parse(buffer.buffer)
if (!result.success) {
if (result.code === "ENCRYPTED") {
console.warn(`Encrypted, skipping: ${file}`)
} else if (result.code === "IMAGE_BASED_PDF") {
console.warn(`Image-based PDF needs OCR: ${file}`)
} else {
console.error(`Failed: ${file} — ${result.error}`)
}
continue
}
console.log(`Parsed ${file}: ${result.blocks.length} blocks`)
}Extract All Tables from a Document
import { parse } from "kordoc"
import type { IRTable } from "kordoc"
const result = await parse(buffer.buffer)
if (result.success) {
const tables = result.blocks.filter(b => b.type === "table") as IRTable[]
tables.forEach((table, i) => {
console.log(`\n--- Table ${i + 1} ---`)
for (const row of table.rows) {
const cells = row.map(cell => cell.text.trim()).join(" | ")
console.log(`| ${cells} |`)
}
})
}OCR with Tesseract.js
import { parse } from "kordoc"
import Tesseract from "tesseract.js"
const result = await parse(buffer.buffer, {
ocr: async (pageImage, pageNumber, mimeType) => {
const blob = new Blob([pageImage], { type: mimeType })
const url = URL.createObjectURL(blob)
const { data } = await Tesseract.recognize(url, "kor+eng")
URL.revokeObjectURL(url)
return data.text
}
})Watch Mode Programmatic API
import { watch } from "kordoc"
const watcher = watch("./incoming", {
output: "./converted",
webhook: process.env.WEBHOOK_URL,
onFile: async (file, result) => {
if (result.success) {
console.log(`Converted: ${file}`)
}
}
})
// Stop watching
watcher.stop()---
Troubleshooting
`buffer.buffer` vs `Buffer` — kordoc requires ArrayBuffer, not Node.js Buffer. Always pass readFileSync("file").buffer or use .buffer on a Uint8Array.
PDF tables not detected — Line-based detection requires pdfjs-dist installed. Install it: npm install pdfjs-dist. For borderless tables, kordoc uses cluster-based heuristics automatically.
`"IMAGE_BASED_PDF"` error — The PDF contains scanned images with no text layer. Provide an ocr function in parse options.
`"ENCRYPTED"` error — HWP DRM/password-protected files cannot be parsed without the decryption key. No workaround.
Korean characters garbled in output — Ensure your terminal/file uses UTF-8 encoding. kordoc outputs UTF-8 Markdown by default.
Large files are slow — Use pages option to parse only needed pages: parse(buf, { pages: "1-5" }). Metadata-only extraction is faster: parse_metadata MCP tool or check result.metadata directly.
HWP table columns wrong — Update to v1.6.1+. Earlier versions had a 2-byte offset misalignment in LIST_HEADER parsing causing column explosion.
Related skills
How it compares
Use this skill for Korean HWP/HWPX government documents rather than generic English PDF-to-text extractors without kordoc format support.
FAQ
Which Korean document formats does kordoc support?
Kordoc Korean Document Parser supports HWP 5.x, HWPX, and PDF Korean government documents. The kordoc TypeScript library and CLI convert these formats into Markdown and structured data for RAG pipelines and agent workflows.
How can developers run kordoc document parsing?
Kordoc Korean Document Parser supports three integration modes: kordoc CLI commands, programmatic TypeScript API calls, and MCP server setup. Developers choose based on whether parsing runs in scripts, applications, or agent toolchains.
Is Kordoc Korean Document Parser safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.