from fastapi import FastAPI, File, UploadFile, HTTPException, Request
from fastapi.responses import JSONResponse, HTMLResponse
from fastapi.templating import Jinja2Templates
from typing import Dict, Any
import io
import base64
import logging
from .annotations import analyze_pdf
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI(
title="PDF Language Issue Analyzer",
description="An API to analyze PDFs for language issues and provide an annotated PDF.",
version="1.0.0"
)
# Set up templates
templates = Jinja2Templates(directory="app/templates")
@app.get("/", response_class=HTMLResponse, summary="Root Endpoint")
def read_root(request: Request):
"""
Render a simple HTML to verify the API is running.
"""
logger.info("Root endpoint accessed.")
return HTMLResponse(content="
PDF Language Issue Analyzer API is running.
")
@app.post("/analyze", response_class=HTMLResponse, summary="Analyze PDF for Language Issues")
async def analyze_pdf_endpoint(request: Request, file: UploadFile = File(...)):
"""
Analyze an uploaded PDF file for language issues and render the results on the frontend.
"""
if file.content_type != "application/pdf":
logger.error("Invalid file type uploaded: %s", file.content_type)
raise HTTPException(status_code=400, detail="Invalid file type. Only PDFs are supported.")
try:
contents = await file.read()
file_stream = io.BytesIO(contents)
language_issues, annotated_pdf = analyze_pdf(file_stream)
response_context = {
"request": request,
"language_issues": language_issues
}
if annotated_pdf:
# Encode the annotated PDF in Base64
encoded_pdf = base64.b64encode(annotated_pdf).decode('utf-8')
annotated_pdf_data_url = f"data:application/pdf;base64,{encoded_pdf}"
response_context["annotated_pdf"] = annotated_pdf_data_url
logger.info("Annotated PDF generated and encoded.")
logger.info("PDF analysis completed successfully.")
return templates.TemplateResponse("index.html", response_context)
except Exception as e:
logger.exception("Error occurred during PDF analysis.")
raise HTTPException(status_code=500, detail=str(e))