File size: 2,548 Bytes
514e4c2
 
 
 
 
6b78f9c
 
1e01eb5
 
 
 
 
 
 
6b78f9c
 
 
 
 
 
 
514e4c2
 
 
 
 
 
 
 
1854fbd
514e4c2
1854fbd
1e01eb5
514e4c2
1854fbd
514e4c2
 
6b78f9c
514e4c2
6b78f9c
 
1e01eb5
6b78f9c
 
 
 
 
 
 
514e4c2
 
6b78f9c
 
 
 
514e4c2
d7adeec
514e4c2
 
1e01eb5
6b78f9c
1e01eb5
514e4c2
6b78f9c
1e01eb5
6b78f9c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# app/main.py
from fastapi import FastAPI, File, UploadFile, HTTPException, Request, Form
from fastapi.responses import JSONResponse, StreamingResponse, HTMLResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
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"
)

# Mount static files if any (optional)
# app.mount("/static", StaticFiles(directory="app/static"), name="static")

# Set up templates
templates = Jinja2Templates(directory="app/templates")

@app.get("/", response_class=HTMLResponse, summary="Root Endpoint")
def read_root(request: Request):
    """
    Render the main page with upload form.
    """
    logger.info("Root endpoint accessed.")
    return templates.TemplateResponse("index.html", {"request": request})

@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))