From d4af641e8b7a144b2c61e7b9d68e7918bd46cc1e Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 24 Oct 2025 10:48:51 +0000 Subject: (임수민) 데이터룸 관련 요청사항 반영 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/file-manager/FileManager.tsx | 1 + components/file-manager/SecurePDFViewer.tsx | 101 ++++++++++++++------------- components/file-manager/creaetWaterMarks.tsx | 4 +- components/layout/Footer.tsx | 6 +- components/layout/Header.tsx | 10 +-- components/layout/HeaderDataroom.tsx | 7 +- 6 files changed, 73 insertions(+), 56 deletions(-) (limited to 'components') diff --git a/components/file-manager/FileManager.tsx b/components/file-manager/FileManager.tsx index 7c5a3771..a95d8c06 100644 --- a/components/file-manager/FileManager.tsx +++ b/components/file-manager/FileManager.tsx @@ -1962,6 +1962,7 @@ export function FileManager({ projectId }: FileManagerProps) { { setViewerDialogOpen(false); setViewerFileUrl(null); diff --git a/components/file-manager/SecurePDFViewer.tsx b/components/file-manager/SecurePDFViewer.tsx index bd28214b..a24e2e37 100644 --- a/components/file-manager/SecurePDFViewer.tsx +++ b/components/file-manager/SecurePDFViewer.tsx @@ -10,10 +10,11 @@ import { createCustomWatermark } from './creaetWaterMarks'; interface SecurePDFViewerProps { documentUrl: string; fileName: string; + category?: string; onClose?: () => void; } -export function SecurePDFViewer({ documentUrl, fileName, onClose }: SecurePDFViewerProps) { +export function SecurePDFViewer({ documentUrl, fileName, category, onClose }: SecurePDFViewerProps) { const viewerRef = useRef(null); const instanceRef = useRef(null); const initialized = useRef(false); @@ -91,6 +92,10 @@ export function SecurePDFViewer({ documentUrl, fileName, onClose }: SecurePDFVie 'toggleNotesButton' ]); + const { Core } = instance; + Core.Tools.Tool.disableAutoSwitch(); + Core.Tools.Tool.disableTextSelection(); + // CSS 적용으로 추가 보안 const iframeWindow = instance.UI.iframeWindow; if (iframeWindow && iframeWindow.document) { @@ -187,55 +192,57 @@ export function SecurePDFViewer({ documentUrl, fileName, onClose }: SecurePDFVie const { documentViewer, annotationManager } = instance.Core; - // 문서 로드 완료 이벤트 - documentViewer.addEventListener('documentLoaded', async () => { - setIsLoading(false); - - // 워터마크 추가 - const watermarkText = `SHI DATAROOM\n${session?.user?.email || 'CONFIDENTIAL'}\n${new Date().toLocaleString()}`; - - // 대각선 워터마크 - documentViewer.setWatermark({ - custom: createCustomWatermark({ - text: watermarkText, - fontSize: 14, - fontFamily: 'Arial', - color: 'rgba(128, 128, 128, 0.3)', // 연한 회색 - opacity: 30, // 15% 투명도 - rotation: -45, - }) - }); + if (category !== 'public') { + // 문서 로드 완료 이벤트 + documentViewer.addEventListener('documentLoaded', async () => { + setIsLoading(false); + + // 워터마크 추가 + const watermarkText = `SHI DATAROOM\n${session?.user?.email || 'CONFIDENTIAL'}\n${new Date().toLocaleString()}`; + + // 대각선 워터마크 + documentViewer.setWatermark({ + custom: createCustomWatermark({ + text: watermarkText, + fontSize: 14, + fontFamily: 'Arial', + color: 'rgba(128, 128, 128, 0.5)', // 연한 회색 + opacity: 30, // 15% 투명도 + rotation: -45, + }) + }); - // 각 페이지에 커스텀 워터마크 추가 - const pageCount = documentViewer.getPageCount(); - for (let i = 1; i <= pageCount; i++) { - const pageInfo = documentViewer.getDocument().getPageInfo(i); - const { width, height } = pageInfo; - - // FreeTextAnnotation 생성 - const watermarkAnnot = new instance.Core.Annotations.FreeTextAnnotation(); - watermarkAnnot.PageNumber = i; - watermarkAnnot.X = width / 4; - watermarkAnnot.Y = height / 2; - watermarkAnnot.Width = width / 2; - watermarkAnnot.Height = 100; - watermarkAnnot.setContents( - `${session?.user?.email}\n${docFileName}\n${new Date().toLocaleDateString()}` - ); - watermarkAnnot.FillColor = new instance.Core.Annotations.Color(255, 0, 0, 0.3); - watermarkAnnot.TextColor = new instance.Core.Annotations.Color(255, 0, 0, 0.4); - watermarkAnnot.FontSize = '24pt'; - watermarkAnnot.TextAlign = 'center'; - watermarkAnnot.Rotation = -45; - watermarkAnnot.ReadOnly = true; - watermarkAnnot.Locked = true; - watermarkAnnot.Printable = true; - - annotationManager.addAnnotation(watermarkAnnot); + // 각 페이지에 커스텀 워터마크 추가 + const pageCount = documentViewer.getPageCount(); + for (let i = 1; i <= pageCount; i++) { + const pageInfo = documentViewer.getDocument().getPageInfo(i); + const { width, height } = pageInfo; + + // FreeTextAnnotation 생성 + const watermarkAnnot = new instance.Core.Annotations.FreeTextAnnotation(); + watermarkAnnot.PageNumber = i; + watermarkAnnot.X = width / 4; + watermarkAnnot.Y = height / 2; + watermarkAnnot.Width = width / 2; + watermarkAnnot.Height = 100; + watermarkAnnot.setContents( + `${session?.user?.email}\n${docFileName}\n${new Date().toLocaleDateString()}` + ); + watermarkAnnot.FillColor = new instance.Core.Annotations.Color(255, 0, 0, 0.3); + watermarkAnnot.TextColor = new instance.Core.Annotations.Color(255, 0, 0, 0.4); + watermarkAnnot.FontSize = '24pt'; + watermarkAnnot.TextAlign = 'center'; + watermarkAnnot.Rotation = -45; + watermarkAnnot.ReadOnly = true; + watermarkAnnot.Locked = true; + watermarkAnnot.Printable = true; + + annotationManager.addAnnotation(watermarkAnnot); + } + + annotationManager.drawAnnotations(documentViewer.getCurrentPage()); } - annotationManager.drawAnnotations(documentViewer.getCurrentPage()); - // Pan 모드로 설정 (텍스트 선택 불가) documentViewer.setToolMode(documentViewer.getTool('Pan')); diff --git a/components/file-manager/creaetWaterMarks.tsx b/components/file-manager/creaetWaterMarks.tsx index ebf4322e..642e5e2a 100644 --- a/components/file-manager/creaetWaterMarks.tsx +++ b/components/file-manager/creaetWaterMarks.tsx @@ -1,7 +1,7 @@ export const createCustomWatermark: CreateCustomWatermark = ({ text, fontSize = 14, - color = "rgba(128, 128, 128, 0.3)", // 더 연한 회색, 더 투명하게 + color = "rgba(128, 128, 128, 0.5)", // 더 연한 회색, 더 투명하게 opacity = 30, // 더 낮은 opacity rotation = -45, fontFamily = "Arial", @@ -30,7 +30,7 @@ export const createCustomWatermark: CreateCustomWatermark = ({ const textBlockHeight = lines.length * lineHeight; // 격자 간격 계산 (텍스트 블록 크기 기반) - const horizontalSpacing = maxLineWidth * 0.8; // 가로 간격 + const horizontalSpacing = maxLineWidth * 1.2; // 가로 간격 const verticalSpacing = textBlockHeight * 1.5; // 세로 간격 // 회전을 고려한 대각선 길이 계산 diff --git a/components/layout/Footer.tsx b/components/layout/Footer.tsx index bf533ae8..33278d7e 100644 --- a/components/layout/Footer.tsx +++ b/components/layout/Footer.tsx @@ -11,11 +11,15 @@ export function SiteFooter() {