PDF Skill Extractor & Job Recommender is a web application that extracts text and technical skills from uploaded PDF resumes and returns personalized job recommendations using natural language processing and machine learning techniques. The app displays job recommendations with match scores, matched skills, and posting dates.
-
Resume Upload (Frontend - React)
- Users upload their resume in PDF format through the React interface.
pdf.jsis used to extract text content from the uploaded PDF.
-
Skill Extraction
- The extracted text is matched against a predefined skills database to identify relevant technical skills.
-
API Request to Backend
- The React frontend sends a POST request to the R Plumber API endpoint
/recommend, containing the extracted skills as JSON data.
- The React frontend sends a POST request to the R Plumber API endpoint
-
Job Matching Logic (Backend - R Plumber API)
- The backend processes the skills and matches them against a job dataset.
- Calculates match scores based on skill relevance.
- Computes posted dates by parsing relative time strings and adjusting with scrape timestamps.
-
Response Generation
- The backend returns a structured JSON response with recommended jobs, scores, matched skills, and calculated posted dates.
-
Display Recommendations (Frontend)
- The frontend displays job recommendations with expandable descriptions, match scores, matched skills, and "time ago" posted dates.
- Client-side PDF text extraction using pdf.js
- Automatic detection of technical skills from resume content using a comprehensive skills database
- Job recommendation engine that ranks results by skill match scores
- Responsive user interface built with React and Tailwind CSS
- R-based backend (Plumber) for data processing and recommendation logic
- Detailed match results including scores, matched skills, job metadata, and posting dates
- Intelligent text formatting for job descriptions with expand/collapse functionality
- React 19.1.1
- Vite
- Tailwind CSS
- pdf.js
- R with Plumber
- dplyr, purrr, tibble, stringr, lubridate, jsonlite
- Node.js v18 or later (includes npm)
- R v4.0 or later
- Required R packages: plumber, jsonlite, dplyr, purrr, tibble, stringr, lubridate
sudo apt update
sudo apt install nodejs npm r-basesudo pacman -Syu
sudo pacman -S nodejs npm rbrew install node r- Download and install Node.js from nodejs.org
- Download and install R from cran.r-project.org
-
Clone the repository
git clone https://github.com/mukund58/Job-Recommender.git cd Job-Recommender -
Install Node.js dependencies
npm install
-
Install R packages Open an R session and run:
install.packages(c("plumber", "jsonlite", "dplyr", "purrr", "tibble", "stringr", "lubridate"))
Start the R API server:
npm run serve-r-apiThe Plumber API runs on port 8000.
Start the frontend development server:
npm run devOpen http://localhost:5173 in your browser.
- Upload a PDF resume through the user interface.
- The application extracts text and identifies skills from the predefined database.
- Submit detected skills to obtain ranked job recommendations.
- Review detailed matches, scores, and posting dates.
- Request body (JSON):
{ "skills": ["python", "react", "sql"] } - Response (JSON): List of recommended jobs with scores, matched skills, and posted dates. Example:
{ "results": [ { "title_clean": "Data Scientist", "company_name": "Tech Corp", "location": "San Francisco, CA", "posted_date": "2023-08-03 12:00:13", "score": 85, "matches": 3, "matched_skills": ["python", "sql", "machine learning"], "description": "Full job description...", "tags": "Data Science, python, sql", "job_category": "Data Science", "seniority_level": "Senior", "remote_type": "Remote", "employment_type": "Full-time", "salary_range": "$100k - $150k" } ] }
Job-Recommender/
├── public/
├── src/
│ ├── components/
│ │ ├── ResumeUploader.jsx
│ │ └── Recommendations.jsx
│ ├── App.jsx
│ ├── skills.json
│ └── ...
├── server/
│ └── r_backend/
│ ├── data/
│ │ └── enhanced_jobs_step3.json
│ ├── api.R
│ └── ...
├── package.json
├── vite.config.js
└── README.md
Contributions are welcome. Please follow the standard workflow:
- Fork the repository.
- Create a feature branch:
git checkout -b feature/your-feature. - Commit changes with clear messages.
- Push the branch and open a Pull Request for review.
- pdf.js
- The R community and CRAN packages
- Tailwind CSS
- React ecosystem