kordoc 4.1.0 → 4.2.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 +25 -5
- package/dist/{-AS4IABL2.js → -SXQIZHYA.js} +10 -9
- package/dist/{parser-PEOYBXBO.js → chunk-26AJJCFF.js} +1339 -2023
- package/dist/chunk-26AJJCFF.js.map +1 -0
- package/dist/{parser-XX4QTDFQ.js → chunk-4JPPLIIV.js} +1337 -2019
- package/dist/chunk-4JPPLIIV.js.map +1 -0
- package/dist/chunk-4VNLZ2GZ.js +13 -0
- package/dist/chunk-4VNLZ2GZ.js.map +1 -0
- package/dist/{chunk-37HJHCPA.js → chunk-6SHO3BNV.js} +3 -3
- package/dist/{chunk-UOO7LSDG.js → chunk-7FCNOKOR.js} +1 -9
- package/dist/chunk-7FCNOKOR.js.map +1 -0
- package/dist/{chunk-SSTK6IKK.js → chunk-CMN3SYZ3.js} +14 -5
- package/dist/chunk-CMN3SYZ3.js.map +1 -0
- package/dist/{chunk-F2ZU3IZG.js → chunk-ELOV2GIJ.js} +2 -2
- package/dist/chunk-F2HYH62H.cjs +130 -0
- package/dist/chunk-F2HYH62H.cjs.map +1 -0
- package/dist/{chunk-O5VS7RIR.js → chunk-FSXLSHCW.js} +3 -3
- package/dist/{chunk-O5VS7RIR.js.map → chunk-FSXLSHCW.js.map} +1 -1
- package/dist/chunk-GEPINOL6.js +83 -0
- package/dist/chunk-GEPINOL6.js.map +1 -0
- package/dist/chunk-H7OWEYH2.cjs +243 -0
- package/dist/chunk-H7OWEYH2.cjs.map +1 -0
- package/dist/{chunk-L2XQQTOY.js → chunk-IGGRLWT5.js} +126 -46
- package/dist/chunk-IGGRLWT5.js.map +1 -0
- package/dist/chunk-J2RZ444H.js +243 -0
- package/dist/chunk-J2RZ444H.js.map +1 -0
- package/dist/chunk-JP5YH3Z4.js +130 -0
- package/dist/chunk-JP5YH3Z4.js.map +1 -0
- package/dist/{parser-N4A7UGDK.cjs → chunk-LHROM2BO.cjs} +1300 -1985
- package/dist/chunk-LHROM2BO.cjs.map +1 -0
- package/dist/chunk-NNDVFNMJ.js +246 -0
- package/dist/chunk-NNDVFNMJ.js.map +1 -0
- package/dist/{chunk-WO52HVQJ.js → chunk-PLIY23LY.js} +2 -2
- package/dist/{chunk-GQVSHGG4.js → chunk-V6U6YS5B.js} +2 -2
- package/dist/{chunk-4KI23VHA.js → chunk-WF2E5P2G.js} +16 -130
- package/dist/chunk-WF2E5P2G.js.map +1 -0
- package/dist/{chunk-AX2R5Q2N.js → chunk-WQLHPOMJ.js} +3 -3
- package/dist/{chunk-37VKMUST.cjs → chunk-XTCT6KQ5.cjs} +34 -148
- package/dist/chunk-XTCT6KQ5.cjs.map +1 -0
- package/dist/chunks-ZQEFAZNC.js +10 -0
- package/dist/cli.js +76 -19
- package/dist/cli.js.map +1 -1
- package/dist/{formula-RXVSQPXI.js → formula-KSNAEBZ2.js} +23 -232
- package/dist/formula-KSNAEBZ2.js.map +1 -0
- package/dist/{formula-5NKVS2LR.cjs → formula-SB3NHDUM.cjs} +30 -240
- package/dist/formula-SB3NHDUM.cjs.map +1 -0
- package/dist/{formula-JCNF43NE.js → formula-SXC6LRRC.js} +23 -233
- package/dist/formula-SXC6LRRC.js.map +1 -0
- package/dist/index.cjs +527 -447
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +129 -49
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +21 -19
- package/dist/mcp.js.map +1 -1
- package/dist/models-KA4GLQK5.js +25 -0
- package/dist/parser-ND2YGQZR.js +800 -0
- package/dist/parser-ND2YGQZR.js.map +1 -0
- package/dist/parser-RBZHA6SY.js +804 -0
- package/dist/parser-RBZHA6SY.js.map +1 -0
- package/dist/parser-WDZOMDG4.cjs +803 -0
- package/dist/parser-WDZOMDG4.cjs.map +1 -0
- package/dist/pdf-ocr-2Z7VZIFI.cjs +439 -0
- package/dist/pdf-ocr-2Z7VZIFI.cjs.map +1 -0
- package/dist/pdf-ocr-FJFXFADQ.js +438 -0
- package/dist/pdf-ocr-FJFXFADQ.js.map +1 -0
- package/dist/pdf-ocr-VYE4DHD4.js +386 -0
- package/dist/pdf-ocr-VYE4DHD4.js.map +1 -0
- package/dist/{profile-io-PLDQFPJA.js → profile-io-TWHDIVPL.js} +3 -3
- package/dist/{rasterize-WWNQLKYW.js → rasterize-W2NEZUSW.js} +2 -2
- package/dist/render-4MG5QUDG.js +10 -0
- package/dist/seal-D2QNXJVO.js +10 -0
- package/dist/seal-D2QNXJVO.js.map +1 -0
- package/dist/{watch-SFHXZALC.js → watch-VWXJZT2R.js} +11 -10
- package/dist/watch-VWXJZT2R.js.map +1 -0
- package/package.json +2 -1
- package/dist/chunk-37VKMUST.cjs.map +0 -1
- package/dist/chunk-4KI23VHA.js.map +0 -1
- package/dist/chunk-L2XQQTOY.js.map +0 -1
- package/dist/chunk-SSTK6IKK.js.map +0 -1
- package/dist/chunk-UOO7LSDG.js.map +0 -1
- package/dist/chunks-WVMGF7JL.js +0 -10
- package/dist/formula-5NKVS2LR.cjs.map +0 -1
- package/dist/formula-JCNF43NE.js.map +0 -1
- package/dist/formula-RXVSQPXI.js.map +0 -1
- package/dist/parser-N4A7UGDK.cjs.map +0 -1
- package/dist/parser-PEOYBXBO.js.map +0 -1
- package/dist/parser-XX4QTDFQ.js.map +0 -1
- package/dist/provider-4FAYHJ6N.cjs +0 -39
- package/dist/provider-4FAYHJ6N.cjs.map +0 -1
- package/dist/provider-C6IOGIS5.js +0 -37
- package/dist/provider-C6IOGIS5.js.map +0 -1
- package/dist/provider-UIBW2MIH.js +0 -39
- package/dist/provider-UIBW2MIH.js.map +0 -1
- package/dist/render-T7S6H6AN.js +0 -10
- package/dist/seal-7PTL6MXH.js +0 -10
- package/dist/watch-SFHXZALC.js.map +0 -1
- /package/dist/{-AS4IABL2.js.map → -SXQIZHYA.js.map} +0 -0
- /package/dist/{chunk-37HJHCPA.js.map → chunk-6SHO3BNV.js.map} +0 -0
- /package/dist/{chunk-F2ZU3IZG.js.map → chunk-ELOV2GIJ.js.map} +0 -0
- /package/dist/{chunk-WO52HVQJ.js.map → chunk-PLIY23LY.js.map} +0 -0
- /package/dist/{chunk-GQVSHGG4.js.map → chunk-V6U6YS5B.js.map} +0 -0
- /package/dist/{chunk-AX2R5Q2N.js.map → chunk-WQLHPOMJ.js.map} +0 -0
- /package/dist/{chunks-WVMGF7JL.js.map → chunks-ZQEFAZNC.js.map} +0 -0
- /package/dist/{profile-io-PLDQFPJA.js.map → models-KA4GLQK5.js.map} +0 -0
- /package/dist/{render-T7S6H6AN.js.map → profile-io-TWHDIVPL.js.map} +0 -0
- /package/dist/{rasterize-WWNQLKYW.js.map → rasterize-W2NEZUSW.js.map} +0 -0
- /package/dist/{seal-7PTL6MXH.js.map → render-4MG5QUDG.js.map} +0 -0
package/README.md
CHANGED
|
@@ -84,6 +84,12 @@ MCP 등록 대신 스킬(SKILL.md) 형태로 쓰려면:
|
|
|
84
84
|
|
|
85
85
|
---
|
|
86
86
|
|
|
87
|
+
## v4.2.0 변경사항
|
|
88
|
+
|
|
89
|
+
- **👓 내장 텍스트 OCR (PP-OCRv5 korean)**: 스캔/이미지 PDF를 **API 키 없이 로컬 추론**으로 읽습니다 — `parse(buffer, { ocr: true })` / CLI `--ocr` / MCP `parse_document`의 `ocr` 옵션. 모델 ~18MB는 첫 사용 시 자동 다운로드+SHA 검증. 품질 신호가 가리키는 페이지(스캔·글꼴 매핑 깨짐)만 정밀 OCR 하고 정상 페이지는 그대로 두며, OCR 라인 좌표를 표 감지 파이프라인에 태워 **스캔본에서도 표가 복원**됩니다. 한국어 사전 11,945자(완성형 한글 전량), 1페이지 ≈1초.
|
|
90
|
+
- **🩹 HWP3 구버전 파서 정합 3종**: 탭/필드코드/책갈피의 스트림 소비 결함으로 이후 텍스트가 통째로 오염되던 것과, 로마숫자(Ⅰ~Ⅹ)·원문자(①~⑩)·따옴표·글머리가 증발하던 것을 원저장소(rhwp) 후속 패치 반영으로 수리.
|
|
91
|
+
- **🐛 수식 OCR 페이지 off-by-one 수리**: `--pages` 필터가 한 페이지 밀리고 수식이 이전 페이지에 붙던 잠복 결함. XLSX/XLS `--keep-empty-cols` 배선 누락도 수리.
|
|
92
|
+
|
|
87
93
|
## v4.1.0 변경사항
|
|
88
94
|
|
|
89
95
|
- **👁️ `render_document` MCP 도구 신설**: 생성·패치·양식 채움 결과 HWPX를 조판 그대로 **PNG 이미지로 응답에 직접 반환** — AI가 자기가 만든 문서를 눈으로 확인하고 다시 고치는 루프가 MCP 안에서 닫힙니다 (한컴 저장본은 조판 캐시, 생성본은 reflow 조판, 검색어 형광펜 지원).
|
|
@@ -491,7 +497,7 @@ MCP 등록 대신 스킬(SKILL.md) 형태로 쓰려면:
|
|
|
491
497
|
- **구조화 파싱** — `IRBlock[]`과 `DocumentMetadata`에 직접 접근. 마크다운 넘어선 데이터 활용.
|
|
492
498
|
- **페이지 범위** — `parse(buffer, { pages: "1-3" })` — 필요한 페이지만 빠르게.
|
|
493
499
|
- **Markdown → HWPX** — 역변환. AI가 생성한 내용을 바로 공문서로.
|
|
494
|
-
- **OCR
|
|
500
|
+
- **OCR** — 스캔/이미지 PDF 텍스트 추출. 내장 엔진(`ocr: true`, PP-OCRv5 korean) 또는 외부 프로바이더(Tesseract, Claude Vision 등).
|
|
495
501
|
- **Watch 모드** — `kordoc watch ./수신함 -d ./변환결과 --webhook https://...`
|
|
496
502
|
- **MCP 7개 도구** — parse_document, detect_format, parse_metadata, parse_pages, parse_table, compare_documents, parse_form
|
|
497
503
|
- **에러 코드** — `"ENCRYPTED"`, `"ZIP_BOMB"`, `"IMAGE_BASED_PDF"` 등 구조화된 에러 핸들링
|
|
@@ -638,12 +644,26 @@ const result = await parse(buffer, { pages: "1-3" }) // 1~3 페이지만
|
|
|
638
644
|
const result = await parse(buffer, { pages: [1, 5, 10] }) // 특정 페이지
|
|
639
645
|
```
|
|
640
646
|
|
|
641
|
-
### OCR (
|
|
647
|
+
### OCR (스캔/이미지 PDF) — 내장 엔진 (v4.2.0+)
|
|
648
|
+
|
|
649
|
+
```typescript
|
|
650
|
+
// 내장 OCR (PP-OCRv5 korean, 첫 사용 시 모델 ~18MB 자동 다운로드)
|
|
651
|
+
const result = await parse(buffer, { ocr: true }) // OCR 필요 페이지만 자동 판정
|
|
652
|
+
const result = await parse(buffer, { ocr: "force" }) // 전 페이지 강제 OCR
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
- **API 키·외부 서비스 불필요** — det(선 검출)+rec(CTC 인식) ONNX 를 로컬 CPU 로 추론합니다
|
|
656
|
+
(PaddlePaddle 공식 변환본, Apache-2.0 / 한국어 사전 11,945자 — 완성형 한글 전량).
|
|
657
|
+
- **페이지 단위 정밀 적용** — 텍스트층이 없는 스캔 페이지, ToUnicode 가 깨진 페이지
|
|
658
|
+
(`needsOcr` 신호)만 OCR 하고 정상 페이지의 파싱 결과는 그대로 유지합니다.
|
|
659
|
+
- **표 복원** — OCR 라인 좌표를 기존 블록 파이프라인(xy-cut 읽기 순서 + 클러스터 표
|
|
660
|
+
감지)에 태우므로 스캔본에서도 표 구조가 복원됩니다.
|
|
661
|
+
- 외부 OCR 을 쓰고 싶으면 종전대로 프로바이더 함수를 전달하세요:
|
|
642
662
|
|
|
643
663
|
```typescript
|
|
644
664
|
const result = await parse(buffer, {
|
|
645
665
|
ocr: async (pageImage, pageNumber, mimeType) => {
|
|
646
|
-
return await myOcrService.recognize(pageImage)
|
|
666
|
+
return await myOcrService.recognize(pageImage) // Claude Vision, Tesseract 등
|
|
647
667
|
}
|
|
648
668
|
})
|
|
649
669
|
```
|
|
@@ -655,8 +675,8 @@ PDF는 텍스트층이 있어도 ToUnicode/CMap이 깨졌거나 NUL 등 제어
|
|
|
655
675
|
```typescript
|
|
656
676
|
const r = await parsePdf(buffer)
|
|
657
677
|
if (r.success && r.qualitySummary?.needsOcr) {
|
|
658
|
-
// OCR
|
|
659
|
-
await
|
|
678
|
+
// 내장 OCR 로 재시도 (v4.2.0+) — 또는 외부 OCR 큐로 라우팅
|
|
679
|
+
const retried = await parse(buffer, { ocr: true })
|
|
660
680
|
}
|
|
661
681
|
|
|
662
682
|
// 페이지 단위 신호
|
|
@@ -39,8 +39,9 @@ import {
|
|
|
39
39
|
renderHtml,
|
|
40
40
|
unknownFontWarnings,
|
|
41
41
|
validateHwpx
|
|
42
|
-
} from "./chunk-
|
|
43
|
-
import "./chunk-
|
|
42
|
+
} from "./chunk-IGGRLWT5.js";
|
|
43
|
+
import "./chunk-7FCNOKOR.js";
|
|
44
|
+
import "./chunk-4VNLZ2GZ.js";
|
|
44
45
|
import {
|
|
45
46
|
detectFormat,
|
|
46
47
|
detectOle2Format,
|
|
@@ -57,7 +58,7 @@ import {
|
|
|
57
58
|
buildRangeSplices,
|
|
58
59
|
placeSealHwpx,
|
|
59
60
|
scanSectionXml
|
|
60
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-WQLHPOMJ.js";
|
|
61
62
|
import {
|
|
62
63
|
DEFAULT_REDACT_RULES,
|
|
63
64
|
redactMarkdown,
|
|
@@ -65,10 +66,10 @@ import {
|
|
|
65
66
|
} from "./chunk-DZIXKL7E.js";
|
|
66
67
|
import {
|
|
67
68
|
blocksToChunks
|
|
68
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-ELOV2GIJ.js";
|
|
69
70
|
import {
|
|
70
71
|
blocksToMarkdown
|
|
71
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-CMN3SYZ3.js";
|
|
72
73
|
import {
|
|
73
74
|
SPACE_EM_FIXED,
|
|
74
75
|
SPACE_EM_FONT,
|
|
@@ -78,11 +79,11 @@ import {
|
|
|
78
79
|
renderHwpxToSvg,
|
|
79
80
|
simulateWrap,
|
|
80
81
|
simulateWrapKeepWord
|
|
81
|
-
} from "./chunk-
|
|
82
|
-
import "./chunk-
|
|
82
|
+
} from "./chunk-6SHO3BNV.js";
|
|
83
|
+
import "./chunk-V6U6YS5B.js";
|
|
83
84
|
import {
|
|
84
85
|
VERSION
|
|
85
|
-
} from "./chunk-
|
|
86
|
+
} from "./chunk-FSXLSHCW.js";
|
|
86
87
|
export {
|
|
87
88
|
DEFAULT_REDACT_RULES,
|
|
88
89
|
HwpxSession,
|
|
@@ -150,4 +151,4 @@ export {
|
|
|
150
151
|
unknownFontWarnings,
|
|
151
152
|
validateHwpx
|
|
152
153
|
};
|
|
153
|
-
//# sourceMappingURL=-
|
|
154
|
+
//# sourceMappingURL=-SXQIZHYA.js.map
|