📄 PDF 본문 검색 및 미리보기 완성

🔍 PDF/HTML 본문 검색 개선:
- PDF OCR 데이터 전체 텍스트 검색 (BeautifulSoup + PyPDF2)
- 서적 HTML 파일 본문 검색 지원
- 파일 타입 구분 (PDF/HTML/PDF직접추출)
- 검색어 매치 횟수 기반 관련성 점수
- 절대/상대 경로 처리 개선

📱 PDF 미리보기 기능:
- 검색 결과에서 PDF 직접 미리보기 (iframe)
- PDF에서 검색 버튼으로 페이지 이동
- 검색어 위치 기반 뷰어 연동
- PDF 로드 실패 시 fallback UI

🎯 백엔드 API 추가:
- GET /documents/{id}/pdf: PDF 파일 직접 제공
- GET /documents/{id}/search-in-content: 문서 내 검색
- 페이지별 검색 결과 및 컨텍스트 제공
- 권한 확인 및 에러 처리

🎨 프론트엔드 UX:
- PDF/HTML 타입별 배지 표시
- 검색 통계에 본문 검색 결과 포함
- 미리보기 모달에서 PDF 뷰어 통합
- 검색어 하이라이트 및 컨텍스트 표시
This commit is contained in:
Hyungi Ahn
2025-09-02 17:09:32 +09:00
parent 0afe6dcf65
commit 4b65d45584
4 changed files with 332 additions and 21 deletions

View File

@@ -24,6 +24,7 @@ window.searchApp = function() {
showPreviewModal: false,
previewResult: null,
previewLoading: false,
pdfError: false,
// 인증 상태
isAuthenticated: false,
@@ -281,6 +282,39 @@ window.searchApp = function() {
this.showPreviewModal = false;
this.previewResult = null;
this.previewLoading = false;
this.pdfError = false;
},
// PDF에서 검색
async searchInPdf() {
if (!this.previewResult || !this.searchQuery) return;
try {
const searchResults = await this.api.get(
`/documents/${this.previewResult.document_id}/search-in-content?q=${encodeURIComponent(this.searchQuery)}`
);
if (searchResults.total_matches > 0) {
// 첫 번째 매치로 이동하여 뷰어에서 열기
const firstMatch = searchResults.matches[0];
let url = `/viewer.html?id=${this.previewResult.document_id}`;
if (firstMatch.page > 1) {
url += `&page=${firstMatch.page}`;
}
// 검색어 하이라이트를 위한 파라미터 추가
url += `&search=${encodeURIComponent(this.searchQuery)}`;
window.open(url, '_blank');
this.closePreview();
} else {
alert('PDF에서 검색 결과를 찾을 수 없습니다.');
}
} catch (error) {
console.error('PDF 검색 실패:', error);
alert('PDF 검색 중 오류가 발생했습니다.');
}
},
// 검색 결과 열기