pdf-detect-api / app.py
McNeilAlex's picture
Upload folder using huggingface_hub
5f3cfc2 verified
Raw
History Blame Contribute Delete
2.07 kB
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from detect import detect_pdf
app = FastAPI(title="PDF Field Detector")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["POST", "GET"],
allow_headers=["*"],
)
@app.get("/health")
def health():
from detect import _ensure_ffdnet, _ffdnet_error
return {"ok": True, "ffdnet": _ensure_ffdnet(), "ffdnet_error": _ffdnet_error or None}
@app.post("/debug")
async def debug(file: UploadFile = File(...)):
"""Run commonforms and return raw widget count + sample boxes before normalization."""
import tempfile, os, fitz
from commonforms import prepare_form
pdf_bytes = await file.read()
with tempfile.TemporaryDirectory() as tmp:
in_p = os.path.join(tmp, 'in.pdf')
out_p = os.path.join(tmp, 'out.pdf')
with open(in_p, 'wb') as f: f.write(pdf_bytes)
try:
prepare_form(in_p, out_p, confidence=0.1, device='cpu')
except Exception as e:
return {"error": str(e)}
if not os.path.exists(out_p):
return {"error": "no output produced"}
doc = fitz.open(out_p)
result = []
for pi, page in enumerate(doc):
widgets = list(page.widgets())
result.append({
"page": pi,
"widget_count": len(widgets),
"sample": [{"type": w.field_type, "rect": list(w.rect)} for w in widgets[:5]],
})
return {"pages": result, "output_size": os.path.getsize(out_p)}
@app.post("/detect")
async def detect(file: UploadFile = File(...)):
if not file.filename.lower().endswith(".pdf"):
raise HTTPException(400, "Only PDF files accepted")
pdf_bytes = await file.read()
if len(pdf_bytes) > 50 * 1024 * 1024:
raise HTTPException(413, "PDF too large (max 50MB)")
try:
pages = detect_pdf(pdf_bytes)
return {"pages": pages}
except Exception as e:
raise HTTPException(500, str(e))