kordoc 4.24.37 → 4.24.38

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 (190) hide show
  1. package/README.md +3 -3
  2. package/dist/{-HX3RWDQF.js → -LPQSUCWH.js} +60 -60
  3. package/dist/{chunk-VRCXXZHT.js → chunk-3NZP2VXB.js} +2 -2
  4. package/dist/{chunk-4OWD6WRS.js → chunk-5IYRVLGJ.js} +58 -7
  5. package/dist/{chunk-524MGRNW.js.map → chunk-5IYRVLGJ.js.map} +1 -1
  6. package/dist/{chunk-P3SZJJRK.js → chunk-5PONVN46.js} +7 -7
  7. package/dist/{chunk-QWYIYVIZ.cjs → chunk-6COUUT2E.cjs} +2 -2
  8. package/dist/{chunk-QWYIYVIZ.cjs.map → chunk-6COUUT2E.cjs.map} +1 -1
  9. package/dist/{chunk-BT5RPLV4.js → chunk-6MTH2EYN.js} +19 -19
  10. package/dist/{chunk-64MVXWS5.js → chunk-7F42AI4O.js} +2 -2
  11. package/dist/{chunk-4MWGWS3B.js → chunk-7F63OEHI.js} +2 -2
  12. package/dist/{chunk-IOABX3GR.cjs → chunk-ACQBUQB6.cjs} +153 -143
  13. package/dist/chunk-ACQBUQB6.cjs.map +1 -0
  14. package/dist/{chunk-6XOJ6CEK.js → chunk-AZ56HT3M.js} +3 -3
  15. package/dist/{chunk-OTB6UOIB.js → chunk-CDVDRC77.js} +2 -2
  16. package/dist/{chunk-MTSWWXSB.js → chunk-FA3MQGIF.js} +2 -2
  17. package/dist/{chunk-E527FG6I.cjs → chunk-FZWI6S7M.cjs} +3 -3
  18. package/dist/{chunk-E527FG6I.cjs.map → chunk-FZWI6S7M.cjs.map} +1 -1
  19. package/dist/{chunk-IWCWO3GP.js → chunk-G3JUKDMB.js} +2 -2
  20. package/dist/{chunk-2LDFUVVF.js → chunk-HWSJAYMR.js} +16 -7
  21. package/dist/chunk-HWSJAYMR.js.map +1 -0
  22. package/dist/{chunk-J42O5KBX.js → chunk-IDCU74H5.js} +2 -2
  23. package/dist/{chunk-KFJKRST5.js → chunk-ISMJQJOP.js} +14 -4
  24. package/dist/chunk-ISMJQJOP.js.map +1 -0
  25. package/dist/{chunk-RBCDHT55.cjs → chunk-JEHCRYUT.cjs} +98 -98
  26. package/dist/{chunk-RBCDHT55.cjs.map → chunk-JEHCRYUT.cjs.map} +1 -1
  27. package/dist/{chunk-524MGRNW.js → chunk-JL5REIEZ.js} +62 -11
  28. package/dist/{chunk-4OWD6WRS.js.map → chunk-JL5REIEZ.js.map} +1 -1
  29. package/dist/{chunk-BYOAA442.js → chunk-LAKPAL53.js} +2 -2
  30. package/dist/{chunk-J26TNCL7.js → chunk-MLXVSAR3.js} +2 -2
  31. package/dist/{chunk-6SVVVZLV.js → chunk-MNXKORB5.js} +2 -2
  32. package/dist/{chunk-33BKUIIC.js → chunk-MSRDRUOV.js} +2 -2
  33. package/dist/{chunk-7GN7O3K2.js → chunk-OBZV23UV.js} +51 -51
  34. package/dist/{chunk-B2VRTOQZ.js → chunk-ONC5LWD4.js} +18 -9
  35. package/dist/chunk-ONC5LWD4.js.map +1 -0
  36. package/dist/{chunk-XCMDIXWE.js → chunk-ONL4UTGQ.js} +32 -32
  37. package/dist/{chunk-GCFG67SF.js → chunk-ORIA2IFK.js} +50 -50
  38. package/dist/{chunk-T7K3CLXM.js → chunk-OYIGWP2N.js} +2 -2
  39. package/dist/{chunk-ONCXLQV4.js → chunk-P4OK4W2F.js} +3 -3
  40. package/dist/{chunk-LG4SU2D4.cjs → chunk-Q7WPRN62.cjs} +69 -60
  41. package/dist/chunk-Q7WPRN62.cjs.map +1 -0
  42. package/dist/{chunk-7MGZWDO4.js → chunk-RLED4WS3.js} +2 -2
  43. package/dist/{chunk-7MGZWDO4.js.map → chunk-RLED4WS3.js.map} +1 -1
  44. package/dist/{chunk-WZUTLJP2.cjs → chunk-SOI7R4LF.cjs} +133 -82
  45. package/dist/chunk-SOI7R4LF.cjs.map +1 -0
  46. package/dist/{chunk-YNIZLSM4.js → chunk-SORWBCEP.js} +8 -8
  47. package/dist/{chunk-6QK6ZQTF.js → chunk-TQUO7JR5.js} +3 -3
  48. package/dist/{chunk-LWSMZJLR.js → chunk-UJFT2OED.js} +2 -2
  49. package/dist/{chunk-UMQADPM5.js → chunk-UPO7Y3KL.js} +2 -2
  50. package/dist/{chunk-LM7LYH54.js → chunk-UQ2ZA3X4.js} +2 -2
  51. package/dist/{chunk-DRDW5ULI.js → chunk-UQTQXXHU.js} +14 -14
  52. package/dist/{chunk-EJKCEP3Q.cjs → chunk-URSNWPD4.cjs} +6 -6
  53. package/dist/{chunk-EJKCEP3Q.cjs.map → chunk-URSNWPD4.cjs.map} +1 -1
  54. package/dist/{chunk-KGX4TLBX.cjs → chunk-V5CNQSVW.cjs} +3 -3
  55. package/dist/{chunk-KGX4TLBX.cjs.map → chunk-V5CNQSVW.cjs.map} +1 -1
  56. package/dist/{chunk-OHLJEWS6.js → chunk-WOGL3YQK.js} +2 -2
  57. package/dist/{chunk-TQBNSAAS.js → chunk-XQPF6I6P.js} +2 -2
  58. package/dist/{chunk-JRVZBYQ2.js → chunk-XVWPMKPH.js} +18 -8
  59. package/dist/chunk-XVWPMKPH.js.map +1 -0
  60. package/dist/{chunk-RR2FKPFN.js → chunk-YPLKE5WG.js} +2 -2
  61. package/dist/{chunk-RR2FKPFN.js.map → chunk-YPLKE5WG.js.map} +1 -1
  62. package/dist/chunks-5L5OU6AI.js +11 -0
  63. package/dist/cli.js +61 -60
  64. package/dist/cli.js.map +1 -1
  65. package/dist/{formula-DLZUYM6F.js → formula-AV7SNRB4.js} +20 -17
  66. package/dist/{formula-DLZUYM6F.js.map → formula-AV7SNRB4.js.map} +1 -1
  67. package/dist/{formula-2MQWKUKR.js → formula-BMSREXB5.js} +19 -16
  68. package/dist/{formula-2MQWKUKR.js.map → formula-BMSREXB5.js.map} +1 -1
  69. package/dist/{formula-T2YY77JT.cjs → formula-NQHARDPX.cjs} +25 -22
  70. package/dist/formula-NQHARDPX.cjs.map +1 -0
  71. package/dist/generator-4CSCP6YH.js +17 -0
  72. package/dist/generator-OC366G6M.cjs +11 -0
  73. package/dist/{generator-YBWCA6B5.cjs.map → generator-OC366G6M.cjs.map} +1 -1
  74. package/dist/generator-UPESZL4M.js +10 -0
  75. package/dist/hancom-3CHPVF7H.js +84 -0
  76. package/dist/hancom-3CHPVF7H.js.map +1 -0
  77. package/dist/hancom-6Z7O3G4K.js +85 -0
  78. package/dist/hancom-6Z7O3G4K.js.map +1 -0
  79. package/dist/hancom-F5OHWSWU.cjs +85 -0
  80. package/dist/hancom-F5OHWSWU.cjs.map +1 -0
  81. package/dist/{image-ocr-N7UKGSRY.cjs → image-ocr-JQ4OEBBK.cjs} +86 -22
  82. package/dist/image-ocr-JQ4OEBBK.cjs.map +1 -0
  83. package/dist/{image-ocr-3NF3QJM7.js → image-ocr-PE5NAWAR.js} +76 -12
  84. package/dist/image-ocr-PE5NAWAR.js.map +1 -0
  85. package/dist/{image-ocr-XRKFK7AA.js → image-ocr-YJPNUWXR.js} +71 -7
  86. package/dist/image-ocr-YJPNUWXR.js.map +1 -0
  87. package/dist/index.cjs +1110 -1110
  88. package/dist/index.cjs.map +1 -1
  89. package/dist/index.d.cts +7 -1
  90. package/dist/index.d.ts +7 -1
  91. package/dist/index.js +70 -70
  92. package/dist/mcp.js +57 -56
  93. package/dist/mcp.js.map +1 -1
  94. package/dist/memo-OVXY467W.js +17 -0
  95. package/dist/{model-bundle-MO5I26AO.js → model-bundle-AXHPS54Q.js} +5 -5
  96. package/dist/{models-IIP4GZ57.js → models-CYRFBT43.js} +5 -5
  97. package/dist/{parse-worker-v2-GWOL3TTO.js → parse-worker-v2-GUJQNNOF.js} +28 -28
  98. package/dist/{parser-UCLUVQPA.js → parser-533OXR3B.js} +16 -16
  99. package/dist/{parser-R6UJQ6CV.cjs → parser-JVJSUMCA.cjs} +162 -162
  100. package/dist/{parser-R6UJQ6CV.cjs.map → parser-JVJSUMCA.cjs.map} +1 -1
  101. package/dist/{parser-DJQFM6VE.js → parser-S56VNTRV.js} +16 -16
  102. package/dist/{pdf-ocr-EWXGN4JB.js → pdf-ocr-FNW4IJWX.js} +8 -6
  103. package/dist/{pdf-ocr-7PSNKQOI.js → pdf-ocr-JNR4HA7O.js} +12 -10
  104. package/dist/pdf-ocr-ZBKAXNIE.cjs +40 -0
  105. package/dist/pdf-ocr-ZBKAXNIE.cjs.map +1 -0
  106. package/dist/{profile-io-NUU3VKNW.js → profile-io-GU5XFVSI.js} +3 -3
  107. package/dist/{rasterize-RARCMBJ3.js → rasterize-XOHGVWKM.js} +3 -3
  108. package/dist/{redact-doc-JKGDXGNJ.js → redact-doc-G5K4NVUN.js} +37 -37
  109. package/dist/{render-SGLKO3PG.js → render-J7VBXGFV.js} +14 -14
  110. package/dist/{rewrite-fallback-7YZXSR5K.js → rewrite-fallback-4QGM5F4V.js} +21 -21
  111. package/dist/seal-DSMAUDZ4.js +16 -0
  112. package/dist/{setup-5IYW4FZ7.js → setup-R5IH4AGD.js} +3 -3
  113. package/dist/{to-hwpx-QMANIAWY.js → to-hwpx-5ENZWUTU.js} +9 -9
  114. package/dist/{to-hwpx-4PM6XV2L.js → to-hwpx-I6LNQ4D4.js} +4 -4
  115. package/dist/to-hwpx-WCDMFRNN.cjs +16 -0
  116. package/dist/{to-hwpx-DEBHREDM.cjs.map → to-hwpx-WCDMFRNN.cjs.map} +1 -1
  117. package/dist/visual-QFPNYNCF.js +37 -0
  118. package/dist/{watch-YZS76EOS.js → watch-UM5SMZQP.js} +27 -27
  119. package/package.json +1 -1
  120. package/dist/chunk-2LDFUVVF.js.map +0 -1
  121. package/dist/chunk-B2VRTOQZ.js.map +0 -1
  122. package/dist/chunk-IOABX3GR.cjs.map +0 -1
  123. package/dist/chunk-JRVZBYQ2.js.map +0 -1
  124. package/dist/chunk-KFJKRST5.js.map +0 -1
  125. package/dist/chunk-LG4SU2D4.cjs.map +0 -1
  126. package/dist/chunk-WZUTLJP2.cjs.map +0 -1
  127. package/dist/chunks-NRA4GFK2.js +0 -11
  128. package/dist/formula-T2YY77JT.cjs.map +0 -1
  129. package/dist/generator-2WFWLJFG.js +0 -10
  130. package/dist/generator-5NWKWLOO.js +0 -17
  131. package/dist/generator-YBWCA6B5.cjs +0 -11
  132. package/dist/image-ocr-3NF3QJM7.js.map +0 -1
  133. package/dist/image-ocr-N7UKGSRY.cjs.map +0 -1
  134. package/dist/image-ocr-XRKFK7AA.js.map +0 -1
  135. package/dist/memo-XJ4NBV4J.js +0 -17
  136. package/dist/pdf-ocr-HECUBUMU.cjs +0 -38
  137. package/dist/pdf-ocr-HECUBUMU.cjs.map +0 -1
  138. package/dist/seal-LSS7WY6Z.js +0 -16
  139. package/dist/to-hwpx-DEBHREDM.cjs +0 -16
  140. package/dist/visual-QXYBJJ5D.js +0 -37
  141. /package/dist/{-HX3RWDQF.js.map → -LPQSUCWH.js.map} +0 -0
  142. /package/dist/{chunk-VRCXXZHT.js.map → chunk-3NZP2VXB.js.map} +0 -0
  143. /package/dist/{chunk-P3SZJJRK.js.map → chunk-5PONVN46.js.map} +0 -0
  144. /package/dist/{chunk-BT5RPLV4.js.map → chunk-6MTH2EYN.js.map} +0 -0
  145. /package/dist/{chunk-64MVXWS5.js.map → chunk-7F42AI4O.js.map} +0 -0
  146. /package/dist/{chunk-4MWGWS3B.js.map → chunk-7F63OEHI.js.map} +0 -0
  147. /package/dist/{chunk-6XOJ6CEK.js.map → chunk-AZ56HT3M.js.map} +0 -0
  148. /package/dist/{chunk-OTB6UOIB.js.map → chunk-CDVDRC77.js.map} +0 -0
  149. /package/dist/{chunk-MTSWWXSB.js.map → chunk-FA3MQGIF.js.map} +0 -0
  150. /package/dist/{chunk-IWCWO3GP.js.map → chunk-G3JUKDMB.js.map} +0 -0
  151. /package/dist/{chunk-J42O5KBX.js.map → chunk-IDCU74H5.js.map} +0 -0
  152. /package/dist/{chunk-BYOAA442.js.map → chunk-LAKPAL53.js.map} +0 -0
  153. /package/dist/{chunk-J26TNCL7.js.map → chunk-MLXVSAR3.js.map} +0 -0
  154. /package/dist/{chunk-6SVVVZLV.js.map → chunk-MNXKORB5.js.map} +0 -0
  155. /package/dist/{chunk-33BKUIIC.js.map → chunk-MSRDRUOV.js.map} +0 -0
  156. /package/dist/{chunk-7GN7O3K2.js.map → chunk-OBZV23UV.js.map} +0 -0
  157. /package/dist/{chunk-XCMDIXWE.js.map → chunk-ONL4UTGQ.js.map} +0 -0
  158. /package/dist/{chunk-GCFG67SF.js.map → chunk-ORIA2IFK.js.map} +0 -0
  159. /package/dist/{chunk-T7K3CLXM.js.map → chunk-OYIGWP2N.js.map} +0 -0
  160. /package/dist/{chunk-ONCXLQV4.js.map → chunk-P4OK4W2F.js.map} +0 -0
  161. /package/dist/{chunk-YNIZLSM4.js.map → chunk-SORWBCEP.js.map} +0 -0
  162. /package/dist/{chunk-6QK6ZQTF.js.map → chunk-TQUO7JR5.js.map} +0 -0
  163. /package/dist/{chunk-LWSMZJLR.js.map → chunk-UJFT2OED.js.map} +0 -0
  164. /package/dist/{chunk-UMQADPM5.js.map → chunk-UPO7Y3KL.js.map} +0 -0
  165. /package/dist/{chunk-LM7LYH54.js.map → chunk-UQ2ZA3X4.js.map} +0 -0
  166. /package/dist/{chunk-DRDW5ULI.js.map → chunk-UQTQXXHU.js.map} +0 -0
  167. /package/dist/{chunk-OHLJEWS6.js.map → chunk-WOGL3YQK.js.map} +0 -0
  168. /package/dist/{chunk-TQBNSAAS.js.map → chunk-XQPF6I6P.js.map} +0 -0
  169. /package/dist/{chunks-NRA4GFK2.js.map → chunks-5L5OU6AI.js.map} +0 -0
  170. /package/dist/{generator-2WFWLJFG.js.map → generator-4CSCP6YH.js.map} +0 -0
  171. /package/dist/{generator-5NWKWLOO.js.map → generator-UPESZL4M.js.map} +0 -0
  172. /package/dist/{memo-XJ4NBV4J.js.map → memo-OVXY467W.js.map} +0 -0
  173. /package/dist/{model-bundle-MO5I26AO.js.map → model-bundle-AXHPS54Q.js.map} +0 -0
  174. /package/dist/{models-IIP4GZ57.js.map → models-CYRFBT43.js.map} +0 -0
  175. /package/dist/{parse-worker-v2-GWOL3TTO.js.map → parse-worker-v2-GUJQNNOF.js.map} +0 -0
  176. /package/dist/{parser-UCLUVQPA.js.map → parser-533OXR3B.js.map} +0 -0
  177. /package/dist/{parser-DJQFM6VE.js.map → parser-S56VNTRV.js.map} +0 -0
  178. /package/dist/{pdf-ocr-7PSNKQOI.js.map → pdf-ocr-FNW4IJWX.js.map} +0 -0
  179. /package/dist/{pdf-ocr-EWXGN4JB.js.map → pdf-ocr-JNR4HA7O.js.map} +0 -0
  180. /package/dist/{profile-io-NUU3VKNW.js.map → profile-io-GU5XFVSI.js.map} +0 -0
  181. /package/dist/{rasterize-RARCMBJ3.js.map → rasterize-XOHGVWKM.js.map} +0 -0
  182. /package/dist/{redact-doc-JKGDXGNJ.js.map → redact-doc-G5K4NVUN.js.map} +0 -0
  183. /package/dist/{render-SGLKO3PG.js.map → render-J7VBXGFV.js.map} +0 -0
  184. /package/dist/{rewrite-fallback-7YZXSR5K.js.map → rewrite-fallback-4QGM5F4V.js.map} +0 -0
  185. /package/dist/{seal-LSS7WY6Z.js.map → seal-DSMAUDZ4.js.map} +0 -0
  186. /package/dist/{setup-5IYW4FZ7.js.map → setup-R5IH4AGD.js.map} +0 -0
  187. /package/dist/{to-hwpx-4PM6XV2L.js.map → to-hwpx-5ENZWUTU.js.map} +0 -0
  188. /package/dist/{to-hwpx-QMANIAWY.js.map → to-hwpx-I6LNQ4D4.js.map} +0 -0
  189. /package/dist/{visual-QXYBJJ5D.js.map → visual-QFPNYNCF.js.map} +0 -0
  190. /package/dist/{watch-YZS76EOS.js.map → watch-UM5SMZQP.js.map} +0 -0
package/README.md CHANGED
@@ -125,7 +125,7 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
125
125
  | 법령 별표 | 272건 · 346표 | HWP **346/346**, PDF **343/346 · 99.13%** |
126
126
  | PDF 전체 | 1,911문서 중 1,729건 채점 | 글 커버리지 **99.80%** |
127
127
  | OCR | 53문서 · 102쪽 · 66표 | CER **0.0239** · 글자 재현율 **99.32%** · 표 구조 일치 **34/66** |
128
- | KoOCR-Bench v2.0c (외부) | 공개 877쪽 (표·글·손글씨·순서) | 종합 기본값 **0.807** · `ocrRec: "auto"` **0.828** (4.24.37) |
128
+ | KoOCR-Bench v2.0c (외부) | 공개 877쪽 (표·글·손글씨·순서) | 종합 기본값 **0.810** · `ocrRec: "auto"` **0.831** · 제목 재현율 0.798 (4.24.38) |
129
129
  | opendataloader-bench | PDF 200문서 | 종합 기본값 **0.964** · OCR 끔 **0.939** |
130
130
  | HWPX 렌더 배치 | 한컴 PDF 짝 1,565문서(쪽 수 일치 1,508) · 글 조각 111,480 · 그림 4,300 | 글 위치(±1.5pt) **106,904 · 95.9%** · 그림 위치(±2pt) **4,213 · 98.0%** |
131
131
 
@@ -133,15 +133,15 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
133
133
 
134
134
  ## 최근 업데이트
135
135
 
136
- 최신 배포: **[4.24.37](https://github.com/chrisryugj/kordoc/releases/tag/v4.24.37)** · 2026-11-02
136
+ 최신 배포: **[4.24.38](https://github.com/chrisryugj/kordoc/releases/tag/v4.24.38)** · 2026-11-02
137
137
 
138
138
  | 버전 | 주요 변경 | 수치 변화 |
139
139
  | --- | --- | --- |
140
+ | 4.24.38 | OCR: 스캔·이미지 쪽 제목 판정(위아래로 쌓인 장 제목 잇기) · 작은 1칸 상자 쪽 두 단 읽기 순서 · 문장 조각 가짜 표 · 겹친 상자 이음매 글자 · 이미지 수식 OCR(`formulaOcr`) · to-hwpx 한/글 자체 저장 엔진(`--engine hancom`, 팝업 없이) | KoOCR-Bench 종합 0.807 → **0.810**(`auto` **0.831**) · 제목 재현율 0 → .798 · 자체 벤치 문서별 그대로 |
140
141
  | 4.24.37 | OCR 표: 통계표 묶음 안 빈칸 열·괘선 없는 본문 행 펼치기·행 합침 아래 행 가르기·이웃 칸 값 몰림·음영 머리 띠와 칠한 첫 열 경계 · 머리 행 있는 표를 차트로 풀던 것 · 시험지 문항 상자 풀기 · `ocrRec: "auto"`(손글씨 쪽만 손글씨 모델) | KoOCR-Bench v2.0c 공개 877쪽 종합 0.742 → **0.807**(`ocrRec: "auto"` **0.828**) · 자체 벤치 문서별 그대로 |
141
142
  | 4.24.36 | PDF 띄어쓰기(한컴 PDF): 자간 줄인 글의 낱말 공백 되살림 · 공백 글리프 위에 덧찍은 쉼표("55만원,") · 날짜 "2026. 8. 28." 공백 유지 · 줄 끝에서 갈린 연도 "20⏎25년" | PDF 글 어절 F1 99.076 → **99.103%** · 그 밖 지표 그대로 |
142
143
  | 4.24.35 | PDF: 자간 줄인 수치의 같은 숫자 둘("129.9") 지키기 · 글자마다 찍은 첨자 줄을 본문에 붙이기 · 수 가운데서 꺾인 줄("1,2⏎96억"·"(4.1⏎6.~5.16.)")과 칸 소수 잇기 · 표지 책등 외기둥 세로 글 | PDF 표 칸 완전 일치 0.99264 → **0.99267** · 칸 내용 0.98902 → **0.98905** · PDF 글 순서 99.359 → **99.360%** · 어절 F1 99.073 → **99.076%** · 그 밖 지표 그대로 |
143
144
  | 4.24.34 | to-hwpx: 파일 여러 개·폴더 일괄 변환(하위 폴더, 이미 있는 .hwpx 건너뜀) · PDF: 기호 글꼴 작은 네모로 찍고 공백으로 적은 "·" 글머리 되살림 · 글자 단위로 나눈 줄 머리 어미("는데"·"졌다")·겹조사 잇기 | PDF 표 칸 완전 일치 0.99221 → **0.99264** · 칸 내용 0.98896 → **0.98902** · PDF 글 재현율 99.883 → **99.885%** · 순서 99.356 → **99.359%** · 어절 F1 99.071 → **99.073%** · 그 밖 지표 그대로 |
144
- | 4.24.33 | PDF 표: 모아찍기 쪽 넘김에서 오른쪽 쪽 머리 상자로 넘어간 칸 글을 앞 칸에 잇기 · 칸을 한 겹 더 깐 1×1 클립(통계표 숫자 칸)을 중첩 표 대신 칸 글로 | PDF 표 칸 내용 일치 0.98794 → **0.98896** · 칸 완전 일치 0.99153 → **0.99221** · 그 밖 벤치 지표 그대로 |
145
145
 
146
146
  이전 버전과 상세 내용은 [변경 이력](CHANGELOG.md)에 있습니다.
147
147
 
@@ -53,34 +53,7 @@ import {
53
53
  usesGaejosikMunche,
54
54
  usesLogicStructure,
55
55
  validateHwpx
56
- } from "./chunk-GCFG67SF.js";
57
- import {
58
- blocksToPages
59
- } from "./chunk-J26TNCL7.js";
60
- import {
61
- extractClickHereFields,
62
- patchHwp,
63
- patchHwpx
64
- } from "./chunk-7GN7O3K2.js";
65
- import {
66
- addMemoHwpx
67
- } from "./chunk-YNIZLSM4.js";
68
- import {
69
- placeSealHwpx
70
- } from "./chunk-P3SZJJRK.js";
71
- import "./chunk-VRCXXZHT.js";
72
- import {
73
- convertToHwpx,
74
- hwpToHwpx
75
- } from "./chunk-B2VRTOQZ.js";
76
- import {
77
- DEFAULT_REDACT_RULES,
78
- redactMarkdown,
79
- redactText
80
- } from "./chunk-3WSNLH4B.js";
81
- import {
82
- blocksToChunks
83
- } from "./chunk-MTSWWXSB.js";
56
+ } from "./chunk-ORIA2IFK.js";
84
57
  import {
85
58
  blocksToPdf,
86
59
  extractRenderedRegions,
@@ -91,25 +64,16 @@ import {
91
64
  renderHwp5Pages,
92
65
  renderHwpxToSvg,
93
66
  renderSceneToHtml
94
- } from "./chunk-XCMDIXWE.js";
95
- import "./chunk-ONCXLQV4.js";
96
- import "./chunk-T7K3CLXM.js";
97
- import "./chunk-DRDW5ULI.js";
98
- import "./chunk-VKVDMH7X.js";
99
- import "./chunk-LM7LYH54.js";
100
- import "./chunk-J42O5KBX.js";
101
- import "./chunk-VQFA55IC.js";
67
+ } from "./chunk-ONL4UTGQ.js";
102
68
  import {
103
- detectFormat,
104
- detectOle2Format,
105
- detectZipFormat,
106
- isHwpxFile,
107
- isOldHwpFile,
108
- isPdfFile,
109
- isZipFile
110
- } from "./chunk-GHHVT4Q5.js";
111
- import "./chunk-H7K5YHWQ.js";
112
- import "./chunk-JIMG76FW.js";
69
+ blocksToPages
70
+ } from "./chunk-MLXVSAR3.js";
71
+ import {
72
+ extractClickHereFields,
73
+ patchHwp,
74
+ patchHwpx
75
+ } from "./chunk-OBZV23UV.js";
76
+ import "./chunk-P4OK4W2F.js";
113
77
  import {
114
78
  AGENCY_COMMON_NAME,
115
79
  PRESET_ALIAS,
@@ -119,7 +83,24 @@ import {
119
83
  markdownToHwpx,
120
84
  normalizeGongmunPreset,
121
85
  placeTotalRow
122
- } from "./chunk-BT5RPLV4.js";
86
+ } from "./chunk-6MTH2EYN.js";
87
+ import {
88
+ SPACE_EM_FIXED,
89
+ SPACE_EM_FONT,
90
+ charWidthEm1000,
91
+ fitRatioForFewerLines,
92
+ measureTextWidth,
93
+ simulateWrap,
94
+ simulateWrapKeepWord
95
+ } from "./chunk-UJFT2OED.js";
96
+ import {
97
+ addMemoHwpx
98
+ } from "./chunk-SORWBCEP.js";
99
+ import {
100
+ placeSealHwpx
101
+ } from "./chunk-5PONVN46.js";
102
+ import "./chunk-OYIGWP2N.js";
103
+ import "./chunk-3NZP2VXB.js";
123
104
  import {
124
105
  ValueCursor,
125
106
  applySplices,
@@ -133,28 +114,47 @@ import {
133
114
  isLabelCell,
134
115
  scanSectionXml
135
116
  } from "./chunk-3AHL6YEA.js";
117
+ import "./chunk-XQPF6I6P.js";
136
118
  import {
137
- SPACE_EM_FIXED,
138
- SPACE_EM_FONT,
139
- charWidthEm1000,
140
- fitRatioForFewerLines,
141
- measureTextWidth,
142
- simulateWrap,
143
- simulateWrapKeepWord
144
- } from "./chunk-LWSMZJLR.js";
145
- import "./chunk-TQBNSAAS.js";
119
+ convertToHwpx,
120
+ hwpToHwpx
121
+ } from "./chunk-ONC5LWD4.js";
122
+ import "./chunk-UQTQXXHU.js";
123
+ import "./chunk-VKVDMH7X.js";
146
124
  import "./chunk-OFVHQ2TZ.js";
125
+ import "./chunk-UQ2ZA3X4.js";
147
126
  import "./chunk-WFKFG2RT.js";
148
- import "./chunk-7MGZWDO4.js";
127
+ import {
128
+ DEFAULT_REDACT_RULES,
129
+ redactMarkdown,
130
+ redactText
131
+ } from "./chunk-3WSNLH4B.js";
132
+ import {
133
+ blocksToChunks
134
+ } from "./chunk-FA3MQGIF.js";
135
+ import "./chunk-IDCU74H5.js";
136
+ import "./chunk-VQFA55IC.js";
137
+ import {
138
+ detectFormat,
139
+ detectOle2Format,
140
+ detectZipFormat,
141
+ isHwpxFile,
142
+ isOldHwpFile,
143
+ isPdfFile,
144
+ isZipFile
145
+ } from "./chunk-GHHVT4Q5.js";
146
+ import "./chunk-H7K5YHWQ.js";
147
+ import "./chunk-JIMG76FW.js";
148
+ import "./chunk-RLED4WS3.js";
149
149
  import {
150
150
  blocksToMarkdown,
151
151
  flattenLayoutTables,
152
152
  hasStructuredCellContent
153
- } from "./chunk-33BKUIIC.js";
153
+ } from "./chunk-MSRDRUOV.js";
154
154
  import "./chunk-KFF47XZ7.js";
155
155
  import {
156
156
  VERSION
157
- } from "./chunk-BYOAA442.js";
157
+ } from "./chunk-LAKPAL53.js";
158
158
  export {
159
159
  AGENCY_COMMON_NAME,
160
160
  BUILTIN_TEMPLATES,
@@ -268,4 +268,4 @@ export {
268
268
  usesLogicStructure,
269
269
  validateHwpx
270
270
  };
271
- //# sourceMappingURL=-HX3RWDQF.js.map
271
+ //# sourceMappingURL=-LPQSUCWH.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  KordocError
4
- } from "./chunk-BYOAA442.js";
4
+ } from "./chunk-LAKPAL53.js";
5
5
 
6
6
  // src/roundtrip/zip-patch.ts
7
7
  import { deflateRawSync } from "zlib";
@@ -233,4 +233,4 @@ export {
233
233
  readZipEntries,
234
234
  patchZipEntries
235
235
  };
236
- //# sourceMappingURL=chunk-VRCXXZHT.js.map
236
+ //# sourceMappingURL=chunk-3NZP2VXB.js.map
@@ -34,7 +34,7 @@ import {
34
34
  splitRowBands,
35
35
  starRun,
36
36
  tallInkCount
37
- } from "./chunk-JRVZBYQ2.js";
37
+ } from "./chunk-XVWPMKPH.js";
38
38
  import {
39
39
  validateOcrOptions
40
40
  } from "./chunk-IFWGHRCQ.js";
@@ -44,7 +44,7 @@ import {
44
44
  import {
45
45
  KordocError,
46
46
  OPTIONAL_DEP_INSTALL_HINT
47
- } from "./chunk-64MVXWS5.js";
47
+ } from "./chunk-7F42AI4O.js";
48
48
 
49
49
  // src/ocr/ocr-stacked-rows.ts
50
50
  var NUMERIC = /^[-+−△▲▽▼]?[\d.,]+[%p]?$|^[-–—·∼~]$|^\([-+−△▲▽▼]?[\d.,]+\)$/;
@@ -2311,6 +2311,7 @@ function groupOcrLines(items, figureRegion = false) {
2311
2311
  function ocrItemsToBlocks(items, pageNumber, pdfW, pdfH, scale, extraLines, detectTables = true, opList = { fnArray: [], argsArray: [] }, figureRegion = false) {
2312
2312
  const bottoms = items.map((it) => it.y + it.h);
2313
2313
  const xs = items.map((it) => ({ x: it.x, r: it.x + it.w, space: false }));
2314
+ const texts = items.map((it) => it.text);
2314
2315
  for (const line of groupOcrLines(items, figureRegion)) {
2315
2316
  if (line.length < 2) continue;
2316
2317
  const sorted = line.map((j) => items[j].y + items[j].h).sort((a, b) => a - b);
@@ -2319,6 +2320,13 @@ function ocrItemsToBlocks(items, pageNumber, pdfW, pdfH, scale, extraLines, dete
2319
2320
  for (let k = 1; k < byX.length; k++) {
2320
2321
  const L = xs[byX[k - 1]], R = xs[byX[k]];
2321
2322
  if (R.x >= L.r) continue;
2323
+ const lt = [...texts[byX[k - 1]]], rt = [...texts[byX[k]]], per = items[byX[k]].w / Math.max(1, rt.length);
2324
+ for (let n = Math.min(3, rt.length, lt.length); n >= 1; n--) {
2325
+ if (lt.slice(-n).join("") === rt.slice(0, n).join("") && /[가-힣]/.test(rt[0]) && L.r - R.x >= per * n * 0.5) {
2326
+ texts[byX[k]] = rt.slice(n).join("");
2327
+ break;
2328
+ }
2329
+ }
2322
2330
  const mid = (R.x + L.r) / 2, half = Math.min(items[byX[k - 1]].h, items[byX[k]].h) * 0.15;
2323
2331
  L.r = Math.max(L.x + 1, mid - half);
2324
2332
  R.x = Math.min(R.r - 1, mid + half);
@@ -2328,7 +2336,7 @@ function ocrItemsToBlocks(items, pageNumber, pdfW, pdfH, scale, extraLines, dete
2328
2336
  const norm = items.map((it, i) => {
2329
2337
  const h = (figureRegion ? Math.max(1, bottoms[i] - it.y) : it.h) / scale;
2330
2338
  const normalized = {
2331
- text: it.text,
2339
+ text: texts[i],
2332
2340
  x: Math.round(xs[i].x / scale),
2333
2341
  // NormItem.y 는 pdfjs transform[5] = 베이스라인 (bottom-up) — 잉크 하단으로 근사
2334
2342
  y: Math.round(pdfH - bottoms[i] / scale),
@@ -2342,8 +2350,50 @@ function ocrItemsToBlocks(items, pageNumber, pdfW, pdfH, scale, extraLines, dete
2342
2350
  };
2343
2351
  copyOcrTextGaps(it, normalized, 1 / scale);
2344
2352
  return normalized;
2345
- });
2346
- return unframeOcrLayoutTables(splitStackedOcrRows(extractPageBlocksWithLines(norm, pageNumber, opList, pdfW, pdfH, extraLines, detectTables)), pdfH);
2353
+ }).filter((it) => it.text);
2354
+ const blocks = unframeOcrLayoutTables(splitStackedOcrRows(extractPageBlocksWithLines(norm, pageNumber, opList, pdfW, pdfH, extraLines, detectTables)), pdfH);
2355
+ if (!figureRegion) markOcrHeadings(blocks);
2356
+ return blocks;
2357
+ }
2358
+ function markOcrHeadings(blocks) {
2359
+ const sized = blocks.filter((b) => b.type === "paragraph" && b.text && b.style?.fontSize);
2360
+ const weights = sized.map((b) => [b.style.fontSize, b.text.length]);
2361
+ const total = weights.reduce((n, [, w]) => n + w, 0);
2362
+ if (total < 100) return;
2363
+ weights.sort((a, b) => a[0] - b[0]);
2364
+ let acc = 0, body = 0;
2365
+ for (const [size, w] of weights) {
2366
+ acc += w;
2367
+ if (acc >= total / 2) {
2368
+ body = size;
2369
+ break;
2370
+ }
2371
+ }
2372
+ if (!body) return;
2373
+ for (const b of sized) {
2374
+ const text = b.text.trim(), size = b.style.fontSize;
2375
+ const ratio = size / body;
2376
+ if (ratio < 1.3) continue;
2377
+ if (text.length < 2 || text.length > (ratio >= 1.5 ? 60 : 40) || /[.!?。]$|다\.?$/.test(text) || /^[\d\s.,%·-]+$/.test(text)) continue;
2378
+ if (b.bbox && b.bbox.height > size * (ratio >= 1.5 ? 3.2 : 1.6)) continue;
2379
+ b.type = "heading";
2380
+ b.level = ratio >= 1.5 ? 1 : 2;
2381
+ }
2382
+ for (let i = blocks.length - 1; i > 0; i--) {
2383
+ const a = blocks[i - 1], b = blocks[i];
2384
+ if (a.type !== "heading" || b.type !== "heading" || !a.bbox || !b.bbox) continue;
2385
+ const marker = /^(?:제\s*\d+\s*[장절편부]|chapter\s*\d+|part\s*\d+)$/i.test(a.text.trim());
2386
+ const sa = a.style?.fontSize ?? 0, sb = b.style?.fontSize ?? 0;
2387
+ if (!marker && (a.level !== b.level || Math.max(sa, sb) > Math.min(sa, sb) * 1.3)) continue;
2388
+ const gap = a.bbox.y - (b.bbox.y + b.bbox.height), size = Math.max(a.style?.fontSize ?? 0, b.style?.fontSize ?? 0);
2389
+ const across = Math.min(a.bbox.x + a.bbox.width, b.bbox.x + b.bbox.width) - Math.max(a.bbox.x, b.bbox.x);
2390
+ if (gap < 0 || gap > size * (marker ? 3 : 1.2) || across <= 0) continue;
2391
+ a.level = Math.min(a.level ?? 2, b.level ?? 2);
2392
+ a.text = `${a.text.trim()} ${b.text.trim()}`;
2393
+ const x = Math.min(a.bbox.x, b.bbox.x);
2394
+ a.bbox = { ...a.bbox, x, y: b.bbox.y, width: Math.max(a.bbox.x + a.bbox.width, b.bbox.x + b.bbox.width) - x, height: a.bbox.y + a.bbox.height - b.bbox.y };
2395
+ blocks.splice(i, 1);
2396
+ }
2347
2397
  }
2348
2398
  async function tryImport2(name, loader) {
2349
2399
  try {
@@ -2397,6 +2447,7 @@ export {
2397
2447
  runPdfOcr,
2398
2448
  ocrOnePage,
2399
2449
  groupOcrLines,
2400
- ocrItemsToBlocks
2450
+ ocrItemsToBlocks,
2451
+ markOcrHeadings
2401
2452
  };
2402
- //# sourceMappingURL=chunk-4OWD6WRS.js.map
2453
+ //# sourceMappingURL=chunk-5IYRVLGJ.js.map