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.
Files changed (109) hide show
  1. package/README.md +25 -5
  2. package/dist/{-AS4IABL2.js → -SXQIZHYA.js} +10 -9
  3. package/dist/{parser-PEOYBXBO.js → chunk-26AJJCFF.js} +1339 -2023
  4. package/dist/chunk-26AJJCFF.js.map +1 -0
  5. package/dist/{parser-XX4QTDFQ.js → chunk-4JPPLIIV.js} +1337 -2019
  6. package/dist/chunk-4JPPLIIV.js.map +1 -0
  7. package/dist/chunk-4VNLZ2GZ.js +13 -0
  8. package/dist/chunk-4VNLZ2GZ.js.map +1 -0
  9. package/dist/{chunk-37HJHCPA.js → chunk-6SHO3BNV.js} +3 -3
  10. package/dist/{chunk-UOO7LSDG.js → chunk-7FCNOKOR.js} +1 -9
  11. package/dist/chunk-7FCNOKOR.js.map +1 -0
  12. package/dist/{chunk-SSTK6IKK.js → chunk-CMN3SYZ3.js} +14 -5
  13. package/dist/chunk-CMN3SYZ3.js.map +1 -0
  14. package/dist/{chunk-F2ZU3IZG.js → chunk-ELOV2GIJ.js} +2 -2
  15. package/dist/chunk-F2HYH62H.cjs +130 -0
  16. package/dist/chunk-F2HYH62H.cjs.map +1 -0
  17. package/dist/{chunk-O5VS7RIR.js → chunk-FSXLSHCW.js} +3 -3
  18. package/dist/{chunk-O5VS7RIR.js.map → chunk-FSXLSHCW.js.map} +1 -1
  19. package/dist/chunk-GEPINOL6.js +83 -0
  20. package/dist/chunk-GEPINOL6.js.map +1 -0
  21. package/dist/chunk-H7OWEYH2.cjs +243 -0
  22. package/dist/chunk-H7OWEYH2.cjs.map +1 -0
  23. package/dist/{chunk-L2XQQTOY.js → chunk-IGGRLWT5.js} +126 -46
  24. package/dist/chunk-IGGRLWT5.js.map +1 -0
  25. package/dist/chunk-J2RZ444H.js +243 -0
  26. package/dist/chunk-J2RZ444H.js.map +1 -0
  27. package/dist/chunk-JP5YH3Z4.js +130 -0
  28. package/dist/chunk-JP5YH3Z4.js.map +1 -0
  29. package/dist/{parser-N4A7UGDK.cjs → chunk-LHROM2BO.cjs} +1300 -1985
  30. package/dist/chunk-LHROM2BO.cjs.map +1 -0
  31. package/dist/chunk-NNDVFNMJ.js +246 -0
  32. package/dist/chunk-NNDVFNMJ.js.map +1 -0
  33. package/dist/{chunk-WO52HVQJ.js → chunk-PLIY23LY.js} +2 -2
  34. package/dist/{chunk-GQVSHGG4.js → chunk-V6U6YS5B.js} +2 -2
  35. package/dist/{chunk-4KI23VHA.js → chunk-WF2E5P2G.js} +16 -130
  36. package/dist/chunk-WF2E5P2G.js.map +1 -0
  37. package/dist/{chunk-AX2R5Q2N.js → chunk-WQLHPOMJ.js} +3 -3
  38. package/dist/{chunk-37VKMUST.cjs → chunk-XTCT6KQ5.cjs} +34 -148
  39. package/dist/chunk-XTCT6KQ5.cjs.map +1 -0
  40. package/dist/chunks-ZQEFAZNC.js +10 -0
  41. package/dist/cli.js +76 -19
  42. package/dist/cli.js.map +1 -1
  43. package/dist/{formula-RXVSQPXI.js → formula-KSNAEBZ2.js} +23 -232
  44. package/dist/formula-KSNAEBZ2.js.map +1 -0
  45. package/dist/{formula-5NKVS2LR.cjs → formula-SB3NHDUM.cjs} +30 -240
  46. package/dist/formula-SB3NHDUM.cjs.map +1 -0
  47. package/dist/{formula-JCNF43NE.js → formula-SXC6LRRC.js} +23 -233
  48. package/dist/formula-SXC6LRRC.js.map +1 -0
  49. package/dist/index.cjs +527 -447
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +7 -3
  52. package/dist/index.d.ts +7 -3
  53. package/dist/index.js +129 -49
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp.js +21 -19
  56. package/dist/mcp.js.map +1 -1
  57. package/dist/models-KA4GLQK5.js +25 -0
  58. package/dist/parser-ND2YGQZR.js +800 -0
  59. package/dist/parser-ND2YGQZR.js.map +1 -0
  60. package/dist/parser-RBZHA6SY.js +804 -0
  61. package/dist/parser-RBZHA6SY.js.map +1 -0
  62. package/dist/parser-WDZOMDG4.cjs +803 -0
  63. package/dist/parser-WDZOMDG4.cjs.map +1 -0
  64. package/dist/pdf-ocr-2Z7VZIFI.cjs +439 -0
  65. package/dist/pdf-ocr-2Z7VZIFI.cjs.map +1 -0
  66. package/dist/pdf-ocr-FJFXFADQ.js +438 -0
  67. package/dist/pdf-ocr-FJFXFADQ.js.map +1 -0
  68. package/dist/pdf-ocr-VYE4DHD4.js +386 -0
  69. package/dist/pdf-ocr-VYE4DHD4.js.map +1 -0
  70. package/dist/{profile-io-PLDQFPJA.js → profile-io-TWHDIVPL.js} +3 -3
  71. package/dist/{rasterize-WWNQLKYW.js → rasterize-W2NEZUSW.js} +2 -2
  72. package/dist/render-4MG5QUDG.js +10 -0
  73. package/dist/seal-D2QNXJVO.js +10 -0
  74. package/dist/seal-D2QNXJVO.js.map +1 -0
  75. package/dist/{watch-SFHXZALC.js → watch-VWXJZT2R.js} +11 -10
  76. package/dist/watch-VWXJZT2R.js.map +1 -0
  77. package/package.json +2 -1
  78. package/dist/chunk-37VKMUST.cjs.map +0 -1
  79. package/dist/chunk-4KI23VHA.js.map +0 -1
  80. package/dist/chunk-L2XQQTOY.js.map +0 -1
  81. package/dist/chunk-SSTK6IKK.js.map +0 -1
  82. package/dist/chunk-UOO7LSDG.js.map +0 -1
  83. package/dist/chunks-WVMGF7JL.js +0 -10
  84. package/dist/formula-5NKVS2LR.cjs.map +0 -1
  85. package/dist/formula-JCNF43NE.js.map +0 -1
  86. package/dist/formula-RXVSQPXI.js.map +0 -1
  87. package/dist/parser-N4A7UGDK.cjs.map +0 -1
  88. package/dist/parser-PEOYBXBO.js.map +0 -1
  89. package/dist/parser-XX4QTDFQ.js.map +0 -1
  90. package/dist/provider-4FAYHJ6N.cjs +0 -39
  91. package/dist/provider-4FAYHJ6N.cjs.map +0 -1
  92. package/dist/provider-C6IOGIS5.js +0 -37
  93. package/dist/provider-C6IOGIS5.js.map +0 -1
  94. package/dist/provider-UIBW2MIH.js +0 -39
  95. package/dist/provider-UIBW2MIH.js.map +0 -1
  96. package/dist/render-T7S6H6AN.js +0 -10
  97. package/dist/seal-7PTL6MXH.js +0 -10
  98. package/dist/watch-SFHXZALC.js.map +0 -1
  99. /package/dist/{-AS4IABL2.js.map → -SXQIZHYA.js.map} +0 -0
  100. /package/dist/{chunk-37HJHCPA.js.map → chunk-6SHO3BNV.js.map} +0 -0
  101. /package/dist/{chunk-F2ZU3IZG.js.map → chunk-ELOV2GIJ.js.map} +0 -0
  102. /package/dist/{chunk-WO52HVQJ.js.map → chunk-PLIY23LY.js.map} +0 -0
  103. /package/dist/{chunk-GQVSHGG4.js.map → chunk-V6U6YS5B.js.map} +0 -0
  104. /package/dist/{chunk-AX2R5Q2N.js.map → chunk-WQLHPOMJ.js.map} +0 -0
  105. /package/dist/{chunks-WVMGF7JL.js.map → chunks-ZQEFAZNC.js.map} +0 -0
  106. /package/dist/{profile-io-PLDQFPJA.js.map → models-KA4GLQK5.js.map} +0 -0
  107. /package/dist/{render-T7S6H6AN.js.map → profile-io-TWHDIVPL.js.map} +0 -0
  108. /package/dist/{rasterize-WWNQLKYW.js.map → rasterize-W2NEZUSW.js.map} +0 -0
  109. /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 연동** 이미지 기반 PDF 텍스트 추출 (Tesseract, Claude Vision 등 프로바이더 직접 제공).
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 (이미지 PDF)
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 큐로 라우팅 (kordoc은 OCR 기본 탑재하지 않음)
659
- await routeToOcr(buffer, r.qualitySummary.ocrCandidatePages)
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-L2XQQTOY.js";
43
- import "./chunk-UOO7LSDG.js";
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-AX2R5Q2N.js";
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-F2ZU3IZG.js";
69
+ } from "./chunk-ELOV2GIJ.js";
69
70
  import {
70
71
  blocksToMarkdown
71
- } from "./chunk-SSTK6IKK.js";
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-37HJHCPA.js";
82
- import "./chunk-GQVSHGG4.js";
82
+ } from "./chunk-6SHO3BNV.js";
83
+ import "./chunk-V6U6YS5B.js";
83
84
  import {
84
85
  VERSION
85
- } from "./chunk-O5VS7RIR.js";
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=-AS4IABL2.js.map
154
+ //# sourceMappingURL=-SXQIZHYA.js.map