@clazic/kordoc 2.4.4 → 2.4.6

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/dist/mcp.js CHANGED
@@ -10,14 +10,14 @@ import {
10
10
  markdownToHwpx,
11
11
  markdownToXlsx,
12
12
  parse
13
- } from "./chunk-5AXJRBBK.js";
13
+ } from "./chunk-L2CLLZ4S.js";
14
14
  import "./chunk-4PP34NVQ.js";
15
15
  import {
16
16
  KordocError,
17
17
  VERSION,
18
18
  sanitizeError,
19
19
  toArrayBuffer
20
- } from "./chunk-KEDUF24M.js";
20
+ } from "./chunk-A2FNPGBS.js";
21
21
  import "./chunk-MOL7MDBG.js";
22
22
  import "./chunk-7FMKAV4P.js";
23
23
  import "./chunk-JOGAFNIL.js";
@@ -98,29 +98,44 @@ async function ocrPagesBatch(doc, provider, pageFilter, effectivePageCount, warn
98
98
  let processed = 0;
99
99
  const batchTasks = pageBatches.map((batchPageNums, batchIdx) => async () => {
100
100
  const pageBlocks = [];
101
+ const batchImages = [];
101
102
  try {
102
- const batchImages = [];
103
103
  for (const pageNum of batchPageNums) {
104
104
  const page = await doc.getPage(pageNum);
105
105
  const image = await renderPageToPng(page);
106
106
  batchImages.push({ image, pageNum });
107
107
  }
108
- const results = await provider.processBatch(batchImages);
109
- for (const { pageNum } of batchImages) {
110
- const result = results.get(pageNum);
111
- pageBlocks.push({
112
- pageNum,
113
- blocks: result ? ocrResultToBlocks(result, pageNum) : []
114
- });
115
- }
116
- } catch (err) {
117
- const range = `${batchPageNums[0]}-${batchPageNums[batchPageNums.length - 1]}`;
118
- warnings?.push({
119
- message: `\uBC30\uCE58 OCR \uC2E4\uD328 (\uD398\uC774\uC9C0 ${range}): ${err instanceof Error ? err.message : "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958"}`,
120
- code: "OCR_PAGE_FAILED"
121
- });
108
+ } catch (renderErr) {
109
+ const rendered = new Set(batchImages.map((b) => b.pageNum));
122
110
  for (const pageNum of batchPageNums) {
123
- pageBlocks.push({ pageNum, blocks: [] });
111
+ if (!rendered.has(pageNum)) pageBlocks.push({ pageNum, blocks: [] });
112
+ }
113
+ }
114
+ if (batchImages.length > 0) {
115
+ try {
116
+ const results = await provider.processBatch(batchImages);
117
+ for (const { pageNum } of batchImages) {
118
+ const result = results.get(pageNum);
119
+ pageBlocks.push({
120
+ pageNum,
121
+ blocks: result ? ocrResultToBlocks(result, pageNum) : []
122
+ });
123
+ }
124
+ } catch (err) {
125
+ const range = `${batchPageNums[0]}-${batchPageNums[batchPageNums.length - 1]}`;
126
+ warnings?.push({
127
+ message: `\uBC30\uCE58 OCR \uC2E4\uD328 (\uD398\uC774\uC9C0 ${range}): ${err instanceof Error ? err.message : "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958"} \u2014 \uB2E8\uC77C \uD398\uC774\uC9C0\uB85C \uC7AC\uC2DC\uB3C4`,
128
+ code: "OCR_PAGE_FAILED"
129
+ });
130
+ for (const { image, pageNum } of batchImages) {
131
+ try {
132
+ const singleResult = await provider.processBatch([{ image, pageNum }]);
133
+ const r = singleResult.get(pageNum);
134
+ pageBlocks.push({ pageNum, blocks: r ? ocrResultToBlocks(r, pageNum) : [] });
135
+ } catch {
136
+ pageBlocks.push({ pageNum, blocks: [] });
137
+ }
138
+ }
124
139
  }
125
140
  }
126
141
  processed += batchPageNums.length;
@@ -149,4 +164,4 @@ async function renderPageToPng(page) {
149
164
  export {
150
165
  ocrPages
151
166
  };
152
- //# sourceMappingURL=provider-HE727F7Z.js.map
167
+ //# sourceMappingURL=provider-7F7NEDTN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ocr/provider.ts"],"sourcesContent":["/**\n * OCR 프로바이더 브릿지 — PDF 페이지를 이미지로 렌더링하여 OCR 호출\n *\n * kordoc은 OCR 라이브러리를 번들하지 않음.\n * 사용자가 OcrProvider 함수를 제공하면 이미지 기반 PDF도 텍스트 추출 가능.\n *\n * @example\n * ```ts\n * import { parse } from \"kordoc\"\n *\n * const result = await parse(buffer, {\n * ocr: async (pageImage, pageNumber, mimeType) => {\n * // Tesseract, Claude Vision, Google Vision 등 사용\n * return await myOcrService.recognize(pageImage)\n * }\n * })\n * ```\n */\n\nimport type { OcrProvider, IRBlock, ParseWarning, StructuredOcrResult, BatchOcrProvider } from \"../types.js\"\nimport { markdownToBlocks } from \"./markdown-to-blocks.js\"\n\n/**\n * 동시 실행 수를 제한한 병렬 태스크 실행 헬퍼.\n *\n * limit개의 워커를 만들어 tasks 배열을 순서대로 처리.\n * 각 워커는 완료되는 즉시 다음 태스크를 가져가므로 순서가 보존됨.\n *\n * @param tasks - 실행할 비동기 함수 배열\n * @param limit - 최대 동시 실행 수\n * @returns 입력 순서와 동일한 결과 배열\n */\nasync function runWithConcurrency<T>(\n tasks: (() => Promise<T>)[],\n limit: number\n): Promise<T[]> {\n const results: T[] = new Array(tasks.length)\n let nextIndex = 0\n\n // 각 워커는 처리할 태스크가 없을 때까지 반복\n async function worker() {\n while (nextIndex < tasks.length) {\n const idx = nextIndex++\n results[idx] = await tasks[idx]()\n }\n }\n\n // limit개 워커를 동시 실행 (tasks가 limit보다 적으면 tasks 수만큼)\n await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, () => worker()))\n return results\n}\n\n/**\n * OCR 결과(string | StructuredOcrResult)를 IRBlock[]으로 변환.\n */\nfunction ocrResultToBlocks(result: string | StructuredOcrResult, pageNum: number): IRBlock[] {\n const pageBlocks: IRBlock[] = []\n if (typeof result === \"string\") {\n // 순수 텍스트 → paragraph 블록\n if (result.trim()) {\n pageBlocks.push({ type: \"paragraph\", text: result.trim(), pageNumber: pageNum })\n }\n } else if (result && typeof result === \"object\" && \"markdown\" in result) {\n // 구조화된 결과 → Markdown → IRBlock[]\n const structured = result as StructuredOcrResult\n if (structured.markdown.trim()) {\n const converted = markdownToBlocks(structured.markdown, pageNum)\n for (const b of converted) pageBlocks.push(b)\n }\n }\n return pageBlocks\n}\n\n/** BatchOcrProvider 타입 가드 */\nfunction isBatchProvider(p: unknown): p is BatchOcrProvider {\n return !!p && typeof p === \"object\" && \"__batch\" in p && (p as BatchOcrProvider).__batch === true\n}\n\n/**\n * 이미지 기반 PDF 페이지에 OCR을 적용하여 IRBlock[] 반환.\n *\n * pdfjs page 객체에서 viewport + render를 통해 PNG 생성 후\n * 사용자 제공 OcrProvider 호출.\n *\n * - string 반환: 단순 텍스트 → paragraph 블록\n * - StructuredOcrResult 반환: Markdown → markdownToBlocks()로 구조화\n * - concurrency > 1: 병렬 처리 (워커 풀 프로바이더 권장)\n *\n * canvas 미설치 시 pdfjs render 불가하므로 에러 반환.\n */\nexport async function ocrPages(\n doc: { numPages: number; getPage(n: number): Promise<PdfPageProxy> },\n provider: OcrProvider | BatchOcrProvider,\n pageFilter: Set<number> | null,\n effectivePageCount: number,\n warnings?: ParseWarning[],\n concurrency: number = 1, // 기본값 1 = 순차 처리 (하위 호환)\n onProgress?: (current: number, total: number) => void\n): Promise<IRBlock[]> {\n const blocks: IRBlock[] = []\n\n // ── 배치 처리 (BatchOcrProvider) ────────────────────\n if (isBatchProvider(provider)) {\n return ocrPagesBatch(doc, provider, pageFilter, effectivePageCount, warnings, concurrency, onProgress)\n }\n\n // ── 순차 처리 (concurrency === 1) ────────────────────\n if (concurrency <= 1) {\n for (let i = 1; i <= effectivePageCount; i++) {\n if (pageFilter && !pageFilter.has(i)) continue\n const page = await doc.getPage(i)\n try {\n const imageData = await renderPageToPng(page)\n const result = await provider(imageData, i, \"image/png\")\n for (const b of ocrResultToBlocks(result, i)) blocks.push(b)\n } catch (err) {\n // 개별 페이지 실패 시 경고 발행 후 계속 진행\n warnings?.push({\n page: i,\n message: `페이지 ${i} OCR 실패: ${err instanceof Error ? err.message : \"알 수 없는 오류\"}`,\n code: \"OCR_PAGE_FAILED\",\n })\n }\n }\n return blocks\n }\n\n // ── 병렬 처리 (concurrency > 1) ──────────────────────\n // 처리 대상 페이지 번호 수집\n const pageNumbers: number[] = []\n for (let i = 1; i <= effectivePageCount; i++) {\n if (pageFilter && !pageFilter.has(i)) continue\n pageNumbers.push(i)\n }\n\n // 각 페이지에 대한 태스크 생성 (에러는 개별 캐치)\n const tasks = pageNumbers.map(pageNum => async (): Promise<{ pageNum: number; pageBlocks: IRBlock[] } | null> => {\n try {\n const page = await doc.getPage(pageNum)\n const imageData = await renderPageToPng(page)\n const result = await provider(imageData, pageNum, \"image/png\")\n return { pageNum, pageBlocks: ocrResultToBlocks(result, pageNum) }\n } catch (err) {\n // 개별 페이지 실패 시 경고 발행 후 null 반환\n warnings?.push({\n page: pageNum,\n message: `페이지 ${pageNum} OCR 실패: ${err instanceof Error ? err.message : \"알 수 없는 오류\"}`,\n code: \"OCR_PAGE_FAILED\",\n })\n return null\n }\n })\n\n // 병렬 실행 — concurrency 수만큼 동시 처리\n const taskResults = await runWithConcurrency(tasks, concurrency)\n\n // 결과를 페이지 번호 순서대로 합산 (pageNumbers 순서 = 오름차순 보장)\n for (const item of taskResults) {\n if (!item) continue\n for (const b of item.pageBlocks) blocks.push(b)\n }\n\n return blocks\n}\n\n/**\n * 배치 OCR 처리 — BatchOcrProvider를 사용하여 N페이지씩 묶어 처리.\n *\n * concurrency > 1이면 여러 배치를 동시에 실행하여 속도 향상.\n * 예: 5페이지/배치 × 4 동시 = 20페이지 동시 처리.\n */\nasync function ocrPagesBatch(\n doc: { numPages: number; getPage(n: number): Promise<PdfPageProxy> },\n provider: BatchOcrProvider,\n pageFilter: Set<number> | null,\n effectivePageCount: number,\n warnings?: ParseWarning[],\n concurrency: number = 1,\n onProgress?: (current: number, total: number) => void\n): Promise<IRBlock[]> {\n // 1. 대상 페이지 번호 수집\n const pageNumbers: number[] = []\n for (let i = 1; i <= effectivePageCount; i++) {\n if (pageFilter && !pageFilter.has(i)) continue\n pageNumbers.push(i)\n }\n\n // 2. 페이지 번호를 batchSize 단위로 분할\n const pageBatches: number[][] = []\n for (let i = 0; i < pageNumbers.length; i += provider.batchSize) {\n pageBatches.push(pageNumbers.slice(i, i + provider.batchSize))\n }\n\n // 3. 배치 태스크 생성 — 각 배치 내에서 렌더링→처리→해제\n let processed = 0\n type BatchResult = { batchIdx: number; pageBlocks: Array<{pageNum: number; blocks: IRBlock[]}> }\n\n const batchTasks = pageBatches.map((batchPageNums, batchIdx) => async (): Promise<BatchResult> => {\n const pageBlocks: Array<{pageNum: number; blocks: IRBlock[]}> = []\n\n // 렌더링은 try 바깥에서 수행 — 배치 실패 시 단일 재시도에 재사용\n const batchImages: Array<{image: Uint8Array, pageNum: number}> = []\n try {\n for (const pageNum of batchPageNums) {\n const page = await doc.getPage(pageNum)\n const image = await renderPageToPng(page)\n batchImages.push({ image, pageNum })\n }\n } catch (renderErr) {\n // 렌더링 자체 실패 → 해당 페이지 이후 빈 결과\n const rendered = new Set(batchImages.map(b => b.pageNum))\n for (const pageNum of batchPageNums) {\n if (!rendered.has(pageNum)) pageBlocks.push({ pageNum, blocks: [] })\n }\n }\n\n if (batchImages.length > 0) {\n try {\n // provider.processBatch() 호출\n const results = await provider.processBatch(batchImages)\n for (const { pageNum } of batchImages) {\n const result = results.get(pageNum)\n pageBlocks.push({\n pageNum,\n blocks: result ? ocrResultToBlocks(result, pageNum) : [],\n })\n }\n } catch (err) {\n const range = `${batchPageNums[0]}-${batchPageNums[batchPageNums.length - 1]}`\n warnings?.push({\n message: `배치 OCR 실패 (페이지 ${range}): ${err instanceof Error ? err.message : \"알 수 없는 오류\"} — 단일 페이지로 재시도`,\n code: \"OCR_PAGE_FAILED\",\n })\n // 배치 실패 시 단일 페이지씩 재시도 (같은 엔진)\n for (const { image, pageNum } of batchImages) {\n try {\n const singleResult = await provider.processBatch([{ image, pageNum }])\n const r = singleResult.get(pageNum)\n pageBlocks.push({ pageNum, blocks: r ? ocrResultToBlocks(r, pageNum) : [] })\n } catch {\n pageBlocks.push({ pageNum, blocks: [] })\n }\n }\n }\n }\n // 진행률 갱신 (병렬 실행 중 atomic하지 않지만 표시용으로 충분)\n processed += batchPageNums.length\n onProgress?.(processed, pageNumbers.length)\n return { batchIdx, pageBlocks }\n })\n\n // 5. 병렬 실행 — concurrency개 배치를 동시 처리\n const effectiveConcurrency = Math.max(1, concurrency)\n const batchResults = await runWithConcurrency(batchTasks, effectiveConcurrency)\n\n // 6. 배치 순서대로 블록 합산 (페이지 순서 보존)\n const blocks: IRBlock[] = []\n for (const result of batchResults) {\n for (const { blocks: pageBlks } of result.pageBlocks) {\n for (const b of pageBlks) blocks.push(b)\n }\n }\n\n return blocks\n}\n\ninterface PdfPageProxy {\n getViewport(params: { scale: number }): { width: number; height: number }\n render(params: { canvasContext: unknown; viewport: unknown }): { promise: Promise<void> }\n}\n\n/**\n * PDF 페이지를 PNG로 렌더링.\n * @napi-rs/canvas 사용 (kordoc 번들 의존성, 별도 설치 불필요)\n */\nasync function renderPageToPng(page: PdfPageProxy): Promise<Uint8Array> {\n const { createCanvas } = await import(\"@napi-rs/canvas\")\n\n const scale = 2.0 // 300 DPI 근사\n const viewport = page.getViewport({ scale })\n const canvas = createCanvas(Math.floor(viewport.width), Math.floor(viewport.height))\n const ctx = canvas.getContext(\"2d\")\n\n await page.render({ canvasContext: ctx as unknown, viewport }).promise\n return new Uint8Array(canvas.toBuffer(\"image/png\"))\n}\n"],"mappings":"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","names":[]}
@@ -8,7 +8,7 @@ import {
8
8
  sanitizeError,
9
9
  sanitizeHref,
10
10
  toArrayBuffer
11
- } from "./chunk-KEDUF24M.js";
11
+ } from "./chunk-A2FNPGBS.js";
12
12
  import "./chunk-ZWE3DS7E.js";
13
13
  export {
14
14
  KordocError,
@@ -20,4 +20,4 @@ export {
20
20
  sanitizeHref,
21
21
  toArrayBuffer
22
22
  };
23
- //# sourceMappingURL=utils-BB2CDSTB.js.map
23
+ //# sourceMappingURL=utils-RQ4S2RVN.js.map
@@ -2,11 +2,11 @@
2
2
  import {
3
3
  detectFormat,
4
4
  parse
5
- } from "./chunk-5AXJRBBK.js";
5
+ } from "./chunk-L2CLLZ4S.js";
6
6
  import "./chunk-4PP34NVQ.js";
7
7
  import {
8
8
  toArrayBuffer
9
- } from "./chunk-KEDUF24M.js";
9
+ } from "./chunk-A2FNPGBS.js";
10
10
  import "./chunk-MOL7MDBG.js";
11
11
  import "./chunk-7FMKAV4P.js";
12
12
  import "./chunk-JOGAFNIL.js";
@@ -129,4 +129,4 @@ async function sendWebhook(url, payload) {
129
129
  export {
130
130
  watchDirectory
131
131
  };
132
- //# sourceMappingURL=watch-6QVK32X7.js.map
132
+ //# sourceMappingURL=watch-3EIG5EVL.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clazic/kordoc",
3
- "version": "2.4.4",
3
+ "version": "2.4.6",
4
4
  "description": "Parse Korean documents (HWP, HWPX, PDF, XLSX, DOCX) to Markdown",
5
5
  "type": "module",
6
6
  "exports": {