kordoc 2.9.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -8
- package/dist/-K5SLEFZD.js +71 -0
- package/dist/-K5SLEFZD.js.map +1 -0
- package/dist/{chunk-M24KMDAR.js → chunk-326STEDU.js} +6684 -4061
- package/dist/chunk-326STEDU.js.map +1 -0
- package/dist/{chunk-QB7CS534.cjs → chunk-3WRJQQIO.cjs} +185 -16
- package/dist/chunk-3WRJQQIO.cjs.map +1 -0
- package/dist/chunk-MUOQXDZ4.cjs.map +1 -1
- package/dist/{chunk-RXZLTACX.js → chunk-NHXKJWR7.js} +182 -13
- package/dist/chunk-NHXKJWR7.js.map +1 -0
- package/dist/{chunk-SJ5TPMBT.js → chunk-SA2PERJ5.js} +182 -13
- package/dist/chunk-SA2PERJ5.js.map +1 -0
- package/dist/cli.js +42 -3
- package/dist/cli.js.map +1 -1
- package/dist/formula-XGG6ZP42.cjs.map +1 -1
- package/dist/index.cjs +3247 -822
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +61 -2
- package/dist/index.d.ts +61 -2
- package/dist/index.js +3025 -600
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +3 -3
- package/dist/page-range-3C7UGGEK.cjs.map +1 -1
- package/dist/{parser-OMPBVEFU.js → parser-4IVYHKSL.js} +677 -85
- package/dist/parser-4IVYHKSL.js.map +1 -0
- package/dist/{parser-EL5YETUA.cjs → parser-5KHU732L.cjs} +689 -97
- package/dist/parser-5KHU732L.cjs.map +1 -0
- package/dist/{parser-XBYGROQB.js → parser-AU2NLC44.js} +677 -85
- package/dist/parser-AU2NLC44.js.map +1 -0
- package/dist/provider-SNONEZNW.cjs.map +1 -1
- package/dist/{watch-ULLLK7ID.js → watch-5DDN4BUI.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-M24KMDAR.js.map +0 -1
- package/dist/chunk-QB7CS534.cjs.map +0 -1
- package/dist/chunk-RXZLTACX.js.map +0 -1
- package/dist/chunk-SJ5TPMBT.js.map +0 -1
- package/dist/parser-EL5YETUA.cjs.map +0 -1
- package/dist/parser-OMPBVEFU.js.map +0 -1
- package/dist/parser-XBYGROQB.js.map +0 -1
- /package/dist/{watch-ULLLK7ID.js.map → watch-5DDN4BUI.js.map} +0 -0
package/README.md
CHANGED
|
@@ -62,20 +62,67 @@ Windows 도 자동으로 `cmd /c npx` 래핑. 수동 JSON 편집 불필요. 재
|
|
|
62
62
|
* **📊 복잡한 표(Table) 완벽 재현**: 선이 없는 PDF나 복잡하게 병합된 HWP 표도 구조를 분석하여 정확한 마크다운 테이블로 복원합니다.
|
|
63
63
|
* **🔍 신구대조표 자동 생성**: 두 문서의 차이점을 분석하여 무엇이 바뀌었는지 한눈에 보여줍니다. (HWP와 HWPX 간의 비교도 가능!)
|
|
64
64
|
* **📝 마크다운을 다시 HWPX로**: AI가 작성한 내용을 다시 보고서 양식(`HWPX`)으로 되돌려줍니다. 이제 복사-붙여넣기 노가다에서 해방되세요.
|
|
65
|
+
* **🔄 서식 보존 무손실 라운드트립 (v3.0)**: 변환된 마크다운을 편집해서 `patchHwpx`에 넘기면, **원본 서식을 1바이트도 건드리지 않고** 바뀐 문단/표 셀의 텍스트만 원본 HWPX 안에서 교체합니다. AI가 공문 내용을 고치고 서식 그대로 돌려받는 워크플로가 가능해집니다.
|
|
65
66
|
* **✏️ 양식 자동 채우기**: 공문서 양식 템플릿(신청서, 보고서)에 값을 넣으면 자동으로 빈칸을 채웁니다. 원본 서식(글꼴, 크기, 정렬)을 100% 보존합니다.
|
|
66
67
|
* **🤖 AI 에이전트 연동 (MCP)**: `Claude`, `Cursor`와 같은 도구에서 직접 `kordoc`을 호출해 문서를 읽고 코딩할 수 있습니다.
|
|
67
68
|
|
|
68
69
|
---
|
|
69
70
|
|
|
70
|
-
##
|
|
71
|
+
## v3.0.0 변경사항
|
|
72
|
+
|
|
73
|
+
- **🔄 서식 보존 무손실 라운드트립** — `patchHwpx(원본HWPX, 편집된마크다운)` 신규 API. 변경된 문단/셀의 텍스트만 원본 XML 안에서 in-place 치환하고 나머지 ZIP 엔트리는 바이트 그대로 보존. 미지원 편집(블록 추가/삭제, 표 구조 변경)은 원본을 건드리지 않고 `skipped[]`로 정직하게 보고하며, 패치 후 자동 재파싱 검증 리포트(`verification`)를 제공합니다.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { parse, patchHwpx } from "kordoc"
|
|
77
|
+
|
|
78
|
+
const r = await parse(buf) // HWPX → 마크다운
|
|
79
|
+
const edited = r.markdown.replace("개최 예정", "개최 완료") // LLM이 편집했다고 가정
|
|
80
|
+
const res = await patchHwpx(new Uint8Array(buf), edited)
|
|
81
|
+
// res.data — 서식 그대로, 텍스트만 바뀐 HWPX 바이트
|
|
82
|
+
// res.applied / res.skipped / res.verification — 적용·미지원·검증 리포트
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- **🎯 "99.9% 정확도" 파서 대도약** — 실측 공문서 코퍼스 324건(정부 보도자료 + 서울시 결재문서 + 2014~2016 옛 문서) 자기참조 채점 기준:
|
|
86
|
+
|
|
87
|
+
| 지표 | v2.9.1 | v3.0.0 |
|
|
88
|
+
|------|--------|--------|
|
|
89
|
+
| HWPX 텍스트 재현율 | 99.699% | **99.998%** |
|
|
90
|
+
| HWPX 표 구조 정확일치 | 99.875% | **100%** (1,421표 · 중첩표 343 포함) |
|
|
91
|
+
| PDF coverage | 97.013% | **99.16%** |
|
|
92
|
+
| HWP5↔HWPX 쌍 유사도 | — | **99.94%** |
|
|
93
|
+
|
|
94
|
+
중첩표 구조 보존(`IRCell.blocks`), 한컴 PUA 매핑, HWP5 이미지 추출(0→90건), 자동번호 카운터, 머리말/각주 정밀 처리 등. 채점기·코퍼스 수집기·게이트는 `bench/`에 포함 — `node bench/score.mjs`로 재현 가능.
|
|
95
|
+
|
|
96
|
+
## v2.9.0 변경사항
|
|
97
|
+
|
|
98
|
+
- **📊 PDF 텍스트 품질 신호 + OCR 필요 판정** — PDF는 텍스트층이 있어도 ToUnicode/CMap 이 깨져 한글이 깨진 글리프로 떨어지거나 NUL 등 제어문자가 섞이는 경우가 많습니다. `parsePdf` 결과에 페이지별 품질 신호(`pageQuality`)와 문서 요약(`qualitySummary`)을 추가 — `needsOcr`/`ocrReason` 으로 OCR 큐 자동 라우팅이 가능. kordoc 은 OCR 을 기본 탑재하지 않고 **신호만** 노출합니다. 전국 지자체 주요업무계획 PDF 190건(45,399쪽) 대량 처리 중 도출. (아래 [PDF 텍스트 품질 신호](#pdf-텍스트-품질-신호-v290) 참고)
|
|
99
|
+
|
|
100
|
+
## v2.8.0 변경사항
|
|
101
|
+
|
|
102
|
+
- **🎨 `markdownToHwpx` 테마 옵션** (#31) — 헤딩/본문/인용/표 헤더 셀의 텍스트 색상과 표 헤더 굵기를 옵션으로 지정 가능. 새 export 타입 `HwpxTheme`, `MarkdownToHwpxOptions`. 옵션 미지정 시 기존과 동일하게 검정으로 출력(baseline 백워드 호환).
|
|
103
|
+
|
|
104
|
+
<details>
|
|
105
|
+
<summary>v2.7.2 변경사항</summary>
|
|
106
|
+
|
|
107
|
+
- **🐛 HWPX 양식 채우기 빈 셀 버그픽스** (#29, #30) — 한컴오피스에서 HWP→HWPX 로 변환한 양식의 빈 값 셀(`<hp:run>` 이 `<hp:t>` 자식 없이 self-closing)에 값이 삽입되지 않으면서 결과에는 성공으로 보고되던 false-positive 수정. `setRunText` 가 `<hp:t>` 없는 run 에 새로 생성해 텍스트 삽입. 기여: @amnotyoung
|
|
108
|
+
|
|
109
|
+
</details>
|
|
110
|
+
|
|
111
|
+
<details>
|
|
112
|
+
<summary>v2.7.1 변경사항</summary>
|
|
71
113
|
|
|
72
114
|
- **🕰️ HWP 3.0 (구버전) 파서 추가** — 1996~2002년 한컴이 쓰던 단일 binary 포맷 (`"HWP Document File V3.00"` 시그니처) 텍스트 추출. 기존 kordoc 이 거부하던 구버전 판결문/공문서 등이 검색 인덱싱 가능. 상용조합형(johab) → 유니코드 + 5,893개 한자/기호 lookup. 표 cell / 머리말 / 각주 의 nested paragraph 재귀 추출. [@edwardkim/rhwp](https://github.com/edwardkim/rhwp) 의 Rust 구현을 TypeScript 로 포팅.
|
|
73
115
|
|
|
74
|
-
|
|
116
|
+
</details>
|
|
117
|
+
|
|
118
|
+
<details>
|
|
119
|
+
<summary>v2.5.0 변경사항</summary>
|
|
75
120
|
|
|
76
121
|
- **🏛️ macOS 한컴오피스 호환 HWPX 생성** (#4) — `markdownToHwpx()` 가 만든 HWPX 가 macOS 한컴에서 "파일이 깨졌다"며 거부되던 문제 해결. 테이블 XML 을 최소 스켈레톤에서 완전 스펙 형태로 재작성 — `<hp:tbl>` 필수 속성 10종 + `<hp:sz>`/`<hp:pos>`/`<hp:outMargin>`/`<hp:inMargin>`, `<hp:tc>` 안에 `<hp:subList>` 래퍼 + `<hp:cellAddr>`/`<hp:cellSpan>`/`<hp:cellSz>`/`<hp:cellMargin>`, paragraph 래핑. `Preview/PrvText.txt` 추가 + `borderFill` id=1(SOLID 0.12mm) 추가.
|
|
77
122
|
- **🔓 HWP 5.x 배포용 문서 COM fallback** (#25) — `.hwp` 바이너리에서 "이 문서는 상위 버전의 배포용 문서입니다..." 경고 플레이스홀더만 나오는 케이스에서, Windows + 한컴오피스 환경이면 자동으로 `HWPFrame.HwpObject` COM API 로 재시도. v2.4.0 의 HWPX DRM fallback 인프라를 `.hwp` 에도 확장.
|
|
78
123
|
|
|
124
|
+
</details>
|
|
125
|
+
|
|
79
126
|
<details>
|
|
80
127
|
<summary>v2.4.0 변경사항</summary>
|
|
81
128
|
|
|
@@ -404,11 +451,13 @@ npx -y kordoc setup
|
|
|
404
451
|
| `parse(buffer, options?)` | 포맷 자동 감지 → Markdown + IRBlock[] |
|
|
405
452
|
| `parseHwpx(buffer, options?)` | HWPX 전용 |
|
|
406
453
|
| `parseHwp(buffer, options?)` | HWP 5.x 전용 |
|
|
454
|
+
| `parseHwp3(buffer, options?)` | HWP 3.x (1996~2002 구버전) 전용 |
|
|
407
455
|
| `parsePdf(buffer, options?)` | PDF 전용 |
|
|
408
456
|
| `parseXlsx(buffer, options?)` | XLSX 전용 |
|
|
457
|
+
| `parseXls(buffer, options?)` | XLS (Excel 97~2003, BIFF8) 전용 |
|
|
409
458
|
| `parseDocx(buffer, options?)` | DOCX 전용 |
|
|
410
459
|
| `parseHwpml(buffer, options?)` | HWPML (XML 기반 HWP) 전용 |
|
|
411
|
-
| `detectFormat(buffer)` | `"hwpx" \| "hwp" \| "hwpml" \| "pdf" \| "xlsx" \| "docx" \| "unknown"` |
|
|
460
|
+
| `detectFormat(buffer)` | `"hwpx" \| "hwp" \| "hwp3" \| "hwpml" \| "pdf" \| "xlsx" \| "xls" \| "docx" \| "unknown"` |
|
|
412
461
|
|
|
413
462
|
### 고급 함수
|
|
414
463
|
|
|
@@ -419,7 +468,11 @@ npx -y kordoc setup
|
|
|
419
468
|
| `fillForm(buffer, values, options?)` | 양식 템플릿에 값 채우기 (markdown/hwpx/hwpx-preserve) |
|
|
420
469
|
| `fillFormFields(blocks, values)` | IRBlock[] 기반 필드 값 교체 |
|
|
421
470
|
| `fillHwpx(buffer, values)` | HWPX XML 직접 조작 (원본 서식 보존) |
|
|
422
|
-
| `
|
|
471
|
+
| `patchHwpx(original, editedMarkdown, options?)` | 편집 마크다운 → 원본 HWPX 서식 보존 in-place 패치 (v3.0) |
|
|
472
|
+
| `markdownToHwpx(markdown, options?)` | Markdown → HWPX 역변환 (테마 옵션 지원) |
|
|
473
|
+
| `markdownToPdf(markdown, options?)` | Markdown → PDF 생성 (Print Renderer) |
|
|
474
|
+
| `blocksToPdf(blocks, options?)` | IRBlock[] → PDF 생성 |
|
|
475
|
+
| `renderHtml(blocks, options?)` | IRBlock[] → 인쇄용 HTML |
|
|
423
476
|
| `blocksToMarkdown(blocks)` | IRBlock[] → Markdown 문자열 |
|
|
424
477
|
|
|
425
478
|
### 타입
|
|
@@ -427,10 +480,13 @@ npx -y kordoc setup
|
|
|
427
480
|
```typescript
|
|
428
481
|
import type {
|
|
429
482
|
ParseResult, ParseSuccess, ParseFailure, FileType,
|
|
430
|
-
IRBlock, IRTable, IRCell, CellContext,
|
|
431
|
-
DocumentMetadata, ParseOptions, ErrorCode,
|
|
483
|
+
IRBlock, IRBlockType, IRTable, IRCell, CellContext,
|
|
484
|
+
DocumentMetadata, ParseOptions, ErrorCode, OutlineItem,
|
|
432
485
|
DiffResult, BlockDiff, CellDiff, DiffChangeType,
|
|
433
|
-
FormField, FormResult, FillResult, HwpxFillResult, FillOutputFormat,
|
|
486
|
+
FormField, FormResult, FillResult, HwpxFillResult, FillOutputFormat, FillFormOutput,
|
|
487
|
+
PatchOptions, PatchResult, PatchSkip,
|
|
488
|
+
HwpxTheme, MarkdownToHwpxOptions,
|
|
489
|
+
PrintPreset, PrintOptions, PageMargin,
|
|
434
490
|
OcrProvider, WatchOptions,
|
|
435
491
|
} from "kordoc"
|
|
436
492
|
```
|
|
@@ -441,9 +497,11 @@ import type {
|
|
|
441
497
|
|------|------|------|
|
|
442
498
|
| **HWPX** (한컴 2020+) | ZIP + XML DOM | 매니페스트, 중첩 테이블, 병합 셀, 손상 ZIP 복구 |
|
|
443
499
|
| **HWP 5.x** (한컴 레거시) | OLE2 + CFB | 배포용 복호화, 손상 CFB 복구, 각주/하이퍼링크, 21종 제어문자, 이미지 추출 |
|
|
500
|
+
| **HWP 3.x** (1996~2002) | 단일 binary | 상용조합형→유니코드, 5,893자 한자/기호 lookup, nested paragraph 추출 |
|
|
444
501
|
| **HWPML 2.x** (XML 기반 HWP) | XML DOM | HeadingType 기반 헤딩 감지, 병합 셀, DoS 방어 |
|
|
445
|
-
| **PDF** | pdfjs-dist | 선 기반 테이블, XY-Cut 읽기 순서, 헤딩 감지, OCR |
|
|
502
|
+
| **PDF** | pdfjs-dist | 선 기반 테이블, XY-Cut 읽기 순서, 헤딩 감지, OCR, 텍스트 품질 신호 |
|
|
446
503
|
| **XLSX** (Excel) | ZIP + XML DOM | 공유 문자열, 병합 셀, 다중 시트, 수식 표시 |
|
|
504
|
+
| **XLS** (Excel 97~2003) | OLE2 + BIFF8 | Workbook 스트림, SST 공유 문자열, 셀/시트 추출 |
|
|
447
505
|
| **DOCX** (Word) | ZIP + XML DOM | 스타일 heading, 번호 매기기, 각주, 이미지 추출 |
|
|
448
506
|
|
|
449
507
|
## 보안
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
blocksToPdf,
|
|
4
|
+
compare,
|
|
5
|
+
diffBlocks,
|
|
6
|
+
extractFormFields,
|
|
7
|
+
fillForm,
|
|
8
|
+
fillFormFields,
|
|
9
|
+
fillHwpx,
|
|
10
|
+
isLabelCell,
|
|
11
|
+
markdownToHwpx,
|
|
12
|
+
markdownToPdf,
|
|
13
|
+
parse,
|
|
14
|
+
parseDocx,
|
|
15
|
+
parseHwp,
|
|
16
|
+
parseHwp3,
|
|
17
|
+
parseHwpml,
|
|
18
|
+
parseHwpx,
|
|
19
|
+
parsePdf,
|
|
20
|
+
parseXls,
|
|
21
|
+
parseXlsx,
|
|
22
|
+
patchHwpx,
|
|
23
|
+
renderHtml
|
|
24
|
+
} from "./chunk-326STEDU.js";
|
|
25
|
+
import {
|
|
26
|
+
detectFormat,
|
|
27
|
+
detectOle2Format,
|
|
28
|
+
detectZipFormat,
|
|
29
|
+
isHwpxFile,
|
|
30
|
+
isOldHwpFile,
|
|
31
|
+
isPdfFile,
|
|
32
|
+
isZipFile
|
|
33
|
+
} from "./chunk-MEPHGCPQ.js";
|
|
34
|
+
import {
|
|
35
|
+
VERSION,
|
|
36
|
+
blocksToMarkdown
|
|
37
|
+
} from "./chunk-SA2PERJ5.js";
|
|
38
|
+
import "./chunk-MOL7MDBG.js";
|
|
39
|
+
export {
|
|
40
|
+
VERSION,
|
|
41
|
+
blocksToMarkdown,
|
|
42
|
+
blocksToPdf,
|
|
43
|
+
compare,
|
|
44
|
+
detectFormat,
|
|
45
|
+
detectOle2Format,
|
|
46
|
+
detectZipFormat,
|
|
47
|
+
diffBlocks,
|
|
48
|
+
extractFormFields,
|
|
49
|
+
fillForm,
|
|
50
|
+
fillFormFields,
|
|
51
|
+
fillHwpx,
|
|
52
|
+
isHwpxFile,
|
|
53
|
+
isLabelCell,
|
|
54
|
+
isOldHwpFile,
|
|
55
|
+
isPdfFile,
|
|
56
|
+
isZipFile,
|
|
57
|
+
markdownToHwpx,
|
|
58
|
+
markdownToPdf,
|
|
59
|
+
parse,
|
|
60
|
+
parseDocx,
|
|
61
|
+
parseHwp,
|
|
62
|
+
parseHwp3,
|
|
63
|
+
parseHwpml,
|
|
64
|
+
parseHwpx,
|
|
65
|
+
parsePdf,
|
|
66
|
+
parseXls,
|
|
67
|
+
parseXlsx,
|
|
68
|
+
patchHwpx,
|
|
69
|
+
renderHtml
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=-K5SLEFZD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|