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""" {data['name']}'s Portfolio

{data['name']}

Professional Portfolio

About Me

{data['summary']}

Experience

{''.join([f'
{exp["company"]}

{exp["role"]}

' for exp in data['experience']])}

Skills

Contact

Email: {data['contact']}

""" return portfolio_html # Gradio interface (adjusted for 3.50.0 compatibility) interface = gr.Interface( fn=generate_portfolio, inputs=gr.inputs.File(label="Upload Resume (PDF)"), outputs=gr.outputs.HTML(label="Your Portfolio"), title="Resume to Portfolio Generator", description="Upload your resume to generate a portfolio landing page. Your data is processed securely and not stored.", allow_flagging="never" ) interface.launch()