Skip to content
kordoc logo

kordoc

By chrisryugj·2,850

Parse Korean documents (HWP, HWPX, PDF, XLSX, DOCX, PPTX) to Markdown; fill forms, diff, render.

kordoc

모두 파싱해버리겠다. Parse them all.

npm version
license
MCP Registry

Korea's document hell is second to none. Built by a civil servant who survived seven years in it.

Convert HWP 3.x/5.x, HWPX, HWPML, PDF, XLS/XLSX, DOCX, PPTX and PNG/JPG/WebP to Markdown and structured data. Use it as a library, CLI or MCP server.

한국어 · Usage guide · Benchmarks · Changelog

kordoc output for the same statute annex given as HWP, HWPX, PDF and a scanned image

Actual output for one statute annex given as HWP, HWPX, PDF and a scanned image. All four read the merged cells (rowspan, colspan) into the same table structure. OCR turns on automatically for images.

  • 📊 0.964 overall on the public PDF benchmark: opendataloader-bench, 200 documents, higher than the 12 parsers on the public leaderboard (measured on 4.22.14). Measurement details
  • 🇰🇷 100% Korean document table structure match: all 10,342 visible tables from 2,424 original HWPX documents. Validation

If this saves you time, a GitHub ⭐ helps others find it.

Videos (Korean): public benchmark run (2026-09-27 cut, 1 min 31 sec) · batch form filling demo

Install

Node.js 20+ · macOS / Linux / Windows

npm install kordoc

Run the CLI without installing it globally: npx kordoc. PDF/OCR dependencies are installed by default; omitting them with --omit=optional limits those features.

Connect an AI agent

npx -y kordoc setup

Registers MCP with installed clients such as Claude Desktop, Claude Code, Cursor and Codex. Restart the client to use 20 tools for parsing, comparison, generation, review, rendering and more. kordoc is also listed on the official MCP Registry as io.github.chrisryugj/kordoc.

One-click install for VS Code and Cursor:

Install in VS Code Install in Cursor

Claude Code plugin:

/plugin marketplace add chrisryugj/kordoc
/plugin install kordoc@kordoc

Manual MCP setup and installation troubleshooting

Quick start

CLI

npx kordoc document.hwpx -o document.md
npx kordoc *.pdf --jobs 4 -d ./output
npx kordoc document.pdf --format json --pages 1-3
npx kordoc scan.pdf --ocr -o scan.md
npx kordoc generate report.md --preset report -o report.hwpx
npx kordoc fill --template gian -j values.json -o draft.hwpx
npx kordoc lint report.hwpx --gate --preset report

--jobs converts files in parallel and increases memory use. Batch conversion details

JavaScript / TypeScript

import { parse, markdownToHwpx } from "kordoc"
import { writeFile } from "node:fs/promises"

const result = await parse("document.hwpx")
if (result.success) {
  console.log(result.markdown)
  // result.blocks: structured data; result.metadata: document metadata
}

const hwpx = await markdownToHwpx("# Plan\n\nBody text", {
  gongmun: { preset: "report" },
})
await writeFile("report.hwpx", Buffer.from(hwpx))

Parse options, APIs, forms and rendering examples

Features

Task Capabilities
Read Markdown, IR, page text, RAG chunks and local OCR
Compare and edit Block/cell diffs, format-preserving HWPX/HWP patches, new content in a sample's format
Create Markdown → HWPX, government-document presets and department templates (--template), tables, equations and charts
Agency packs Build a house-style pack (.kpack) from a few of your own agency documents and write new documents in that style — agency packs
Fill forms Fields, click-here controls, two draft templates and seal placement
Review Notation and public-language rules, structure and AI-writing gate, budget calculation checks, block-level lint for open documents (lint-blocks)
View and protect HWPX/HWP previews and region crops, PII masking

Extract Markdown for format-preserving patches with --keep-layout-tables. Unsupported edits are skipped with a reason. Format-preserving editing · Full CLI reference

Validation

4.22.14 verification · 2026-10-19 (render layout, PDF text, PDF tables, statute annexes and OCR: 4.24.24 · 2026-10-30). Results use fixed corpora and reference criteria.

Target Population Result
HWPX 2,424 documents · 10,342 tables Table structure match 10,342/10,342 · 100%
HWP 5.x ↔ HWPX 1,130 pairs · 4,315 tables Paired-document table structure match 100%
PDF text 744 pairs Character recall 99.883% · precision 99.678% · reading order 99.312% · word-boundary F1 99.067%
PDF tables 708 pairs · 2,331 tables Detection 99.83% · structure match 98.24% · cell F1 0.9919
HWPX reflow 25,187 multiline paragraphs (12 folders) All line starts match 24,941/25,187 · 99.02%
Nested PDF tables (text layer) 29 documents · 101 tables Structure and cell content 101/101 · 100%
Statute annexes 272 documents · 346 tables HWP 346/346, PDF 343/346 · 99.13%
All PDFs 1,729 scored out of 1,911 documents Text coverage 99.80%
OCR 53 documents · 102 pages · 67 tables CER 0.0244 · character recall 99.32% · table structure 34/67
opendataloader-bench 200 PDF documents Overall 0.964 with defaults · 0.939 with OCR off
HWPX render layout 1,565 Hancom PDF pairs (1,508 with matching page counts) · 111,480 text runs · 4,300 images Text position (±1.5pt) 106,904 · 95.9% · image position (±2pt) 4,213 · 98.0%

Table structure, cell content and visual fidelity are separate metrics. The nested-table 100% applies only to these 101 tables, not all PDF parsing or page layout. See benchmark details for scope, exclusions, per-option scores and reproduction.

Recent updates

Latest release: 4.24.25 · 2026-10-30

Version Highlights Measured change
4.24.25 patch: editing paragraphs with forced line breaks, edits where position mapping fails (layout frames, title boxes, paragraphs with superscripts) located by their text, remaining edits delivered as a rewrite in the original's formatting (.rewrite.hwpx) · password-protected HWPX rendering patch edits applied (corpus experiment) HWPX 487 → 539/540 · table cells 455 → 465/467 · HWP 111 → 123/140 · benchmark metrics unchanged
4.24.24 OCR tables: short column dividers inside header bands · Rendering: objects that escape their cell, cached paragraphs after uncached ones inside cells, stacking and page break of non-overlapping square-wrapped tables in one paragraph · COM fallback temp-folder cleanup (#177) OCR table structure match 33 → 34/67 · render page-count match 1,507 → 1,508 · text position 106,818 → 106,904 · images 4,169 → 4,213 (0 documents down) · 1 measurement exception (see changelog) · other metrics unchanged
4.24.23 PDF tables: band of a row split at a page break merged into that row, a line with a unit note above a table no longer taken as a header row · Rendering: horizontal position of paragraph-relative objects Statute annex PDF tables 342 → 343/346 (99.13%) · OCR table structure match 31 → 33/67 · render text position 106,790 → 106,818 · images 4,167 → 4,169 (0 down) · other metrics unchanged
4.24.22 OCR and PDF tables: rules stretched across empty indent columns by white row-background outlines · Rendering: paragraphs after overflowing cached lines, cell caches whose text height does not match the font size, row boundary of the first-page part stored in table sz, continuation part of split merged cells, merged-cell heights in multi-page tables OCR table structure match 26 → 31/67 · cell F1 0.576 → 0.585 · render text position 106,570 → 106,790 (5 documents up, 0 down) · other metrics unchanged
4.24.21 Rendering: footnote page for paragraphs spanning pages, non-splitting tables (page break and following text), paragraphs above tables pushed down by a vertical offset, trailing empty sections with master pages, overflowing multi-row cells in multi-page tables Render page-count match 1,505 → 1,507 documents · text position 100,019 → 106,570 (4 existing documents up, 0 down, 3 newly measured after page counts matched) · 1 measurement exception (see changelog) · other metrics unchanged

See the changelog for earlier releases and details.

FAQ

How do I convert an HWP or HWPX file to Markdown?
npx kordoc document.hwp -o document.md. It reads the file directly, without Hancom Office. Convert many files at once with npx kordoc *.hwpx -d ./output.

How do I let Claude, Cursor or another AI agent read Korean documents?
Run npx -y kordoc setup to register the MCP server. The agent can then read, compare and fill HWP, PDF and Excel files from a file path.

Does it work on an air-gapped network?
Yes. KORDOC_OFFLINE=1 blocks all outbound traffic, and OCR runs on the local CPU with no API key. Offline deployment

Can I use it for RAG indexing?
--format chunks emits structure chunks with heading breadcrumbs plus standalone table chunks. Use --table-format gfm (API: tableFormat: "gfm") for tables without HTML. From Python or Java, use the Python SDK or Java SDK.

Can I get OCR line boxes or use another model?
--ocr --ocr-lines --format json exports line boxes and confidence; --ocr-det and --ocr-det-long-side select the detector and resolution. OCR lines and models

Documentation and security

About the Author

A local civil servant in Korea. Built this after seven years of wrestling HWP files at the Gwangjin-gu District Office in Seoul. Validated on thousands of real government documents across five public-sector projects.