import io import base64 import logging import requests from PIL import Image import streamlit as st from typing import Dict, Any from log_utils import setup_logging logger = setup_logging('pdf_details_page') def api_request(url: str, params: Dict[str, Any] = None) -> Dict[str, Any]: """ Make API request with logging and error handling. """ try: logger.info(f"Making API request to: {url}") response = requests.get(url, params=params) response.raise_for_status() logger.debug(f"API response received successfully from: {url}") return response.json() except requests.RequestException as e: logger.error(f"API request failed: {str(e)}", exc_info=True) raise def display_romanized_text_page(filename): """ Displays romanized text and PDF details in a Streamlit layout styled to match the given design. """ logger.info(f"Displaying romanized text page for file: {filename}") try: st.markdown( """ """, unsafe_allow_html=True ) logger.debug("Applied CSS styling") # API Endpoint for Romanized Text api_url = f"http://127.0.0.1:8000/romanized-text?filename={filename}" try: # Fetch data from API response = requests.get(api_url) response.raise_for_status() data = response.json() # Page Title st.markdown("

📚 Smart PDF Search

", unsafe_allow_html=True) logger.debug("Rendered page title") # Document Info Section word_count = len(data['full_text'].split()) logger.info(f"Displaying document info - Pages: {data['total_pages']}, Size: {data['file_size_kb']}KB, Words: {word_count}") # Document Info Section st.markdown( f"""
Filename: {data['filename']}
Total Pages: {data['total_pages']}
File Size: {data['file_size_kb']}
Total Words: {len(data['full_text'].split())}
""", unsafe_allow_html=True ) # Display Each Page's Text logger.info(f"Rendering {len(data['pages'])} pages of text") for page in data['pages']: st.markdown( f"""
{page['text']}

""", unsafe_allow_html=True ) logger.debug("Completed rendering all pages") except requests.RequestException as e: logger.error(f"API request failed: {str(e)}", exc_info=True) st.error(f"Error fetching data: {e}") except KeyError as e: logger.error(f"Missing key in API response: {str(e)}", exc_info=True) st.error(f"Missing key in API response: {e}") except Exception as e: logger.error(f"Unexpected error in display_romanized_text_page: {str(e)}", exc_info=True) st.error(f"An unexpected error occurred: {e}") def display_pdf_details(filename, page_number): """ Display detailed information about a specific PDF page. """ logger.info(f"Displaying PDF details for file: {filename}, page: {page_number}") # Initialize reader mode state if 'reader_mode' not in st.session_state: st.session_state.reader_mode = False logger.debug("Initialized reader mode state") def toggle_reader_mode(): """Toggle reader mode state with logging.""" previous_state = st.session_state.reader_mode st.session_state.reader_mode = not previous_state logger.info(f"Reader mode toggled from {previous_state} to {st.session_state.reader_mode}") try: api_url = f"http://127.0.0.1:8000/pdf-details?filename={filename}&page_number={page_number}" response = requests.get(api_url) logger.debug(f"Retrieved PDF details for page {page_number}") if response.status_code == 200: pdf_details = response.json() # Enhanced CSS for better styling st.markdown(""" """, unsafe_allow_html=True) logger.debug("Applied CSS styling") # Reader mode display (if active) if st.session_state.reader_mode: logger.info("Displaying reader mode view") st.markdown('
', unsafe_allow_html=True) if st.button("❌ Close Reader Mode", key="close_reader", help="Exit reader mode"): logger.info("Reader mode closed") st.session_state.reader_mode = False st.rerun() # Display zoomed image page_image_bytes = base64.b64decode(pdf_details['page_image']) page_image = Image.open(io.BytesIO(page_image_bytes)) st.image(page_image, use_container_width=True, caption=f"Page {pdf_details['current_page']}") st.markdown('
', unsafe_allow_html=True) return # Exit early as we don't need to show the regular interface in reader mode logger.info("Displaying regular interface") # Header st.markdown('

📚 Smart PDF Search

', unsafe_allow_html=True) # Main content col1, col2 = st.columns([1.5, 2]) with col1: logger.debug("Rendering details section") st.markdown("

🖼️ Page Preview

", unsafe_allow_html=True) st.markdown(f"
Page {page_number + 1} of {pdf_details['total_pages']}
", unsafe_allow_html=True) page_image_bytes = base64.b64decode(pdf_details['page_image']) page_image = Image.open(io.BytesIO(page_image_bytes)) st.image(page_image, caption=f"Page {pdf_details['current_page']}", use_container_width=True) st.markdown("", unsafe_allow_html=True) with col2: st.markdown("
", unsafe_allow_html=True) # Create 3 equal-width columns col1, col2, col3 = st.columns(3) # Action buttons inside the columns with col1: logger.info("Reader mode button clicked") st.button("📖 Reader Mode", on_click=toggle_reader_mode) with col2: if st.button("🔍 Ask a Question"): logger.info("Ask a Question button clicked") st.query_params["page"] = "home" # Use the new API instead st.rerun() with col3: logger.debug("Rendering Romanized Text link") st.markdown(f""" 📄 Romanized Text """, unsafe_allow_html=True) # Page content in expander with st.expander("📄 Page Content", expanded=True): logger.debug("Displaying page content in expander") st.markdown(pdf_details['page_text'], unsafe_allow_html=True) logger.debug("Rendering metadata table") # Content tabs metadata_html = f"""
PDF Name{pdf_details.get('title', filename)}
Page{page_number + 1}
Author{pdf_details.get('metadata', {}).get('author', 'N/A')}
Total Pages{pdf_details['total_pages']}
Language{pdf_details['language']}
File Size{pdf_details['file_size_kb']} KB
""" st.markdown(metadata_html, unsafe_allow_html=True) logger.info(f"Completed rendering PDF details page for {filename}") else: st.error(f"Error fetching PDF details: {response.text}") except Exception as e: logger.error(f"Error in display_pdf_details: {str(e)}", exc_info=True) st.error(f"An error occurred: {e}")