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"""
""",
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"""
""",
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('', 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"""
"""
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}")