kordoc 4.7.0 → 4.7.1

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 (94) hide show
  1. package/dist/{-MK2223RL.js → -O42BMYNX.js} +9 -9
  2. package/dist/{chunk-GIWKBPII.js → chunk-3UIT4PPQ.js} +2 -2
  3. package/dist/{chunk-MVTX6ODZ.js → chunk-4VNUQYUE.js} +1 -1
  4. package/dist/chunk-4VNUQYUE.js.map +1 -0
  5. package/dist/{chunk-6PIR74EA.js → chunk-5KPNXBNR.js} +26 -14
  6. package/dist/chunk-5KPNXBNR.js.map +1 -0
  7. package/dist/{chunk-AEYNY6FG.js → chunk-6663UXPE.js} +2 -2
  8. package/dist/{chunk-AFPD74JJ.js → chunk-7ZIOZ6PU.js} +2 -2
  9. package/dist/{chunk-XZDJXYUC.js → chunk-AFX6ZXER.js} +2 -2
  10. package/dist/{chunk-PEVPKD6Z.js → chunk-BQENBAUC.js} +3 -3
  11. package/dist/{chunk-TUU535RB.cjs → chunk-DJKLOLBT.cjs} +2 -2
  12. package/dist/chunk-DJKLOLBT.cjs.map +1 -0
  13. package/dist/{chunk-BCG2PKQU.js → chunk-IMEMTJ76.js} +11 -5
  14. package/dist/chunk-IMEMTJ76.js.map +1 -0
  15. package/dist/{chunk-YUVKU5CW.js → chunk-IZEUWEEY.js} +2 -2
  16. package/dist/chunk-IZEUWEEY.js.map +1 -0
  17. package/dist/{chunk-ZYVULRYF.js → chunk-J3W6Q3AX.js} +2 -2
  18. package/dist/{chunk-PV2EXXGI.js → chunk-JEX5P66D.js} +3 -3
  19. package/dist/{chunk-P2NWNJMR.js → chunk-PLEGO474.js} +2 -2
  20. package/dist/{chunk-5QTHHQQE.cjs → chunk-TZ3WCAJZ.cjs} +3 -3
  21. package/dist/{chunk-5QTHHQQE.cjs.map → chunk-TZ3WCAJZ.cjs.map} +1 -1
  22. package/dist/{chunk-W5KRKBYR.cjs → chunk-USGC3ZKU.cjs} +13 -7
  23. package/dist/chunk-USGC3ZKU.cjs.map +1 -0
  24. package/dist/{chunk-YXXHH6WC.js → chunk-UZB3UGC5.js} +2 -2
  25. package/dist/{chunk-IDHBO6AG.js → chunk-VECVLIWE.js} +3 -3
  26. package/dist/{chunk-3VTMSSDW.js → chunk-YWDN5PQC.js} +11 -5
  27. package/dist/chunk-YWDN5PQC.js.map +1 -0
  28. package/dist/{chunk-C27PPXRZ.cjs → chunk-ZDWP3LLY.cjs} +10 -10
  29. package/dist/{chunk-C27PPXRZ.cjs.map → chunk-ZDWP3LLY.cjs.map} +1 -1
  30. package/dist/chunks-C7DJL4RE.js +10 -0
  31. package/dist/cli.js +17 -17
  32. package/dist/{image-ocr-4MHEX4MN.js → image-ocr-5QRZBNOF.js} +5 -5
  33. package/dist/{image-ocr-OB5PCQUU.cjs → image-ocr-MKD6MKWO.cjs} +10 -10
  34. package/dist/{image-ocr-OB5PCQUU.cjs.map → image-ocr-MKD6MKWO.cjs.map} +1 -1
  35. package/dist/{image-ocr-3A3HZX6O.js → image-ocr-TAJHRZ5T.js} +4 -4
  36. package/dist/index.cjs +479 -467
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +4 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.js +21 -9
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcp.js +15 -15
  43. package/dist/{parser-EQN4YKU4.js → parser-RCEHB2EV.js} +49 -6
  44. package/dist/parser-RCEHB2EV.js.map +1 -0
  45. package/dist/{parser-VACM3DFR.cjs → parser-SWY4RKGD.cjs} +69 -26
  46. package/dist/parser-SWY4RKGD.cjs.map +1 -0
  47. package/dist/{parser-EIVCD4NS.js → parser-UMFBJG2D.js} +50 -7
  48. package/dist/parser-UMFBJG2D.js.map +1 -0
  49. package/dist/pdf-ocr-3NTV3MYP.js +12 -0
  50. package/dist/{pdf-ocr-NPYDUIC5.js → pdf-ocr-7BOO4JA7.js} +5 -5
  51. package/dist/pdf-ocr-JDHELYBY.cjs +13 -0
  52. package/dist/{pdf-ocr-OBPQ4F4D.cjs.map → pdf-ocr-JDHELYBY.cjs.map} +1 -1
  53. package/dist/{profile-io-L5EH4JAD.js → profile-io-HT62OAEU.js} +3 -3
  54. package/dist/{rasterize-7AR662AL.js → rasterize-GL67HQC7.js} +2 -2
  55. package/dist/render-IQ4IZLY4.js +10 -0
  56. package/dist/seal-AGSZ6MUR.js +10 -0
  57. package/dist/{watch-MONT6CGI.js → watch-5ST75Q7Q.js} +9 -9
  58. package/package.json +1 -1
  59. package/dist/chunk-3VTMSSDW.js.map +0 -1
  60. package/dist/chunk-6PIR74EA.js.map +0 -1
  61. package/dist/chunk-BCG2PKQU.js.map +0 -1
  62. package/dist/chunk-MVTX6ODZ.js.map +0 -1
  63. package/dist/chunk-TUU535RB.cjs.map +0 -1
  64. package/dist/chunk-W5KRKBYR.cjs.map +0 -1
  65. package/dist/chunk-YUVKU5CW.js.map +0 -1
  66. package/dist/chunks-4HEG6ZPG.js +0 -10
  67. package/dist/parser-EIVCD4NS.js.map +0 -1
  68. package/dist/parser-EQN4YKU4.js.map +0 -1
  69. package/dist/parser-VACM3DFR.cjs.map +0 -1
  70. package/dist/pdf-ocr-N62EWEX4.js +0 -12
  71. package/dist/pdf-ocr-OBPQ4F4D.cjs +0 -13
  72. package/dist/render-CAFQT7S4.js +0 -10
  73. package/dist/seal-ESAC3IZR.js +0 -10
  74. /package/dist/{-MK2223RL.js.map → -O42BMYNX.js.map} +0 -0
  75. /package/dist/{chunk-GIWKBPII.js.map → chunk-3UIT4PPQ.js.map} +0 -0
  76. /package/dist/{chunk-AEYNY6FG.js.map → chunk-6663UXPE.js.map} +0 -0
  77. /package/dist/{chunk-AFPD74JJ.js.map → chunk-7ZIOZ6PU.js.map} +0 -0
  78. /package/dist/{chunk-XZDJXYUC.js.map → chunk-AFX6ZXER.js.map} +0 -0
  79. /package/dist/{chunk-PEVPKD6Z.js.map → chunk-BQENBAUC.js.map} +0 -0
  80. /package/dist/{chunk-ZYVULRYF.js.map → chunk-J3W6Q3AX.js.map} +0 -0
  81. /package/dist/{chunk-PV2EXXGI.js.map → chunk-JEX5P66D.js.map} +0 -0
  82. /package/dist/{chunk-P2NWNJMR.js.map → chunk-PLEGO474.js.map} +0 -0
  83. /package/dist/{chunk-YXXHH6WC.js.map → chunk-UZB3UGC5.js.map} +0 -0
  84. /package/dist/{chunk-IDHBO6AG.js.map → chunk-VECVLIWE.js.map} +0 -0
  85. /package/dist/{chunks-4HEG6ZPG.js.map → chunks-C7DJL4RE.js.map} +0 -0
  86. /package/dist/{image-ocr-4MHEX4MN.js.map → image-ocr-5QRZBNOF.js.map} +0 -0
  87. /package/dist/{image-ocr-3A3HZX6O.js.map → image-ocr-TAJHRZ5T.js.map} +0 -0
  88. /package/dist/{pdf-ocr-N62EWEX4.js.map → pdf-ocr-3NTV3MYP.js.map} +0 -0
  89. /package/dist/{pdf-ocr-NPYDUIC5.js.map → pdf-ocr-7BOO4JA7.js.map} +0 -0
  90. /package/dist/{profile-io-L5EH4JAD.js.map → profile-io-HT62OAEU.js.map} +0 -0
  91. /package/dist/{rasterize-7AR662AL.js.map → rasterize-GL67HQC7.js.map} +0 -0
  92. /package/dist/{render-CAFQT7S4.js.map → render-IQ4IZLY4.js.map} +0 -0
  93. /package/dist/{seal-ESAC3IZR.js.map → seal-AGSZ6MUR.js.map} +0 -0
  94. /package/dist/{watch-MONT6CGI.js.map → watch-5ST75Q7Q.js.map} +0 -0
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ blocksToChunks
4
+ } from "./chunk-AFX6ZXER.js";
5
+ import "./chunk-YWDN5PQC.js";
6
+ import "./chunk-J3W6Q3AX.js";
7
+ export {
8
+ blocksToChunks
9
+ };
10
+ //# sourceMappingURL=chunks-C7DJL4RE.js.map
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parseFormatProfileJson
4
- } from "./chunk-YXXHH6WC.js";
4
+ } from "./chunk-UZB3UGC5.js";
5
5
  import {
6
6
  BODY_FONTS,
7
7
  BULLET2_CHARS,
@@ -27,24 +27,24 @@ import {
27
27
  readBuiltinTemplate,
28
28
  resolveBuiltinTemplate,
29
29
  unknownFontWarnings
30
- } from "./chunk-6PIR74EA.js";
30
+ } from "./chunk-5KPNXBNR.js";
31
31
  import "./chunk-7FCNOKOR.js";
32
- import "./chunk-MVTX6ODZ.js";
32
+ import "./chunk-4VNUQYUE.js";
33
33
  import "./chunk-MOL7MDBG.js";
34
- import "./chunk-IDHBO6AG.js";
34
+ import "./chunk-VECVLIWE.js";
35
35
  import "./chunk-DZIXKL7E.js";
36
- import "./chunk-XZDJXYUC.js";
36
+ import "./chunk-AFX6ZXER.js";
37
37
  import {
38
38
  blocksToMarkdown
39
- } from "./chunk-3VTMSSDW.js";
40
- import "./chunk-PV2EXXGI.js";
41
- import "./chunk-AFPD74JJ.js";
39
+ } from "./chunk-YWDN5PQC.js";
40
+ import "./chunk-JEX5P66D.js";
41
+ import "./chunk-7ZIOZ6PU.js";
42
42
  import {
43
43
  VERSION,
44
44
  classifyError,
45
45
  sanitizeError,
46
46
  toArrayBuffer
47
- } from "./chunk-ZYVULRYF.js";
47
+ } from "./chunk-J3W6Q3AX.js";
48
48
 
49
49
  // src/cli.ts
50
50
  import { readFileSync, writeFileSync, mkdirSync, statSync } from "fs";
@@ -141,7 +141,7 @@ program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\
141
141
  `);
142
142
  }
143
143
  } else if (opts.format === "chunks") {
144
- const { blocksToChunks } = await import("./chunks-4HEG6ZPG.js");
144
+ const { blocksToChunks } = await import("./chunks-C7DJL4RE.js");
145
145
  output = JSON.stringify(blocksToChunks(result.blocks), null, 2);
146
146
  } else {
147
147
  output = markdown;
@@ -196,7 +196,7 @@ program.command("watch <dir>").description("\uB514\uB809\uD1A0\uB9AC \uAC10\uC2D
196
196
  if (command.getOptionValueSource("format") === "default" && program.getOptionValueSource("format") === "cli") {
197
197
  opts.format = rootOpts.format;
198
198
  }
199
- const { watchDirectory } = await import("./watch-MONT6CGI.js");
199
+ const { watchDirectory } = await import("./watch-5ST75Q7Q.js");
200
200
  await watchDirectory({
201
201
  dir,
202
202
  outDir: opts.outDir,
@@ -418,7 +418,7 @@ program.command("fill [file]").description("\uC11C\uC2DD \uBB38\uC11C\uC758 \uBE
418
418
  });
419
419
  program.command("seal <file>").description('\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBBF8\uC9C0\uB97C \uC575\uCEE4 \uBB38\uAD6C \uC704\uC5D0 \uBD80\uC720 \uBC30\uCE58 (\uD45C/\uD398\uC774\uC9C0 \uBD88\uD655\uC7A5) \u2014 kordoc seal \uC2E0\uCCAD\uC11C.hwpx --image \uB3C4\uC7A5.png --anchor "(\uC778)" -o \uACB0\uACFC.hwpx').requiredOption("--image <path>", "\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBBF8\uC9C0 (\uD22C\uBA85 \uBC30\uACBD PNG \uAD8C\uC7A5)").option("--anchor <text>", "\uC575\uCEE4 \uBB38\uAD6C", "(\uC778)").option("-n, --occurrence <num>", "\uAC19\uC740 \uC575\uCEE4\uAC00 \uC5EC\uB7FF\uC77C \uB54C 0-based \uC120\uD0DD", "0").option("--size-mm <num>", "\uB3C4\uC7A5 \uD55C \uBCC0 \uD06C\uAE30 mm (\uAE30\uBCF8: \uC904\uB192\uC774\xD71.6, 7~18 \uD074\uB7A8\uD504)").option("--mode <mode>", "overlap(\uBB38\uAD6C \uC704 \uACB9\uCE68) | right(\uC624\uB978\uCABD \uC606) | auto", "auto").option("--dx <mm>", "x \uBBF8\uC138\uC870\uC815 mm", "0").option("--dy <mm>", "y \uBBF8\uC138\uC870\uC815 mm", "0").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uAE30\uBCF8: <\uC785\uB825>.sealed.hwpx)").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (file, opts) => {
420
420
  try {
421
- const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-MK2223RL.js");
421
+ const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-O42BMYNX.js");
422
422
  const rootOpts = program.opts();
423
423
  const output = opts.output ?? rootOpts.output;
424
424
  const silent = opts.silent ?? rootOpts.silent;
@@ -496,7 +496,7 @@ program.command("seal <file>").description('\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBB
496
496
  });
497
497
  program.command("patch <original> <edited>").description("\uC11C\uC2DD \uBCF4\uC874 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uD328\uCE58 \u2014 \uD3B8\uC9D1\uB41C \uB9C8\uD06C\uB2E4\uC6B4\uC744 \uC6D0\uBCF8 HWPX/HWP\uC5D0 in-place \uBC18\uC601 (kordoc patch \uC6D0\uBCF8.hwpx \uD3B8\uC9D1.md -o \uCD9C\uB825.hwpx). \uBBF8\uC801\uC6A9(skip) \uD3B8\uC9D1\uC774 \uC788\uC73C\uBA74 exit 2").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uAE30\uBCF8: <\uC6D0\uBCF8>.patched.hwpx|.hwp)").option("--no-verify", "\uD328\uCE58 \uD6C4 \uC7AC\uD30C\uC2F1 \uC790\uB3D9 \uAC80\uC99D \uC0DD\uB7B5").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (original, edited, opts) => {
498
498
  try {
499
- const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-MK2223RL.js");
499
+ const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-O42BMYNX.js");
500
500
  const rootOpts = program.opts();
501
501
  const output = opts.output ?? rootOpts.output;
502
502
  const silent = opts.silent ?? rootOpts.silent;
@@ -537,7 +537,7 @@ program.command("patch <original> <edited>").description("\uC11C\uC2DD \uBCF4\uC
537
537
  });
538
538
  program.command("validate <file>").description("HWPX \uAD6C\uC870 \uAC80\uC99D \u2014 ZIP\xB7mimetype\xB7\uD544\uC218 \uD30C\uC77C\xB7XML \uC6F0\uD3FC\uB4DC\xB7secCnt\xB7manifest \uCC38\uC870 (\uD55C\uCEF4\uB3C5\uC2A4 \uAC70\uBD80 \uC694\uC778 \uC0AC\uC804 \uCC28\uB2E8)").option("--json", "\uACB0\uACFC\uB97C JSON\uC73C\uB85C stdout\uC5D0 \uCD9C\uB825").action(async (file, opts) => {
539
539
  try {
540
- const { validateHwpx } = await import("./-MK2223RL.js");
540
+ const { validateHwpx } = await import("./-O42BMYNX.js");
541
541
  const buf = new Uint8Array(readFileSync(resolve(file)));
542
542
  const result = await validateHwpx(buf);
543
543
  if (opts.json) {
@@ -751,7 +751,7 @@ program.command("lint <file>").description("\uACF5\uBB38\uC11C \uD45C\uAE30\uBC9
751
751
  }
752
752
  });
753
753
  program.command("redact <files...>").description("\uAC1C\uC778\uC815\uBCF4 \uC11C\uC2DD \uBCF4\uC874 \uB9C8\uC2A4\uD0B9 \u2014 \uC8FC\uBBFC\uBC88\uD638\xB7\uC804\uD654\xB7\uC774\uBA54\uC77C\xB7\uCE74\uB4DC\xB7\uACC4\uC88C\uB97C \uD0D0\uC9C0\uD574 HWPX/HWP\uB294 \uC6D0\uBCF8 \uC11C\uC2DD \uADF8\uB300\uB85C patch, \uADF8 \uC678 \uD3EC\uB9F7\uC740 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4 \uCD9C\uB825. \uC790\uB3D9 \uAC80\uCD9C \uBCF4\uC870 \uB3C4\uAD6C\uC774\uBBC0\uB85C \uACB0\uACFC\uB294 \uBC18\uB4DC\uC2DC \uC0AC\uB78C\uC774 \uCD5C\uC885 \uD655\uC778\uD558\uC138\uC694 (\uC774\uBBF8\uC9C0 \uC548 \uD14D\uC2A4\uD2B8\uB294 \uD0D0\uC9C0 \uBD88\uAC00)").option("--rules <csv>", "\uC801\uC6A9 \uB8F0 (\uAE30\uBCF8: rrn,phone,email,card,account \u2014 passport,driver\uB294 opt-in)").option("--mask-char <ch>", "\uB9C8\uC2A4\uD06C \uBB38\uC790 1\uAE00\uC790 (\uAE30\uBCF8: \u25CF)").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uB2E8\uC77C \uD30C\uC77C \uC2DC)").option("-d, --out-dir <dir>", "\uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC (\uB2E4\uC911 \uD30C\uC77C \uC2DC)").option("--dry-run", "\uD0D0\uC9C0 \uB9AC\uD3EC\uD2B8\uB9CC \uCD9C\uB825, \uD30C\uC77C \uBBF8\uC0DD\uC131").option("--json", "\uB9AC\uD3EC\uD2B8\uB97C JSON\uC73C\uB85C stdout \uCD9C\uB825").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (files, opts) => {
754
- const { redactMarkdown, DEFAULT_REDACT_RULES, patchHwpx, patchHwp } = await import("./-MK2223RL.js");
754
+ const { redactMarkdown, DEFAULT_REDACT_RULES, patchHwpx, patchHwp } = await import("./-O42BMYNX.js");
755
755
  const rootOpts = program.opts();
756
756
  const output = opts.output ?? rootOpts.output;
757
757
  const silent = opts.silent ?? rootOpts.silent;
@@ -840,7 +840,7 @@ program.command("render <file>").description("\uB808\uC774\uC544\uC6C3 \uBCF4\uC
840
840
  const rootOpts = program.opts();
841
841
  const output = opts.output ?? rootOpts.output;
842
842
  const silent = opts.silent ?? rootOpts.silent;
843
- const { renderHwpxToSvg } = await import("./render-CAFQT7S4.js");
843
+ const { renderHwpxToSvg } = await import("./render-IQ4IZLY4.js");
844
844
  const absPath = resolve(file);
845
845
  const buffer = readFileSync(absPath);
846
846
  const highlights = opts.highlight ? String(opts.highlight).split(",") : void 0;
@@ -862,7 +862,7 @@ program.command("render <file>").description("\uB808\uC774\uC544\uC6C3 \uBCF4\uC
862
862
  });
863
863
  program.command("render-worker").description("persistent \uB80C\uB354 \uC6CC\uCEE4 \u2014 stdin NDJSON \uC694\uCCAD \u2192 \uC870\uD310 SVG \uD30C\uC77C \uCD9C\uB825 (\uD504\uB85C\uC138\uC2A4 \uC720\uC9C0, \uCF5C\uB4DC\uC2A4\uD0C0\uD2B8 \uC81C\uAC70)").action(async () => {
864
864
  const { createInterface } = await import("readline");
865
- const { renderHwpxToSvg } = await import("./render-CAFQT7S4.js");
865
+ const { renderHwpxToSvg } = await import("./render-IQ4IZLY4.js");
866
866
  const rl = createInterface({ input: process.stdin });
867
867
  const write = (o) => void process.stdout.write(JSON.stringify(o) + "\n");
868
868
  write({ ready: true, version: VERSION });
@@ -4,12 +4,12 @@ import {
4
4
  getOcrEngine,
5
5
  ocrItemsToBlocks,
6
6
  rulingToPdfLines
7
- } from "./chunk-P2NWNJMR.js";
8
- import "./chunk-PEVPKD6Z.js";
9
- import "./chunk-MVTX6ODZ.js";
7
+ } from "./chunk-PLEGO474.js";
8
+ import "./chunk-BQENBAUC.js";
9
+ import "./chunk-4VNUQYUE.js";
10
10
  import {
11
11
  KordocError
12
- } from "./chunk-ZYVULRYF.js";
12
+ } from "./chunk-J3W6Q3AX.js";
13
13
  import {
14
14
  ensureOcrModels
15
15
  } from "./chunk-GZDOWYJM.js";
@@ -76,4 +76,4 @@ function detectImageMime(buffer) {
76
76
  export {
77
77
  parseImageDocument
78
78
  };
79
- //# sourceMappingURL=image-ocr-4MHEX4MN.js.map
79
+ //# sourceMappingURL=image-ocr-5QRZBNOF.js.map
@@ -4,12 +4,12 @@
4
4
 
5
5
 
6
6
 
7
- var _chunk5QTHHQQEcjs = require('./chunk-5QTHHQQE.cjs');
7
+ var _chunkTZ3WCAJZcjs = require('./chunk-TZ3WCAJZ.cjs');
8
8
  require('./chunk-ZV5OKQ3Z.cjs');
9
- require('./chunk-C27PPXRZ.cjs');
9
+ require('./chunk-ZDWP3LLY.cjs');
10
10
 
11
11
 
12
- var _chunkTUU535RBcjs = require('./chunk-TUU535RB.cjs');
12
+ var _chunkDJKLOLBTcjs = require('./chunk-DJKLOLBT.cjs');
13
13
  require('./chunk-GS7T56RP.cjs');
14
14
 
15
15
  // src/ocr/image-ocr.ts
@@ -25,13 +25,13 @@ async function parseImageDocument(buffer, options) {
25
25
  return { blocks: [{ type: "paragraph", text: text.trim(), pageNumber: 1 }], warnings };
26
26
  }
27
27
  const { data, width, height } = await decodeToRgba(buffer);
28
- await _chunk5QTHHQQEcjs.ensureOcrModels.call(void 0, (p) => {
28
+ await _chunkTZ3WCAJZcjs.ensureOcrModels.call(void 0, (p) => {
29
29
  if (p.phase === "download" && p.downloaded === 0) {
30
30
  process.stderr.write(`[kordoc-ocr] ${p.spec.name} \uB2E4\uC6B4\uB85C\uB4DC \uC911 (~${p.spec.sizeMb}MB)...
31
31
  `);
32
32
  }
33
33
  });
34
- const engine = await _chunk5QTHHQQEcjs.getOcrEngine.call(void 0, );
34
+ const engine = await _chunkTZ3WCAJZcjs.getOcrEngine.call(void 0, );
35
35
  const stats = { droppedLowConf: 0 };
36
36
  const items = await engine.recognizePage(data, width, height, stats);
37
37
  if (stats.droppedLowConf > 0) {
@@ -47,9 +47,9 @@ async function parseImageDocument(buffer, options) {
47
47
  }
48
48
  const pdfW = width / IMAGE_SCALE;
49
49
  const pdfH = height / IMAGE_SCALE;
50
- const ruling = _chunk5QTHHQQEcjs.detectRulingLines.call(void 0, data, width, height, IMAGE_SCALE);
51
- const extraLines = _chunk5QTHHQQEcjs.rulingToPdfLines.call(void 0, ruling, IMAGE_SCALE, pdfH);
52
- return { blocks: _chunk5QTHHQQEcjs.ocrItemsToBlocks.call(void 0, items, 1, pdfW, pdfH, IMAGE_SCALE, extraLines, _optionalChain([options, 'optionalAccess', _2 => _2.tables]) !== false), warnings };
50
+ const ruling = _chunkTZ3WCAJZcjs.detectRulingLines.call(void 0, data, width, height, IMAGE_SCALE);
51
+ const extraLines = _chunkTZ3WCAJZcjs.rulingToPdfLines.call(void 0, ruling, IMAGE_SCALE, pdfH);
52
+ return { blocks: _chunkTZ3WCAJZcjs.ocrItemsToBlocks.call(void 0, items, 1, pdfW, pdfH, IMAGE_SCALE, extraLines, _optionalChain([options, 'optionalAccess', _2 => _2.tables]) !== false), warnings };
53
53
  }
54
54
  async function decodeToRgba(buffer) {
55
55
  let sharp;
@@ -57,7 +57,7 @@ async function decodeToRgba(buffer) {
57
57
  const mod = await Promise.resolve().then(() => _interopRequireWildcard(require("sharp")));
58
58
  sharp = typeof mod === "function" ? mod : _nullishCoalesce(mod.default, () => ( mod));
59
59
  } catch (e) {
60
- throw new (0, _chunkTUU535RBcjs.KordocError)(
60
+ throw new (0, _chunkDJKLOLBTcjs.KordocError)(
61
61
  `\uC774\uBBF8\uC9C0 \uD30C\uC2F1\uC5D0\uB294 optional dependency 'sharp' \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4. \`npm install sharp\` \uD6C4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694. \uC6D0\uC778: ${e.message}`
62
62
  );
63
63
  }
@@ -73,4 +73,4 @@ function detectImageMime(buffer) {
73
73
 
74
74
 
75
75
  exports.parseImageDocument = parseImageDocument;
76
- //# sourceMappingURL=image-ocr-OB5PCQUU.cjs.map
76
+ //# sourceMappingURL=image-ocr-MKD6MKWO.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/mong-e/workspace/kordoc/dist/image-ocr-OB5PCQUU.cjs","../src/ocr/image-ocr.ts"],"names":[],"mappings":"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","file":"/Users/mong-e/workspace/kordoc/dist/image-ocr-OB5PCQUU.cjs","sourcesContent":[null,"/**\n * 이미지 직접 입력 OCR — PNG/JPEG/WebP 를 PDF 래핑 없이 바로 파싱한다.\n *\n * 이미지는 텍스트층이 없으므로 OCR 이 항상 필요하다 — `--ocr` 플래그 없이도\n * 내장 엔진(PP-OCRv5 korean)을 기본 적용하고, OcrProvider 가 주어지면 위임한다.\n * 좌표는 216dpi(스케일 3) 가정으로 PDF pt 공간에 환산해 기존 블록 파이프라인\n * (괘선 감지 → 선 기반 표 → 클러스터 → xy-cut)을 그대로 태운다.\n *\n * 디코딩은 optional dependency `sharp` — 미설치면 MISSING_DEPENDENCY 안내.\n */\n\nimport type { IRBlock, ParseOptions, ParseWarning } from \"../types.js\"\nimport { KordocError } from \"../utils.js\"\nimport { getOcrEngine } from \"./engine.js\"\nimport { ensureOcrModels } from \"./models.js\"\nimport { detectRulingLines, rulingToPdfLines } from \"./ruling-lines.js\"\nimport { ocrItemsToBlocks } from \"./pdf-ocr.js\"\n\n/** 좌표 환산 스케일 (px/pt) — PDF OCR 렌더(216dpi)와 동일 기준 */\nconst IMAGE_SCALE = 3\n\nexport interface ImageOcrResult {\n blocks: IRBlock[]\n warnings: ParseWarning[]\n}\n\n/** 이미지 버퍼 → OCR → IRBlock[] (표 괘선 감지 포함) */\nexport async function parseImageDocument(\n buffer: ArrayBuffer,\n options?: ParseOptions,\n): Promise<ImageOcrResult> {\n const warnings: ParseWarning[] = []\n\n // 사용자 OcrProvider — 원본 바이트 그대로 위임 (종전 PDF 경로와 같은 계약)\n if (typeof options?.ocr === \"function\") {\n const text = await options.ocr(new Uint8Array(buffer), 1, detectImageMime(buffer))\n if (!text.trim()) {\n warnings.push({ page: 1, message: \"OCR 결과 없음\", code: \"OCR_FAILED\" })\n return { blocks: [], warnings }\n }\n return { blocks: [{ type: \"paragraph\", text: text.trim(), pageNumber: 1 }], warnings }\n }\n\n const { data, width, height } = await decodeToRgba(buffer)\n\n await ensureOcrModels(p => {\n if (p.phase === \"download\" && p.downloaded === 0) {\n process.stderr.write(`[kordoc-ocr] ${p.spec.name} 다운로드 중 (~${p.spec.sizeMb}MB)...\\n`)\n }\n })\n const engine = await getOcrEngine()\n const stats = { droppedLowConf: 0 }\n const items = await engine.recognizePage(data, width, height, stats)\n if (stats.droppedLowConf > 0) {\n warnings.push({\n page: 1,\n message: `저신뢰 OCR 라인 ${stats.droppedLowConf}개 폐기 (인식 결손 가능)`,\n code: \"OCR_LOW_CONF\",\n })\n }\n if (items.length === 0) {\n warnings.push({ page: 1, message: \"이미지에서 텍스트를 인식하지 못했습니다\", code: \"OCR_FAILED\" })\n return { blocks: [], warnings }\n }\n\n const pdfW = width / IMAGE_SCALE\n const pdfH = height / IMAGE_SCALE\n const ruling = detectRulingLines(data, width, height, IMAGE_SCALE)\n const extraLines = rulingToPdfLines(ruling, IMAGE_SCALE, pdfH)\n return { blocks: ocrItemsToBlocks(items, 1, pdfW, pdfH, IMAGE_SCALE, extraLines, options?.tables !== false), warnings }\n}\n\n/** sharp 로 RGBA 디코딩 — 미설치는 MISSING_DEPENDENCY 로 분류되도록 안내 메시지 throw */\nasync function decodeToRgba(\n buffer: ArrayBuffer,\n): Promise<{ data: Uint8Array; width: number; height: number }> {\n type SharpFactory = (input: Buffer) => {\n ensureAlpha(): { raw(): { toBuffer(opts: { resolveWithObject: true }): Promise<{ data: Buffer; info: { width: number; height: number } }> } }\n }\n let sharp: SharpFactory\n try {\n const mod = (await import(\"sharp\")) as unknown as SharpFactory | { default?: SharpFactory }\n sharp = typeof mod === \"function\" ? mod : (mod.default ?? (mod as unknown as SharpFactory))\n } catch (e) {\n // KordocError + \"optional dependency\" 문구 → sanitizeError 메시지 보존 + MISSING_DEPENDENCY 분류\n throw new KordocError(\n \"이미지 파싱에는 optional dependency 'sharp' 가 필요합니다. \" +\n `\\`npm install sharp\\` 후 다시 실행하세요. 원인: ${(e as Error).message}`,\n )\n }\n const { data, info } = await sharp(Buffer.from(buffer)).ensureAlpha().raw().toBuffer({ resolveWithObject: true })\n return { data: new Uint8Array(data.buffer, data.byteOffset, data.byteLength), width: info.width, height: info.height }\n}\n\n/** OcrProvider 계약용 mime 판별 */\nfunction detectImageMime(buffer: ArrayBuffer): \"image/png\" | \"image/jpeg\" | \"image/webp\" {\n const b = new Uint8Array(buffer, 0, Math.min(12, buffer.byteLength))\n if (b[0] === 0xff && b[1] === 0xd8) return \"image/jpeg\"\n if (b[0] === 0x52 && b[1] === 0x49) return \"image/webp\"\n return \"image/png\"\n}\n"]}
1
+ {"version":3,"sources":["/Users/mong-e/workspace/kordoc/dist/image-ocr-MKD6MKWO.cjs","../src/ocr/image-ocr.ts"],"names":[],"mappings":"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","file":"/Users/mong-e/workspace/kordoc/dist/image-ocr-MKD6MKWO.cjs","sourcesContent":[null,"/**\n * 이미지 직접 입력 OCR — PNG/JPEG/WebP 를 PDF 래핑 없이 바로 파싱한다.\n *\n * 이미지는 텍스트층이 없으므로 OCR 이 항상 필요하다 — `--ocr` 플래그 없이도\n * 내장 엔진(PP-OCRv5 korean)을 기본 적용하고, OcrProvider 가 주어지면 위임한다.\n * 좌표는 216dpi(스케일 3) 가정으로 PDF pt 공간에 환산해 기존 블록 파이프라인\n * (괘선 감지 → 선 기반 표 → 클러스터 → xy-cut)을 그대로 태운다.\n *\n * 디코딩은 optional dependency `sharp` — 미설치면 MISSING_DEPENDENCY 안내.\n */\n\nimport type { IRBlock, ParseOptions, ParseWarning } from \"../types.js\"\nimport { KordocError } from \"../utils.js\"\nimport { getOcrEngine } from \"./engine.js\"\nimport { ensureOcrModels } from \"./models.js\"\nimport { detectRulingLines, rulingToPdfLines } from \"./ruling-lines.js\"\nimport { ocrItemsToBlocks } from \"./pdf-ocr.js\"\n\n/** 좌표 환산 스케일 (px/pt) — PDF OCR 렌더(216dpi)와 동일 기준 */\nconst IMAGE_SCALE = 3\n\nexport interface ImageOcrResult {\n blocks: IRBlock[]\n warnings: ParseWarning[]\n}\n\n/** 이미지 버퍼 → OCR → IRBlock[] (표 괘선 감지 포함) */\nexport async function parseImageDocument(\n buffer: ArrayBuffer,\n options?: ParseOptions,\n): Promise<ImageOcrResult> {\n const warnings: ParseWarning[] = []\n\n // 사용자 OcrProvider — 원본 바이트 그대로 위임 (종전 PDF 경로와 같은 계약)\n if (typeof options?.ocr === \"function\") {\n const text = await options.ocr(new Uint8Array(buffer), 1, detectImageMime(buffer))\n if (!text.trim()) {\n warnings.push({ page: 1, message: \"OCR 결과 없음\", code: \"OCR_FAILED\" })\n return { blocks: [], warnings }\n }\n return { blocks: [{ type: \"paragraph\", text: text.trim(), pageNumber: 1 }], warnings }\n }\n\n const { data, width, height } = await decodeToRgba(buffer)\n\n await ensureOcrModels(p => {\n if (p.phase === \"download\" && p.downloaded === 0) {\n process.stderr.write(`[kordoc-ocr] ${p.spec.name} 다운로드 중 (~${p.spec.sizeMb}MB)...\\n`)\n }\n })\n const engine = await getOcrEngine()\n const stats = { droppedLowConf: 0 }\n const items = await engine.recognizePage(data, width, height, stats)\n if (stats.droppedLowConf > 0) {\n warnings.push({\n page: 1,\n message: `저신뢰 OCR 라인 ${stats.droppedLowConf}개 폐기 (인식 결손 가능)`,\n code: \"OCR_LOW_CONF\",\n })\n }\n if (items.length === 0) {\n warnings.push({ page: 1, message: \"이미지에서 텍스트를 인식하지 못했습니다\", code: \"OCR_FAILED\" })\n return { blocks: [], warnings }\n }\n\n const pdfW = width / IMAGE_SCALE\n const pdfH = height / IMAGE_SCALE\n const ruling = detectRulingLines(data, width, height, IMAGE_SCALE)\n const extraLines = rulingToPdfLines(ruling, IMAGE_SCALE, pdfH)\n return { blocks: ocrItemsToBlocks(items, 1, pdfW, pdfH, IMAGE_SCALE, extraLines, options?.tables !== false), warnings }\n}\n\n/** sharp 로 RGBA 디코딩 — 미설치는 MISSING_DEPENDENCY 로 분류되도록 안내 메시지 throw */\nasync function decodeToRgba(\n buffer: ArrayBuffer,\n): Promise<{ data: Uint8Array; width: number; height: number }> {\n type SharpFactory = (input: Buffer) => {\n ensureAlpha(): { raw(): { toBuffer(opts: { resolveWithObject: true }): Promise<{ data: Buffer; info: { width: number; height: number } }> } }\n }\n let sharp: SharpFactory\n try {\n const mod = (await import(\"sharp\")) as unknown as SharpFactory | { default?: SharpFactory }\n sharp = typeof mod === \"function\" ? mod : (mod.default ?? (mod as unknown as SharpFactory))\n } catch (e) {\n // KordocError + \"optional dependency\" 문구 → sanitizeError 메시지 보존 + MISSING_DEPENDENCY 분류\n throw new KordocError(\n \"이미지 파싱에는 optional dependency 'sharp' 가 필요합니다. \" +\n `\\`npm install sharp\\` 후 다시 실행하세요. 원인: ${(e as Error).message}`,\n )\n }\n const { data, info } = await sharp(Buffer.from(buffer)).ensureAlpha().raw().toBuffer({ resolveWithObject: true })\n return { data: new Uint8Array(data.buffer, data.byteOffset, data.byteLength), width: info.width, height: info.height }\n}\n\n/** OcrProvider 계약용 mime 판별 */\nfunction detectImageMime(buffer: ArrayBuffer): \"image/png\" | \"image/jpeg\" | \"image/webp\" {\n const b = new Uint8Array(buffer, 0, Math.min(12, buffer.byteLength))\n if (b[0] === 0xff && b[1] === 0xd8) return \"image/jpeg\"\n if (b[0] === 0x52 && b[1] === 0x49) return \"image/webp\"\n return \"image/png\"\n}\n"]}
@@ -4,12 +4,12 @@ import {
4
4
  getOcrEngine,
5
5
  ocrItemsToBlocks,
6
6
  rulingToPdfLines
7
- } from "./chunk-AEYNY6FG.js";
7
+ } from "./chunk-6663UXPE.js";
8
8
  import "./chunk-3H5X63BQ.js";
9
- import "./chunk-GIWKBPII.js";
9
+ import "./chunk-3UIT4PPQ.js";
10
10
  import {
11
11
  KordocError
12
- } from "./chunk-YUVKU5CW.js";
12
+ } from "./chunk-IZEUWEEY.js";
13
13
 
14
14
  // src/ocr/image-ocr.ts
15
15
  var IMAGE_SCALE = 3;
@@ -72,4 +72,4 @@ function detectImageMime(buffer) {
72
72
  export {
73
73
  parseImageDocument
74
74
  };
75
- //# sourceMappingURL=image-ocr-3A3HZX6O.js.map
75
+ //# sourceMappingURL=image-ocr-TAJHRZ5T.js.map