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)