kordoc 2.9.1 → 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 +28 -0
- package/dist/-K5SLEFZD.js +71 -0
- package/dist/-K5SLEFZD.js.map +1 -0
- package/dist/{chunk-GQQNAYZA.js → chunk-326STEDU.js} +6684 -4061
- package/dist/chunk-326STEDU.js.map +1 -0
- package/dist/{chunk-FWAXCTSX.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-Z6TLTWYK.js → chunk-NHXKJWR7.js} +182 -13
- package/dist/chunk-NHXKJWR7.js.map +1 -0
- package/dist/{chunk-ODF24QXC.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-BKYM3LKN.js → parser-4IVYHKSL.js} +677 -85
- package/dist/parser-4IVYHKSL.js.map +1 -0
- package/dist/{parser-BTIPAEDZ.cjs → parser-5KHU732L.cjs} +689 -97
- package/dist/parser-5KHU732L.cjs.map +1 -0
- package/dist/{parser-FJNQEW7K.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-SBLSWHL7.js → watch-5DDN4BUI.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-FWAXCTSX.cjs.map +0 -1
- package/dist/chunk-GQQNAYZA.js.map +0 -1
- package/dist/chunk-ODF24QXC.js.map +0 -1
- package/dist/chunk-Z6TLTWYK.js.map +0 -1
- package/dist/parser-BKYM3LKN.js.map +0 -1
- package/dist/parser-BTIPAEDZ.cjs.map +0 -1
- package/dist/parser-FJNQEW7K.js.map +0 -1
- /package/dist/{watch-SBLSWHL7.js.map → watch-5DDN4BUI.js.map} +0 -0
package/README.md
CHANGED
|
@@ -62,11 +62,37 @@ 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
|
|
|
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
|
+
|
|
70
96
|
## v2.9.0 변경사항
|
|
71
97
|
|
|
72
98
|
- **📊 PDF 텍스트 품질 신호 + OCR 필요 판정** — PDF는 텍스트층이 있어도 ToUnicode/CMap 이 깨져 한글이 깨진 글리프로 떨어지거나 NUL 등 제어문자가 섞이는 경우가 많습니다. `parsePdf` 결과에 페이지별 품질 신호(`pageQuality`)와 문서 요약(`qualitySummary`)을 추가 — `needsOcr`/`ocrReason` 으로 OCR 큐 자동 라우팅이 가능. kordoc 은 OCR 을 기본 탑재하지 않고 **신호만** 노출합니다. 전국 지자체 주요업무계획 PDF 190건(45,399쪽) 대량 처리 중 도출. (아래 [PDF 텍스트 품질 신호](#pdf-텍스트-품질-신호-v290) 참고)
|
|
@@ -442,6 +468,7 @@ npx -y kordoc setup
|
|
|
442
468
|
| `fillForm(buffer, values, options?)` | 양식 템플릿에 값 채우기 (markdown/hwpx/hwpx-preserve) |
|
|
443
469
|
| `fillFormFields(blocks, values)` | IRBlock[] 기반 필드 값 교체 |
|
|
444
470
|
| `fillHwpx(buffer, values)` | HWPX XML 직접 조작 (원본 서식 보존) |
|
|
471
|
+
| `patchHwpx(original, editedMarkdown, options?)` | 편집 마크다운 → 원본 HWPX 서식 보존 in-place 패치 (v3.0) |
|
|
445
472
|
| `markdownToHwpx(markdown, options?)` | Markdown → HWPX 역변환 (테마 옵션 지원) |
|
|
446
473
|
| `markdownToPdf(markdown, options?)` | Markdown → PDF 생성 (Print Renderer) |
|
|
447
474
|
| `blocksToPdf(blocks, options?)` | IRBlock[] → PDF 생성 |
|
|
@@ -457,6 +484,7 @@ import type {
|
|
|
457
484
|
DocumentMetadata, ParseOptions, ErrorCode, OutlineItem,
|
|
458
485
|
DiffResult, BlockDiff, CellDiff, DiffChangeType,
|
|
459
486
|
FormField, FormResult, FillResult, HwpxFillResult, FillOutputFormat, FillFormOutput,
|
|
487
|
+
PatchOptions, PatchResult, PatchSkip,
|
|
460
488
|
HwpxTheme, MarkdownToHwpxOptions,
|
|
461
489
|
PrintPreset, PrintOptions, PageMargin,
|
|
462
490
|
OcrProvider, WatchOptions,
|
|
@@ -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":[]}
|