import gradio as gr import pdfplumber import spacy import os # Load spaCy with minimal pipelines to save memory try: nlp = spacy.load("en_core_web_sm", disable=["ner", "lemmatizer"]) except Exception as e: raise RuntimeError(f"Failed to load spaCy model: {str(e)}") def generate_portfolio(resume_file): # Check if a file was uploaded if resume_file is None: return "No file uploaded. Please upload a PDF resume." # Extract text from PDF try: with pdfplumber.open(resume_file) as pdf: text = "".join(page.extract_text() or "" for page in pdf.pages) except Exception as e: return f"Error processing PDF: {str(e)}" # Parse resume with spaCy doc = nlp(text) data = { "name": "", "summary": "", "experience": [], "skills": [], "contact": "" } for ent in doc.ents: if ent.label_ == "PERSON" and not data["name"]: data["name"] = ent.text elif ent.label_ == "ORG": data["experience"].append({"company": ent.text, "role": ""}) elif ent.label_ == "EMAIL": data["contact"] = ent.text # Extract skills (simple keyword-based) skill_keywords = ["python", "javascript", "sql", "communication", "leadership"] data["skills"] = [token.text for token in doc if token.text.lower() in skill_keywords] data["summary"] = text[:200] + "..." # Truncate for demo # Delete the uploaded file (privacy) os.remove(resume_file) # Generate portfolio HTML portfolio_html = f"""
Professional Portfolio
{data['summary']}
{exp["role"]}
Email: {data['contact']}