diff options
Diffstat (limited to 'lib/basic-contract/viewer')
| -rw-r--r-- | lib/basic-contract/viewer/basic-contract-sign-viewer.tsx | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx index 5698428e..77bfaf41 100644 --- a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx +++ b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx @@ -25,6 +25,7 @@ import { getActiveSurveyTemplate, getVendorSignatureFile, type SurveyTemplateWit import { useConditionalSurvey } from '../vendor-table/survey-conditional'; import { SurveyComponent } from './SurveyComponent'; import { GtcClausesComponent } from './GtcClausesComponent'; +import { getBuyerSignatureFileWithFallback } from "@/lib/shi-signature/buyer-signature"; interface FileInfo { path: string; @@ -256,6 +257,63 @@ class AutoSignatureFieldDetector { } } +const applyBuyerSignatureAutomatically = async (instance: WebViewerInstance) => { + const { Core } = instance; + const { documentViewer, annotationManager } = Core; + const document = documentViewer.getDocument(); + + if (!document) return; + + try { + console.log('π ꡬ맀μ μλͺ
λ μλ μλͺ
μμ...'); + + // "μΌμ±μ€κ³΅μ
_μλͺ
λ" ν
μ€νΈ κ²μ + const searchText = 'μΌμ±μ€κ³΅μ
_μλͺ
λ'; + const textSearchIterator = await document.getTextSearchIterator(); + textSearchIterator.begin(searchText, Core.Search.Mode.PAGE_STOP | Core.Search.Mode.HIGHLIGHT); + + let searchResult = await textSearchIterator.next(); + + if (searchResult && searchResult.resultCode === Core.Search.ResultCode.FOUND) { + const pageNumber = searchResult.pageNum; + const quads = searchResult.quads; + + if (quads && quads.length > 0) { + const quad = quads[0]; + const x = Math.min(quad.x1, quad.x2, quad.x3, quad.x4); + const y = Math.min(quad.y1, quad.y2, quad.y3, quad.y4); + const textHeight = Math.abs(quad.y3 - quad.y1); + + // ꡬ맀μ μλͺ
μ΄λ―Έμ§ κ°μ Έμ€κΈ° + const buyerSignature = await getBuyerSignatureFileWithFallback(); + + if (buyerSignature) { + // μ€ν¬ν μ΄λ
Έν
μ΄μ
μμ± + const stamp = new Core.Annotations.StampAnnotation(); + stamp.PageNumber = pageNumber; + stamp.X = x; + stamp.Y = y + textHeight + 5; // ν
μ€νΈ μλ 5ν½μ
+ stamp.Width = 150; + stamp.Height = 50; + + await stamp.setImageData(buyerSignature.data.dataUrl); + + // μ΄λ
Έν
μ΄μ
μΆκ° + annotationManager.addAnnotation(stamp); + annotationManager.drawAnnotationsFromList([stamp]); + + console.log('β
ꡬ맀μ μλͺ
μλ μ μ© μλ£'); + toast.info('μΌμ±μ€κ³΅μ
μλͺ
μ΄ μλμΌλ‘ μ μ©λμμ΅λλ€.', { + duration: 3000 + }); + } + } + } + } catch (error) { + console.error('ꡬ맀μ μλ μλͺ
μ²λ¦¬ μ€ν¨:', error); + } +}; + function useAutoSignatureFields(instance: WebViewerInstance | null, mode: 'vendor' | 'buyer' = 'vendor') { const [signatureFields, setSignatureFields] = useState<string[]>([]); @@ -790,10 +848,20 @@ export function BasicContractSignViewer({ const { WidgetFlags } = Annotations; const FitMode = newInstance.UI.FitMode; - const handleDocumentLoaded = () => { + const handleDocumentLoaded = async () => { setFileLoading(false); newInstance.UI.setFitMode(FitMode.FitWidth); - + + // GTC ν
νλ¦Ώμ΄ μλ κ²½μ°μλ§ κ΅¬λ§€μ μλ μλͺ
μ μ© + if (!templateName.includes('GTC')) { + try { + // ꡬ맀μ μλͺ
λ μ°Ύμμ μλ μλͺ
+ await applyBuyerSignatureAutomatically(newInstance); + } catch (error) { + console.error('ꡬ맀μ μλ μλͺ
μ€ν¨:', error); + } + } + requestAnimationFrame(() => { try { documentViewer.refreshAll(); |
