# app.py
import streamlit as st
import base64
from annotations import analyze_pdf
def display_pdf_iframe(pdf_bytes):
"""Displays the PDF using an iframe tag."""
if pdf_bytes and len(pdf_bytes) > 0:
base64_pdf = base64.b64encode(pdf_bytes).decode('utf-8')
pdf_display = f"""
"""
st.components.v1.html(pdf_display, height=800, width=700, scrolling=True)
else:
st.info("No annotated PDF to display.")
def display_pdf_object(pdf_bytes):
"""Displays the PDF using an object tag."""
if pdf_bytes and len(pdf_bytes) > 0:
base64_pdf = base64.b64encode(pdf_bytes).decode('utf-8')
pdf_display = f"""
"""
st.components.v1.html(pdf_display, height=800, width=700, scrolling=True)
else:
st.info("No annotated PDF to display.")
def display_pdf_pdfjs(pdf_bytes):
"""Displays the PDF using PDF.js embedded in an iframe."""
if pdf_bytes and len(pdf_bytes) > 0:
base64_pdf = base64.b64encode(pdf_bytes).decode('utf-8')
pdfjs_viewer_url = f"https://mozilla.github.io/pdf.js/web/viewer.html?file=data:application/pdf;base64,{base64_pdf}"
pdf_display = f"""
"""
st.components.v1.html(pdf_display, height=800, width=700, scrolling=True)
else:
st.info("No annotated PDF to display.")
def display_pdf_new_tab(pdf_bytes):
"""Provides a link to view the PDF in a new browser tab."""
if pdf_bytes and len(pdf_bytes) > 0:
base64_pdf = base64.b64encode(pdf_bytes).decode('utf-8')
href = f"data:application/pdf;base64,{base64_pdf}"
pdf_display = f"""
🔍 View Annotated PDF
"""
st.markdown(pdf_display, unsafe_allow_html=True)
else:
st.info("No annotated PDF to display.")
def main():
st.set_page_config(
page_title="PDF Analyzer",
page_icon="📄",
layout="wide",
)
st.title("📄 PDF Analyzer")
st.markdown("""
Upload a PDF to analyze its language, highlight errors, and view detailed error reports.
""")
uploaded_file = st.file_uploader("Upload your PDF file", type=["pdf"])
if uploaded_file is not None:
with st.spinner("Analyzing PDF..."):
# Reset file pointer before reading
uploaded_file.seek(0)
language_results, annotated_pdf = analyze_pdf(uploaded_file)
if "error" in language_results:
st.error("An error occurred during analysis:")
st.code(language_results["error"])
else:
st.success("Analysis complete!")
# Debugging: Show the size of annotated_pdf
if annotated_pdf and len(annotated_pdf) > 0:
st.write(f"Annotated PDF size: {len(annotated_pdf)} bytes")
else:
st.write("Annotated PDF is empty.")
# Select embedding method
embedding_option = st.selectbox(
"Select PDF Display Method",
options=["Iframe", "Object Tag", "PDF.js", "Open in New Tab"],
index=0
)
st.subheader("📄 Annotated PDF")
if embedding_option == "Iframe":
display_pdf_iframe(annotated_pdf)
elif embedding_option == "Object Tag":
display_pdf_object(annotated_pdf)
elif embedding_option == "PDF.js":
display_pdf_pdfjs(annotated_pdf)
elif embedding_option == "Open in New Tab":
display_pdf_new_tab(annotated_pdf)
else:
st.info("Select a display method to view the PDF.")
# Sidebar for error details
st.sidebar.header("📝 Error Details")
if language_results.get("total_issues", 0) > 0:
for idx, issue in enumerate(language_results["issues"], 1):
with st.sidebar.expander(f"Issue {idx}"):
st.markdown(f"**Message:** {issue['message']}")
st.markdown(f"**Category:** {issue['category']}")
st.markdown(f"**Suggestions:** {', '.join(issue['suggestions']) if issue['suggestions'] else 'No suggestions'}")
st.markdown(f"**Sentence:** {issue['context']}")
else:
st.sidebar.success("No language issues found!")
# Option to download the annotated PDF
if annotated_pdf and len(annotated_pdf) > 0:
st.download_button(
label="📥 Download Annotated PDF",
data=annotated_pdf,
file_name="annotated.pdf",
mime="application/pdf",
)
else:
st.info("No annotated PDF available for download.")
if __name__ == "__main__":
main()