kordoc 4.4.0 → 4.4.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.
- package/README.md +9 -3
- package/dist/{-R6NUMPRV.js → -7X4H77Z7.js} +8 -8
- package/dist/{chunk-YOZ7ZRCD.js → chunk-2352RXHG.js} +8 -8
- package/dist/{chunk-SKM6KZUH.cjs → chunk-3DX6VJGH.cjs} +9 -9
- package/dist/{chunk-SKM6KZUH.cjs.map → chunk-3DX6VJGH.cjs.map} +1 -1
- package/dist/{chunk-GHGZU2LQ.js → chunk-5A2TGIN7.js} +2 -2
- package/dist/{chunk-65DYCXGC.js → chunk-5PXCA3DN.js} +3 -3
- package/dist/{chunk-H2KMJOB6.cjs → chunk-7BIVNIK5.cjs} +2 -2
- package/dist/{chunk-H2KMJOB6.cjs.map → chunk-7BIVNIK5.cjs.map} +1 -1
- package/dist/{chunk-HNRULYUH.js → chunk-7MDLAKVO.js} +2 -2
- package/dist/{chunk-YVYU267E.js → chunk-AYM6UHFX.js} +2 -2
- package/dist/chunk-AYM6UHFX.js.map +1 -0
- package/dist/{chunk-AB322K3O.cjs → chunk-FR65WNLF.cjs} +3 -3
- package/dist/{chunk-AB322K3O.cjs.map → chunk-FR65WNLF.cjs.map} +1 -1
- package/dist/{chunk-UDGPM5R5.cjs → chunk-GC7WBHAN.cjs} +4 -4
- package/dist/{chunk-UDGPM5R5.cjs.map → chunk-GC7WBHAN.cjs.map} +1 -1
- package/dist/{chunk-W6CUD7V3.js → chunk-HGSO2H44.js} +2 -2
- package/dist/{chunk-RZURSA4N.js → chunk-IPOVUGXD.js} +3 -3
- package/dist/{chunk-5KLE3U23.js → chunk-JGHQFUKI.js} +2 -2
- package/dist/{chunk-V35DRUJC.js → chunk-NUGTEPKT.js} +2 -2
- package/dist/{chunk-QXYB74QF.js → chunk-SMPEZINI.js} +2 -2
- package/dist/{chunk-ONS7JKVA.js → chunk-T25FBUMN.js} +2 -2
- package/dist/{chunk-HFJF477F.js → chunk-TGAWXMXB.js} +2 -2
- package/dist/chunk-TGAWXMXB.js.map +1 -0
- package/dist/{chunk-XCIC7U6Y.js → chunk-UA53AA7R.js} +2 -2
- package/dist/{chunk-P7YPCK7C.js → chunk-WA7XLWZW.js} +2 -2
- package/dist/chunks-FMZK4QHL.js +10 -0
- package/dist/cli.js +16 -16
- package/dist/{image-ocr-U2DRRFL3.js → image-ocr-AHHY42OI.js} +4 -4
- package/dist/{image-ocr-XC52AQDV.js → image-ocr-K4XCRBTY.js} +4 -4
- package/dist/{image-ocr-F2BQA26V.cjs → image-ocr-VCXLT5Q6.cjs} +10 -10
- package/dist/{image-ocr-F2BQA26V.cjs.map → image-ocr-VCXLT5Q6.cjs.map} +1 -1
- package/dist/index.cjs +178 -178
- package/dist/index.js +4 -4
- package/dist/mcp.js +26 -24
- package/dist/mcp.js.map +1 -1
- package/dist/{parser-FFQN67O6.cjs → parser-ABYM2MVN.cjs} +24 -24
- package/dist/{parser-FFQN67O6.cjs.map → parser-ABYM2MVN.cjs.map} +1 -1
- package/dist/{parser-ESGFWWCT.js → parser-I3ELUUOG.js} +5 -5
- package/dist/{parser-TFPGQWCC.js → parser-IPVY56U3.js} +5 -5
- package/dist/pdf-ocr-EL3VSWWY.js +12 -0
- package/dist/{pdf-ocr-WE5TMRFU.js → pdf-ocr-FVLKQNAT.js} +4 -4
- package/dist/pdf-ocr-VQ3QWXGE.cjs +13 -0
- package/dist/{pdf-ocr-UQBZH3HE.cjs.map → pdf-ocr-VQ3QWXGE.cjs.map} +1 -1
- package/dist/{profile-io-O6BDCUJN.js → profile-io-YADU6SKH.js} +3 -3
- package/dist/{rasterize-V22VCCE7.js → rasterize-YV5VDSQX.js} +2 -2
- package/dist/render-K6M3P24X.js +10 -0
- package/dist/seal-YW3U5BCY.js +10 -0
- package/dist/{watch-HGKBICED.js → watch-5K2ZERXI.js} +8 -8
- package/package.json +1 -1
- package/dist/chunk-HFJF477F.js.map +0 -1
- package/dist/chunk-YVYU267E.js.map +0 -1
- package/dist/chunks-QMGCI5DG.js +0 -10
- package/dist/pdf-ocr-4R646OO6.js +0 -12
- package/dist/pdf-ocr-UQBZH3HE.cjs +0 -13
- package/dist/render-3BSVTTZE.js +0 -10
- package/dist/seal-6ZSEJVOD.js +0 -10
- /package/dist/{-R6NUMPRV.js.map → -7X4H77Z7.js.map} +0 -0
- /package/dist/{chunk-YOZ7ZRCD.js.map → chunk-2352RXHG.js.map} +0 -0
- /package/dist/{chunk-GHGZU2LQ.js.map → chunk-5A2TGIN7.js.map} +0 -0
- /package/dist/{chunk-65DYCXGC.js.map → chunk-5PXCA3DN.js.map} +0 -0
- /package/dist/{chunk-HNRULYUH.js.map → chunk-7MDLAKVO.js.map} +0 -0
- /package/dist/{chunk-W6CUD7V3.js.map → chunk-HGSO2H44.js.map} +0 -0
- /package/dist/{chunk-RZURSA4N.js.map → chunk-IPOVUGXD.js.map} +0 -0
- /package/dist/{chunk-5KLE3U23.js.map → chunk-JGHQFUKI.js.map} +0 -0
- /package/dist/{chunk-V35DRUJC.js.map → chunk-NUGTEPKT.js.map} +0 -0
- /package/dist/{chunk-QXYB74QF.js.map → chunk-SMPEZINI.js.map} +0 -0
- /package/dist/{chunk-ONS7JKVA.js.map → chunk-T25FBUMN.js.map} +0 -0
- /package/dist/{chunk-XCIC7U6Y.js.map → chunk-UA53AA7R.js.map} +0 -0
- /package/dist/{chunk-P7YPCK7C.js.map → chunk-WA7XLWZW.js.map} +0 -0
- /package/dist/{chunks-QMGCI5DG.js.map → chunks-FMZK4QHL.js.map} +0 -0
- /package/dist/{image-ocr-U2DRRFL3.js.map → image-ocr-AHHY42OI.js.map} +0 -0
- /package/dist/{image-ocr-XC52AQDV.js.map → image-ocr-K4XCRBTY.js.map} +0 -0
- /package/dist/{parser-ESGFWWCT.js.map → parser-I3ELUUOG.js.map} +0 -0
- /package/dist/{parser-TFPGQWCC.js.map → parser-IPVY56U3.js.map} +0 -0
- /package/dist/{pdf-ocr-4R646OO6.js.map → pdf-ocr-EL3VSWWY.js.map} +0 -0
- /package/dist/{pdf-ocr-WE5TMRFU.js.map → pdf-ocr-FVLKQNAT.js.map} +0 -0
- /package/dist/{profile-io-O6BDCUJN.js.map → profile-io-YADU6SKH.js.map} +0 -0
- /package/dist/{rasterize-V22VCCE7.js.map → rasterize-YV5VDSQX.js.map} +0 -0
- /package/dist/{render-3BSVTTZE.js.map → render-K6M3P24X.js.map} +0 -0
- /package/dist/{seal-6ZSEJVOD.js.map → seal-YW3U5BCY.js.map} +0 -0
- /package/dist/{watch-HGKBICED.js.map → watch-5K2ZERXI.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
parseFormatProfileJson
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-NUGTEPKT.js";
|
|
5
5
|
import {
|
|
6
6
|
BODY_FONTS,
|
|
7
7
|
BULLET2_CHARS,
|
|
@@ -27,23 +27,23 @@ import {
|
|
|
27
27
|
readBuiltinTemplate,
|
|
28
28
|
resolveBuiltinTemplate,
|
|
29
29
|
unknownFontWarnings
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-2352RXHG.js";
|
|
31
31
|
import "./chunk-7FCNOKOR.js";
|
|
32
32
|
import "./chunk-A73RMJ6B.js";
|
|
33
33
|
import "./chunk-MOL7MDBG.js";
|
|
34
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-IPOVUGXD.js";
|
|
35
35
|
import "./chunk-DZIXKL7E.js";
|
|
36
|
-
import "./chunk-
|
|
36
|
+
import "./chunk-7MDLAKVO.js";
|
|
37
37
|
import {
|
|
38
38
|
blocksToMarkdown
|
|
39
|
-
} from "./chunk-
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
39
|
+
} from "./chunk-SMPEZINI.js";
|
|
40
|
+
import "./chunk-5PXCA3DN.js";
|
|
41
|
+
import "./chunk-JGHQFUKI.js";
|
|
42
42
|
import {
|
|
43
43
|
VERSION,
|
|
44
44
|
sanitizeError,
|
|
45
45
|
toArrayBuffer
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-WA7XLWZW.js";
|
|
47
47
|
|
|
48
48
|
// src/cli.ts
|
|
49
49
|
import { readFileSync, writeFileSync, mkdirSync, statSync } from "fs";
|
|
@@ -124,7 +124,7 @@ program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\
|
|
|
124
124
|
2
|
|
125
125
|
);
|
|
126
126
|
} else if (opts.format === "chunks") {
|
|
127
|
-
const { blocksToChunks } = await import("./chunks-
|
|
127
|
+
const { blocksToChunks } = await import("./chunks-FMZK4QHL.js");
|
|
128
128
|
output = JSON.stringify(blocksToChunks(result.blocks), null, 2);
|
|
129
129
|
} else {
|
|
130
130
|
output = markdown;
|
|
@@ -171,7 +171,7 @@ program.command("watch <dir>").description("\uB514\uB809\uD1A0\uB9AC \uAC10\uC2D
|
|
|
171
171
|
if (command.getOptionValueSource("format") === "default" && program.getOptionValueSource("format") === "cli") {
|
|
172
172
|
opts.format = rootOpts.format;
|
|
173
173
|
}
|
|
174
|
-
const { watchDirectory } = await import("./watch-
|
|
174
|
+
const { watchDirectory } = await import("./watch-5K2ZERXI.js");
|
|
175
175
|
await watchDirectory({
|
|
176
176
|
dir,
|
|
177
177
|
outDir: opts.outDir,
|
|
@@ -393,7 +393,7 @@ program.command("fill [file]").description("\uC11C\uC2DD \uBB38\uC11C\uC758 \uBE
|
|
|
393
393
|
});
|
|
394
394
|
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) => {
|
|
395
395
|
try {
|
|
396
|
-
const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-
|
|
396
|
+
const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-7X4H77Z7.js");
|
|
397
397
|
const rootOpts = program.opts();
|
|
398
398
|
const output = opts.output ?? rootOpts.output;
|
|
399
399
|
const silent = opts.silent ?? rootOpts.silent;
|
|
@@ -471,7 +471,7 @@ program.command("seal <file>").description('\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBB
|
|
|
471
471
|
});
|
|
472
472
|
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) => {
|
|
473
473
|
try {
|
|
474
|
-
const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-
|
|
474
|
+
const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-7X4H77Z7.js");
|
|
475
475
|
const rootOpts = program.opts();
|
|
476
476
|
const output = opts.output ?? rootOpts.output;
|
|
477
477
|
const silent = opts.silent ?? rootOpts.silent;
|
|
@@ -512,7 +512,7 @@ program.command("patch <original> <edited>").description("\uC11C\uC2DD \uBCF4\uC
|
|
|
512
512
|
});
|
|
513
513
|
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) => {
|
|
514
514
|
try {
|
|
515
|
-
const { validateHwpx } = await import("./-
|
|
515
|
+
const { validateHwpx } = await import("./-7X4H77Z7.js");
|
|
516
516
|
const buf = new Uint8Array(readFileSync(resolve(file)));
|
|
517
517
|
const result = await validateHwpx(buf);
|
|
518
518
|
if (opts.json) {
|
|
@@ -691,7 +691,7 @@ program.command("lint <file>").description("\uACF5\uBB38\uC11C \uD45C\uAE30\uBC9
|
|
|
691
691
|
}
|
|
692
692
|
});
|
|
693
693
|
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) => {
|
|
694
|
-
const { redactMarkdown, DEFAULT_REDACT_RULES, patchHwpx, patchHwp } = await import("./-
|
|
694
|
+
const { redactMarkdown, DEFAULT_REDACT_RULES, patchHwpx, patchHwp } = await import("./-7X4H77Z7.js");
|
|
695
695
|
const rootOpts = program.opts();
|
|
696
696
|
const output = opts.output ?? rootOpts.output;
|
|
697
697
|
const silent = opts.silent ?? rootOpts.silent;
|
|
@@ -780,7 +780,7 @@ program.command("render <file>").description("\uB808\uC774\uC544\uC6C3 \uBCF4\uC
|
|
|
780
780
|
const rootOpts = program.opts();
|
|
781
781
|
const output = opts.output ?? rootOpts.output;
|
|
782
782
|
const silent = opts.silent ?? rootOpts.silent;
|
|
783
|
-
const { renderHwpxToSvg } = await import("./render-
|
|
783
|
+
const { renderHwpxToSvg } = await import("./render-K6M3P24X.js");
|
|
784
784
|
const absPath = resolve(file);
|
|
785
785
|
const buffer = readFileSync(absPath);
|
|
786
786
|
const highlights = opts.highlight ? String(opts.highlight).split(",") : void 0;
|
|
@@ -802,7 +802,7 @@ program.command("render <file>").description("\uB808\uC774\uC544\uC6C3 \uBCF4\uC
|
|
|
802
802
|
});
|
|
803
803
|
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 () => {
|
|
804
804
|
const { createInterface } = await import("readline");
|
|
805
|
-
const { renderHwpxToSvg } = await import("./render-
|
|
805
|
+
const { renderHwpxToSvg } = await import("./render-K6M3P24X.js");
|
|
806
806
|
const rl = createInterface({ input: process.stdin });
|
|
807
807
|
const write = (o) => void process.stdout.write(JSON.stringify(o) + "\n");
|
|
808
808
|
write({ ready: true, version: VERSION });
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
getOcrEngine,
|
|
5
5
|
ocrItemsToBlocks,
|
|
6
6
|
rulingToPdfLines
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-AYM6UHFX.js";
|
|
8
8
|
import "./chunk-3H5X63BQ.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-5A2TGIN7.js";
|
|
10
10
|
import {
|
|
11
11
|
KordocError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-T25FBUMN.js";
|
|
13
13
|
|
|
14
14
|
// src/ocr/image-ocr.ts
|
|
15
15
|
var IMAGE_SCALE = 3;
|
|
@@ -64,4 +64,4 @@ function detectImageMime(buffer) {
|
|
|
64
64
|
export {
|
|
65
65
|
parseImageDocument
|
|
66
66
|
};
|
|
67
|
-
//# sourceMappingURL=image-ocr-
|
|
67
|
+
//# sourceMappingURL=image-ocr-AHHY42OI.js.map
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
getOcrEngine,
|
|
5
5
|
ocrItemsToBlocks,
|
|
6
6
|
rulingToPdfLines
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-TGAWXMXB.js";
|
|
8
|
+
import "./chunk-HGSO2H44.js";
|
|
9
9
|
import "./chunk-A73RMJ6B.js";
|
|
10
10
|
import {
|
|
11
11
|
KordocError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-WA7XLWZW.js";
|
|
13
13
|
import {
|
|
14
14
|
ensureOcrModels
|
|
15
15
|
} from "./chunk-GZDOWYJM.js";
|
|
@@ -68,4 +68,4 @@ function detectImageMime(buffer) {
|
|
|
68
68
|
export {
|
|
69
69
|
parseImageDocument
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=image-ocr-
|
|
71
|
+
//# sourceMappingURL=image-ocr-K4XCRBTY.js.map
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkFR65WNLFcjs = require('./chunk-FR65WNLF.cjs');
|
|
8
8
|
require('./chunk-ZV5OKQ3Z.cjs');
|
|
9
|
-
require('./chunk-
|
|
9
|
+
require('./chunk-3DX6VJGH.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunk7BIVNIK5cjs = require('./chunk-7BIVNIK5.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
|
|
28
|
+
await _chunkFR65WNLFcjs.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
|
|
34
|
+
const engine = await _chunkFR65WNLFcjs.getOcrEngine.call(void 0, );
|
|
35
35
|
const items = await engine.recognizePage(data, width, height);
|
|
36
36
|
if (items.length === 0) {
|
|
37
37
|
warnings.push({ page: 1, message: "\uC774\uBBF8\uC9C0\uC5D0\uC11C \uD14D\uC2A4\uD2B8\uB97C \uC778\uC2DD\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4", code: "OCR_FAILED" });
|
|
@@ -39,9 +39,9 @@ async function parseImageDocument(buffer, options) {
|
|
|
39
39
|
}
|
|
40
40
|
const pdfW = width / IMAGE_SCALE;
|
|
41
41
|
const pdfH = height / IMAGE_SCALE;
|
|
42
|
-
const ruling =
|
|
43
|
-
const extraLines =
|
|
44
|
-
return { blocks:
|
|
42
|
+
const ruling = _chunkFR65WNLFcjs.detectRulingLines.call(void 0, data, width, height, IMAGE_SCALE);
|
|
43
|
+
const extraLines = _chunkFR65WNLFcjs.rulingToPdfLines.call(void 0, ruling, IMAGE_SCALE, pdfH);
|
|
44
|
+
return { blocks: _chunkFR65WNLFcjs.ocrItemsToBlocks.call(void 0, items, 1, pdfW, pdfH, IMAGE_SCALE, extraLines), warnings };
|
|
45
45
|
}
|
|
46
46
|
async function decodeToRgba(buffer) {
|
|
47
47
|
let sharp;
|
|
@@ -49,7 +49,7 @@ async function decodeToRgba(buffer) {
|
|
|
49
49
|
const mod = await Promise.resolve().then(() => _interopRequireWildcard(require("sharp")));
|
|
50
50
|
sharp = typeof mod === "function" ? mod : _nullishCoalesce(mod.default, () => ( mod));
|
|
51
51
|
} catch (e) {
|
|
52
|
-
throw new (0,
|
|
52
|
+
throw new (0, _chunk7BIVNIK5cjs.KordocError)(
|
|
53
53
|
`\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}`
|
|
54
54
|
);
|
|
55
55
|
}
|
|
@@ -65,4 +65,4 @@ function detectImageMime(buffer) {
|
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
exports.parseImageDocument = parseImageDocument;
|
|
68
|
-
//# sourceMappingURL=image-ocr-
|
|
68
|
+
//# sourceMappingURL=image-ocr-VCXLT5Q6.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/mong-e/workspace/kordoc/dist/image-ocr-
|
|
1
|
+
{"version":3,"sources":["/Users/mong-e/workspace/kordoc/dist/image-ocr-VCXLT5Q6.cjs","../src/ocr/image-ocr.ts"],"names":[],"mappings":"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","file":"/Users/mong-e/workspace/kordoc/dist/image-ocr-VCXLT5Q6.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 items = await engine.recognizePage(data, width, height)\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), 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"]}
|