import asyncio
import os
import re
import fitz # PyMuPDF
from flask import Flask, request, render_template_string, send_file
from playwright.async_api import async_playwright
app = Flask(__name__)
# --- UI Design ---
HTML_PAGE = """
JNVU Admit Card Downloader
JNVU Admit Card Finder
{% if error %}
{{ error }}
{% endif %}
{% if data %}
ЁЯСд Name: {{ data.name }}
ЁЯФв Roll No: {{ data.roll }}
ЁЯПл Center: {{ data.center }}
ЁЯУе Download PDF Now
{% endif %}
"""
# --- PDF Data Extraction ---
def extract_student_info(pdf_path):
info = {"name": "Not Found", "roll": "Not Found", "center": "Not Found"}
try:
doc = fitz.open(pdf_path)
text = "".join([page.get_text() for page in doc])
name_m = re.search(r"NAME OF CANDIDATE\s*:\s*(.*)", text)
roll_m = re.search(r"Roll no is\s+([\w\d]+)", text)
cent_m = re.search(r"Exam Centre is\s*(.*?)(?=Print Date|To,|The Centre|NAME OF EXAMINATION)", text, re.DOTALL)
if name_m: info["name"] = name_m.group(1).split('\n')[0].strip()
if roll_m: info["roll"] = roll_m.group(1).strip()
if cent_m: info["center"] = " ".join(cent_m.group(1).split())
doc.close()
except Exception as e: print(f"Error: {e}")
return info
# --- Playwright Logic ---
async def download_jnvu_pdf(form_number):
pdf_path = f"admit_card_{form_number}.pdf"
async with async_playwright() as p:
# Docker рдХреЗ рд▓рд┐рдП No-Sandbox рдмрд╣реБрдд рдЬрд░реВрд░реА рд╣реИ
browser = await p.chromium.launch(headless=True, args=["--no-sandbox", "--disable-dev-shm-usage"])
context = await browser.new_context(accept_downloads=True)
page = await context.new_page()
try:
url = "https://erp.jnvuiums.in/(S(biolzjtwlrcfmzwwzgs5uj5n))/Exam/Pre_Exam/Exam_ForALL_AdmitCard.aspx#"
await page.goto(url, wait_until="load", timeout=40000)
await page.fill("#txtchallanNo", str(form_number))
async with page.expect_download(timeout=20000) as download_info:
await page.click("#btnGetResult")
download = await download_info.value
await download.save_as(pdf_path)
return pdf_path
except Exception as e:
print(f"Download Error: {e}")
return None
finally:
await browser.close()
# --- Routes ---
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
form_number = request.form.get('form_number')
if not form_number.isdigit():
return render_template_string(HTML_PAGE, error="рдХреГрдкрдпрд╛ рд╕рд╣реА рдлреЙрд░реНрдо рдирдВрдмрд░ рдбрд╛рд▓реЗрдВред")
file_path = asyncio.run(download_jnvu_pdf(form_number))
if file_path and os.path.exists(file_path):
data = extract_student_info(file_path)
return render_template_string(HTML_PAGE, data=data, filename=file_path)
else:
return render_template_string(HTML_PAGE, error="рдПрдбрдорд┐рдЯ рдХрд╛рд░реНрдб рдирд╣реАрдВ рдорд┐рд▓рд╛ рдпрд╛ JNVU рд╕рд░реНрд╡рд░ рдзреАрдорд╛ рд╣реИред")
return render_template_string(HTML_PAGE)
@app.route('/download/')
def download_file(filename):
# рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд░реЗрдВ рдХрд┐ рдлрд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ
if os.path.exists(filename):
return send_file(filename, as_attachment=True)
return "File missing", 404
if __name__ == "__main__":
# Hugging Face PORT 7860 рдорд╛рдВрдЧрддрд╛ рд╣реИ
port = int(os.environ.get("PORT", 7860))
app.run(host='0.0.0.0', port=port)