From d4b10b16b1770340e202c8b336964544c8dca4f8 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Tue, 2 Sep 2025 17:22:35 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20PDF=20404=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0=20=EB=B0=8F=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ› ๏ธ PDF 404 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: - PDF ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ HEAD ์š”์ฒญ์œผ๋กœ ๋จผ์ € ํ™•์ธ - ํŒŒ์ผ์ด ์กด์žฌํ•  ๋•Œ๋งŒ iframe src ์„ค์ • - ํ† ํฐ์„ URL ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ (_token) - ๋ฐฑ์—”๋“œ PDF API์—์„œ _token ํŒŒ๋ผ๋ฏธํ„ฐ ์ง€์› ๐Ÿ“ฑ PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋กœ๋”ฉ ๊ฐœ์„ : - pdfLoading, pdfLoaded, pdfSrc ์ƒํƒœ ์ถ”๊ฐ€ - ๋กœ๋”ฉ ์ค‘ ์Šคํ”ผ๋„ˆ ํ‘œ์‹œ - iframe ๋กœ๋“œ ์™„๋ฃŒ/์—๋Ÿฌ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ - handlePdfError() ํ•จ์ˆ˜๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐœ์„  ๐ŸŽฏ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ : - PDF ๋กœ๋”ฉ ์ƒํƒœ ๋ช…ํ™•ํ•œ ํ‘œ์‹œ - ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ ์ ˆํ•œ ๋ฉ”์‹œ์ง€ - ๋ถˆํ•„์š”ํ•œ 404 ์š”์ฒญ ๋ฐฉ์ง€ - ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ ๊ฐœ์„  ๐Ÿ” ๋””๋ฒ„๊น… ๊ฐœ์„ : - PDF ๋กœ๋“œ ๊ณผ์ • ์ƒ์„ธ ๋กœ๊น… - ์—๋Ÿฌ ์›์ธ ๋ช…ํ™•ํ•œ ํ‘œ์‹œ - ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ์‚ฌ์ „ ํ™•์ธ --- backend/src/api/routes/documents.py | 2 +- frontend/search.html | 15 +++++++-- frontend/static/js/search.js | 50 +++++++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/backend/src/api/routes/documents.py b/backend/src/api/routes/documents.py index 651ea75..0104844 100644 --- a/backend/src/api/routes/documents.py +++ b/backend/src/api/routes/documents.py @@ -511,7 +511,7 @@ async def get_document_content( @router.get("/{document_id}/pdf") async def get_document_pdf( document_id: str, - token: Optional[str] = Query(None), + _token: Optional[str] = Query(None), current_user: User = Depends(get_current_active_user), db: AsyncSession = Depends(get_db) ): diff --git a/frontend/search.html b/frontend/search.html index c5d2711..3518d38 100644 --- a/frontend/search.html +++ b/frontend/search.html @@ -483,12 +483,21 @@
- + +
+
+ +

PDF๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ค‘...

+
+
+
diff --git a/frontend/static/js/search.js b/frontend/static/js/search.js index 7e2267d..faee19c 100644 --- a/frontend/static/js/search.js +++ b/frontend/static/js/search.js @@ -25,6 +25,9 @@ window.searchApp = function() { previewResult: null, previewLoading: false, pdfError: false, + pdfLoading: false, + pdfLoaded: false, + pdfSrc: '', // HTML ๋ทฐ์–ด ์ƒํƒœ htmlLoading: false, @@ -215,8 +218,8 @@ window.searchApp = function() { // PDF๊ฐ€ ์žˆ์œผ๋ฉด PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์—†์œผ๋ฉด HTML ๋ฏธ๋ฆฌ๋ณด๊ธฐ if (docInfo.pdf_path) { - // PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” iframe์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌ - console.log('PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ค€๋น„ ์™„๋ฃŒ'); + // PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ค€๋น„ + await this.loadPdfPreview(result.document_id); } else if (docInfo.html_path) { // HTML ๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ await this.loadHtmlPreview(result.document_id); @@ -318,12 +321,55 @@ window.searchApp = function() { this.previewLoading = false; this.pdfError = false; + // PDF ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ + this.pdfLoading = false; + this.pdfLoaded = false; + this.pdfSrc = ''; + // HTML ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ this.htmlLoading = false; this.htmlRawMode = false; this.htmlSourceCode = ''; }, + // PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋กœ๋“œ + async loadPdfPreview(documentId) { + this.pdfLoading = true; + this.pdfError = false; + this.pdfLoaded = false; + + try { + // PDF ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ๋จผ์ € ํ™•์ธ + const response = await fetch(`/api/documents/${documentId}/pdf`, { + method: 'HEAD', + headers: { + 'Authorization': `Bearer ${localStorage.getItem('token')}` + } + }); + + if (response.ok) { + // PDF ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉด src ์„ค์ • + const token = localStorage.getItem('token'); + this.pdfSrc = `/api/documents/${documentId}/pdf?_token=${encodeURIComponent(token)}`; + console.log('PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ค€๋น„ ์™„๋ฃŒ:', this.pdfSrc); + } else { + throw new Error(`PDF ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (${response.status})`); + } + } catch (error) { + console.error('PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋กœ๋“œ ์‹คํŒจ:', error); + this.pdfError = true; + } finally { + this.pdfLoading = false; + } + }, + + // PDF ์—๋Ÿฌ ์ฒ˜๋ฆฌ + handlePdfError() { + console.error('PDF iframe ๋กœ๋“œ ์˜ค๋ฅ˜'); + this.pdfError = true; + this.pdfLoading = false; + }, + // HTML ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋กœ๋“œ async loadHtmlPreview(documentId) { this.htmlLoading = true;