diff options
| -rw-r--r-- | lib/basic-contract/viewer/basic-contract-sign-viewer.tsx | 202 |
1 files changed, 116 insertions, 86 deletions
diff --git a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx index d1492fdb..eeebae4e 100644 --- a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx +++ b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx @@ -114,12 +114,12 @@ class AutoSignatureFieldDetector { console.log(`π "${searchText}" ν
μ€νΈ κ²μ μ€...`); - // ν
μ€νΈ κ²μ λ° μλͺ
νλ μμ± - const fieldName = await this.createSignatureFieldAtText(searchText); + // ν
μ€νΈ κ²μ λ° μλͺ
νλ μμ± (λͺ¨λ λ§€μΉ μ°ΎκΈ°) + const fieldNames = await this.createSignatureFieldAtText(searchText); - if (fieldName) { - console.log(`β
ν
μ€νΈ μμΉμ μλͺ
νλ μμ± μλ£: ${searchText}`); - return [fieldName]; + if (fieldNames.length > 0) { + console.log(`β
${fieldNames.length}κ°μ "${searchText}" μμΉμ μλͺ
νλ μμ± μλ£`); + return fieldNames; } else { // ν
μ€νΈλ₯Ό μ°Ύμ§ λͺ»ν κ²½μ° κΈ°λ³Έ μμΉμ μμ± console.log(`β οΈ "${searchText}" ν
μ€νΈλ₯Ό μ°Ύμ§ λͺ»ν΄ κΈ°λ³Έ μμΉμ μμ±`); @@ -140,74 +140,88 @@ class AutoSignatureFieldDetector { } } - private async createSignatureFieldAtText(searchText: string): Promise<string | null> { + private async createSignatureFieldAtText(searchText: string): Promise<string[]> { const { Core } = this.instance; const { documentViewer, annotationManager, Annotations } = Core; const doc = documentViewer.getDocument(); - if (!doc) return null; + if (!doc) return []; try { const pageCount = documentViewer.getPageCount(); + const fieldNames: string[] = []; + // λͺ¨λ νμ΄μ§μμ λͺ¨λ λ§€μΉ μ°ΎκΈ° for (let pageNumber = 1; pageNumber <= pageCount; pageNumber++) { // 1) νμ΄μ§ ν
μ€νΈ λ‘λ const pageText = await doc.loadPageText(pageNumber); + if (!pageText) continue; - // 2) ν΄λΉ νμ΄μ§μμ κ²μμ΄ μμΉ μ°ΎκΈ° (첫 λ§€μΉλ§ μ¬μ©) - const startIndex = pageText.indexOf(searchText); - if (startIndex === -1) continue; + // 2) ν΄λΉ νμ΄μ§μμ λͺ¨λ κ²μμ΄ μμΉ μ°ΎκΈ° + let searchIndex = 0; + while (true) { + const startIndex = pageText.indexOf(searchText, searchIndex); + if (startIndex === -1) break; // λ μ΄μ μ°Ύμ μ μμΌλ©΄ λ€μ νμ΄μ§λ‘ - const endIndex = startIndex + searchText.length; + const endIndex = startIndex + searchText.length; - // 3) κ²μμ΄μ λ¬Έμ λ¨μ Quads μ»κΈ° - const quads = await doc.getTextPosition(pageNumber, startIndex, endIndex); - if (!quads || quads.length === 0) continue; - - // 첫 κΈμμ quadλ§ μ¬μ©ν΄ λλ΅μ μΈ μμΉ μ°μΆ - const q = quads[0] as any; // PDFTronμ Quad νμ
- const x = Math.min(q.x1, q.x2, q.x3, q.x4); - const y = Math.min(q.y1, q.y2, q.y3, q.y4); - const textHeight = Math.abs(q.y3 - q.y1); - - // 4) μλͺ
νλ μμ± - const fieldName = `signature_at_text_${Date.now()}`; - const signatureY = y + textHeight + 5; - - // μμΉ μ 보 μ μ₯ - this.location = { - pageNumber, - x, - y: signatureY, - fieldName, - searchText - }; - - const flags = new Annotations.WidgetFlags(); - flags.set('Required', true); - - const field = new Core.Annotations.Forms.Field(fieldName, { type: 'Sig', flags }); - const widget = new Annotations.SignatureWidgetAnnotation(field, { Width: 150, Height: 50 }); - - widget.setPageNumber(pageNumber); - // ν
μ€νΈ λ°λ‘ μλμ λ°°μΉ (νμνλ©΄ μ€λ₯Έμͺ½ λ°°μΉλ‘ λ°κΏ μ μμ) - widget.setX(x); - widget.setY(signatureY); - widget.setWidth(150); - widget.setHeight(50); + // 3) κ²μμ΄μ λ¬Έμ λ¨μ Quads μ»κΈ° + const quads = await doc.getTextPosition(pageNumber, startIndex, endIndex); + if (!quads || quads.length === 0) { + searchIndex = startIndex + 1; + continue; + } - const fm = annotationManager.getFieldManager(); - fm.addField(field); - annotationManager.addAnnotation(widget); - annotationManager.drawAnnotationsFromList([widget]); + // 첫 κΈμμ quadλ§ μ¬μ©ν΄ λλ΅μ μΈ μμΉ μ°μΆ + const q = quads[0] as any; // PDFTronμ Quad νμ
+ const x = Math.min(q.x1, q.x2, q.x3, q.x4); + const y = Math.min(q.y1, q.y2, q.y3, q.y4); + const textHeight = Math.abs(q.y3 - q.y1); - return fieldName; + // 4) μλͺ
νλ μμ± + const fieldName = `signature_at_text_${Date.now()}_${fieldNames.length}`; + const signatureY = y + textHeight + 5; + + // 첫 λ²μ§Έ νλμ μμΉ μ λ³΄λ§ μ μ₯ (μλͺ
λμΌλ‘ μ΄λ κΈ°λ₯μ©) + if (fieldNames.length === 0) { + this.location = { + pageNumber, + x, + y: signatureY, + fieldName, + searchText + }; + } + + const flags = new Annotations.WidgetFlags(); + flags.set('Required', true); + + const field = new Core.Annotations.Forms.Field(fieldName, { type: 'Sig', flags }); + const widget = new Annotations.SignatureWidgetAnnotation(field, { Width: 150, Height: 50 }); + + widget.setPageNumber(pageNumber); + // ν
μ€νΈ λ°λ‘ μλμ λ°°μΉ + widget.setX(x); + widget.setY(signatureY); + widget.setWidth(150); + widget.setHeight(50); + + const fm = annotationManager.getFieldManager(); + fm.addField(field); + annotationManager.addAnnotation(widget); + annotationManager.drawAnnotationsFromList([widget]); + + fieldNames.push(fieldName); + console.log(`β
νμ΄μ§ ${pageNumber}μ "${searchText}" μμΉμ μλͺ
νλ μμ± (${fieldNames.length}λ²μ§Έ)`); + + // λ€μ κ²μμ μν΄ μΈλ±μ€ μ΄λ + searchIndex = startIndex + 1; + } } - // λͺ¨λ νμ΄μ§μμ λͺ» μ°ΎμΌλ©΄ null - return null; + return fieldNames; } catch (e) { console.error('ν
μ€νΈ κΈ°λ° μλͺ
νλ μμ± μ€ μ€λ₯', e); - return null; + return []; } } @@ -269,56 +283,72 @@ const applyBuyerSignatureAutomatically = async (instance: WebViewerInstance) => if (!doc) return; try { - console.log('π ꡬ맀μ μλ μλͺ
: "μΌμ±μ€κ³΅μ
_μλͺ
λ"λ§ κ²μ'); + console.log('π ꡬ맀μ μλ μλͺ
: "μΌμ±μ€κ³΅μ
_μλͺ
λ" μ 체 κ²μ'); const TARGET = 'μΌμ±μ€κ³΅μ
_μλͺ
λ'; // β
μ νν μ΄ λ¬Έμμ΄λ§ νμ© const pageCount = documentViewer.getPageCount(); + let signatureCount = 0; + const buyerSignature = await getBuyerSignatureFileWithFallback(); // κΈ°μ‘΄ νλ‘μ νΈ ν¨μ κ·Έλλ‘ μ¬μ© + if (!buyerSignature?.data?.dataUrl) { + console.warn('β οΈ κ΅¬λ§€μ μλͺ
μ΄λ―Έμ§κ° μμ΅λλ€.'); + return; + } + + // λͺ¨λ νμ΄μ§μμ λͺ¨λ "μΌμ±μ€κ³΅μ
_μλͺ
λ" μ°ΎκΈ° for (let pageNumber = 1; pageNumber <= pageCount; pageNumber++) { const pageText = await doc.loadPageText(pageNumber); if (!pageText) continue; - const startIndex = pageText.indexOf(TARGET); - if (startIndex === -1) continue; + // ν νμ΄μ§μμ μ¬λ¬ κ°μ λ§€μΉλ₯Ό μ°ΎκΈ° μν΄ λ°λ³΅ κ²μ + let searchIndex = 0; + while (true) { + const startIndex = pageText.indexOf(TARGET, searchIndex); + if (startIndex === -1) break; // λ μ΄μ μ°Ύμ μ μμΌλ©΄ λ€μ νμ΄μ§λ‘ - const endIndex = startIndex + TARGET.length; + const endIndex = startIndex + TARGET.length; - // λ¬Έμ μΏΌλ β λ°μ΄λ© λ°μ€ - const quads = await doc.getTextPosition(pageNumber, startIndex, endIndex); - if (!quads?.length) continue; + // λ¬Έμ μΏΌλ β λ°μ΄λ© λ°μ€ + const quads = await doc.getTextPosition(pageNumber, startIndex, endIndex); + if (!quads?.length) { + searchIndex = startIndex + 1; + continue; + } - const xs: number[] = [], ys: number[] = []; - quads.forEach(q => { xs.push(q.x1, q.x2, q.x3, q.x4); ys.push(q.y1, q.y2, q.y3, q.y4); }); - const minX = Math.min(...xs), maxY = Math.max(...ys); + const xs: number[] = [], ys: number[] = []; + quads.forEach((q: any) => { xs.push(q.x1, q.x2, q.x3, q.x4); ys.push(q.y1, q.y2, q.y3, q.y4); }); + const minX = Math.min(...xs), maxY = Math.max(...ys); - // ν
μ€νΈ λ°λ‘ μλμ μ€ν¬ν(μλͺ
μ΄λ―Έμ§) λ°°μΉ - const widgetX = minX; - const widgetY = maxY + 5; - const widgetW = 150; - const widgetH = 50; + // ν
μ€νΈ λ°λ‘ μλμ μ€ν¬ν(μλͺ
μ΄λ―Έμ§) λ°°μΉ + const widgetX = minX; + const widgetY = maxY + 5; + const widgetW = 150; + const widgetH = 50; - const buyerSignature = await getBuyerSignatureFileWithFallback(); // κΈ°μ‘΄ νλ‘μ νΈ ν¨μ κ·Έλλ‘ μ¬μ© - if (!buyerSignature?.data?.dataUrl) { - console.warn('β οΈ κ΅¬λ§€μ μλͺ
μ΄λ―Έμ§κ° μμ΅λλ€.'); - return; - } + const stamp = new Annotations.StampAnnotation(); + stamp.PageNumber = pageNumber; + stamp.X = widgetX; + stamp.Y = widgetY; + stamp.Width = widgetW; + stamp.Height = widgetH; + await stamp.setImageData(buyerSignature.data.dataUrl); - const stamp = new Annotations.StampAnnotation(); - stamp.PageNumber = pageNumber; - stamp.X = widgetX; - stamp.Y = widgetY; - stamp.Width = widgetW; - stamp.Height = widgetH; - await stamp.setImageData(buyerSignature.data.dataUrl); + annotationManager.addAnnotation(stamp); + annotationManager.drawAnnotationsFromList([stamp]); - annotationManager.addAnnotation(stamp); - annotationManager.drawAnnotationsFromList([stamp]); + signatureCount++; + console.log(`β
νμ΄μ§ ${pageNumber}μ "μΌμ±μ€κ³΅μ
_μλͺ
λ" μμΉμ μλ μλͺ
μ μ© μλ£ (${signatureCount}λ²μ§Έ)`); - console.log('β
"μΌμ±μ€κ³΅μ
_μλͺ
λ" μμΉμ μλ μλͺ
μ μ© μλ£'); - return; // 첫 λ§€μΉλ§ μ²λ¦¬ + // λ€μ κ²μμ μν΄ μΈλ±μ€ μ΄λ + searchIndex = startIndex + 1; + } } - console.warn('β οΈ λ¬Έμμμ "μΌμ±μ€κ³΅μ
_μλͺ
λ"μ μ°Ύμ§ λͺ»νμ΅λλ€.'); + if (signatureCount > 0) { + console.log(`β
μ΄ ${signatureCount}κ°μ "μΌμ±μ€κ³΅μ
_μλͺ
λ" μμΉμ μλ μλͺ
μ μ© μλ£`); + } else { + console.warn('β οΈ λ¬Έμμμ "μΌμ±μ€κ³΅μ
_μλͺ
λ"μ μ°Ύμ§ λͺ»νμ΅λλ€.'); + } } catch (error) { console.error('ꡬ맀μ μλ μλͺ
μ²λ¦¬ μ€ν¨:', error); } |
