Spaces:
Runtime error
Runtime error
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") | |
def read_root(request: Request): | |
""" | |
Render a simple HTML to verify the API is running. | |
""" | |
logger.info("Root endpoint accessed.") | |
return HTMLResponse(content="<h1>PDF Language Issue Analyzer API is running.</h1>") | |
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)) |