# try: from pip._internal.operations import freeze | |
# except ImportError: # pip < 10.0 | |
# from pip.operations import freeze | |
# pkgs = freeze.freeze() | |
# for pkg in pkgs: print(pkg) | |
# import os | |
# from fastapi import FastAPI, HTTPException, File, UploadFile,Query | |
# from fastapi.middleware.cors import CORSMiddleware | |
# from PyPDF2 import PdfReader | |
# import google.generativeai as genai | |
# import json | |
# import base64 | |
# from io import BytesIO | |
# from PIL import Image | |
# import io | |
# import requests | |
# import fitz # PyMuPDF | |
# import os | |
# from dotenv import load_dotenv | |
# # Load the environment variables from the .env file | |
# load_dotenv() | |
# # Configure Gemini API | |
# secret = os.environ["GEMINI"] | |
# genai.configure(api_key=secret) | |
# model_vision = genai.GenerativeModel('gemini-1.5-flash') | |
# model_text = genai.GenerativeModel('gemini-pro') | |
# app = FastAPI() | |
# app.add_middleware( | |
# CORSMiddleware, | |
# allow_origins=["*"], | |
# allow_credentials=True, | |
# allow_methods=["*"], | |
# allow_headers=["*"], | |
# ) | |
# def vision(file_content): | |
# # Open the PDF | |
# pdf_document = fitz.open("pdf",file_content) | |
# gemini_input = ["extract the whole text"] | |
# # Iterate through the pages | |
# for page_num in range(len(pdf_document)): | |
# # Select the page | |
# page = pdf_document.load_page(page_num) | |
# # Render the page to a pixmap (image) | |
# pix = page.get_pixmap() | |
# print(type(pix)) | |
# # Convert the pixmap to bytes | |
# img_bytes = pix.tobytes("png") | |
# # Convert bytes to a PIL Image | |
# img = Image.open(io.BytesIO(img_bytes)) | |
# gemini_input.append(img) | |
# # # Save the image if needed | |
# # img.save(f'page_{page_num + 1}.png') | |
# print("PDF pages converted to images successfully!") | |
# # Now you can pass the PIL image to the model_vision | |
# response = model_vision.generate_content(gemini_input).text | |
# return response | |
# @app.post("/get_ocr_data/") | |
# async def get_data(input_file: UploadFile = File(...)): | |
# #try: | |
# # Determine the file type by reading the first few bytes | |
# file_content = await input_file.read() | |
# file_type = input_file.content_type | |
# text = "" | |
# if file_type == "application/pdf": | |
# # Read PDF file using PyPDF2 | |
# pdf_reader = PdfReader(io.BytesIO(file_content)) | |
# for page in pdf_reader.pages: | |
# text += page.extract_text() | |
# if len(text)<10: | |
# print("vision called") | |
# text = vision(file_content) | |
# else: | |
# raise HTTPException(status_code=400, detail="Unsupported file type") | |
# # Call Gemini (or another model) to extract required data | |
# prompt = f"""This is CV data: {text.strip()} | |
# IMPORTANT: The output should be a JSON array! Make Sure the JSON is valid. | |
# Example Output: | |
# [ | |
# "firstname" : "firstname", | |
# "lastname" : "lastname", | |
# "gender" : "gender", | |
# "email" : "email", | |
# "contact_number" : "contact number", | |
# "age" : "age", | |
# "home_address" : "full home address", | |
# "home_town" : "home town or city", | |
# "total_years_of_experience" : "total years of experience", | |
# "LinkedIn_link" : "LinkedIn link", | |
# "positions": [ "Job title 1", "Job title 2", "Job title 3" ], | |
# "industry": "industry of work", | |
# "experience" : "experience", | |
# "skills" : Skills(Identify and list specific skills mentioned in both the skills section and inferred from the experience section) | |
# ] | |
# """ | |
# response = model_text.generate_content(prompt) | |
# print(response.text) | |
# data = json.loads(response.text.replace("JSON", "").replace("json", "").replace("```", "")) | |
# return {"data": data} | |
# #except Exception as e: | |
# #raise HTTPException(status_code=500, detail=f"Error processing file: {str(e)}") | |
from fastapi import FastAPI, HTTPException, File, UploadFile, Query | |
from fastapi.middleware.cors import CORSMiddleware | |
from PyPDF2 import PdfReader | |
import google.generativeai as genai | |
import json | |
from PIL import Image | |
import io | |
import fitz # PyMuPDF | |
import os | |
from dotenv import load_dotenv | |
# Load environment variables | |
load_dotenv() | |
secret = os.environ["GEMINI"] | |
genai.configure(api_key=secret) | |
model_vision = genai.GenerativeModel('gemini-1.5-flash') | |
model_text = genai.GenerativeModel('gemini-pro') | |
app = FastAPI() | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
def process_pdf_text(file_content): | |
"""Extract text from PDF using PyPDF2.""" | |
pdf_reader = PdfReader(io.BytesIO(file_content)) | |
text = "" | |
for page in pdf_reader.pages: | |
text += page.extract_text() | |
return text | |
def process_pdf_images(file_content): | |
"""Extract images from PDF and pass to Gemini Vision.""" | |
pdf_document = fitz.open("pdf", file_content) | |
gemini_input = [] | |
for page_num in range(len(pdf_document)): | |
page = pdf_document.load_page(page_num) | |
pix = page.get_pixmap() | |
img_bytes = pix.tobytes("png") | |
img = Image.open(io.BytesIO(img_bytes)) | |
gemini_input.append(img) | |
# Call Gemini Vision with extracted images | |
response = model_vision.generate_content(["extract the whole text", *gemini_input]) | |
return response.text | |
async def get_data(user_id: str = Query(...), input_file: UploadFile = File(...)): | |
try: | |
file_content = await input_file.read() | |
file_type = input_file.content_type | |
if file_type != "application/pdf": | |
raise HTTPException(status_code=400, detail="Unsupported file type") | |
# Process PDF | |
text = process_pdf_text(file_content) | |
if len(text.strip()) < 10: # Fallback to image-based OCR if text is minimal | |
text = process_pdf_images(file_content) | |
# Call Gemini Text model | |
prompt = f""" | |
This is CV data: {text.strip()} | |
IMPORTANT: The output should be a JSON array! Make sure the JSON is valid. | |
Example Output: | |
[ | |
"firstname" : "firstname", | |
"lastname" : "lastname", | |
"email" : "email", | |
"contact_number" : "contact number", | |
"home_address" : "full home address", | |
"home_town" : "home town or city", | |
"total_years_of_experience" : "total years of experience", | |
"education": "Institution Name, Degree Name", | |
"LinkedIn_link" : "LinkedIn link", | |
"experience" : "experience", | |
"industry": "industry of work", | |
"skills" : skills(Identify and list specific skills mentioned in both the skills section and inferred from the experience section), | |
"positions": [ "Job title 1", "Job title 2", "Job title 3" ], | |
"summary": "Generate a summary of the CV, including key qualifications, notable experiences, and relevant skills." | |
] | |
""" | |
response = model_text.generate_content(prompt) | |
data = json.loads(response.text.replace("```", "")) # Sanitize response | |
return {"data": data} | |
# except Exception as e: | |
# raise HTTPException(status_code=500, detail=f"Error processing file: {str(e)}") | |