NazishHasan's picture
Update app.py
b368ccc verified
Raw
History Blame Contribute Delete
5.45 kB
import streamlit as st
import os
import io
import tempfile
from PIL import Image
from fpdf import FPDF
# --- Page Setup ---
st.set_page_config(page_title="Al Dhafra Photo Generator", layout="wide")
# Constants
LOGO_PATH = "Al Dhafra Logo.png"
GRADE_LIST = ["KG1", "KG2"] + [f"Grade {i}" for i in range(1, 13)]
SECTION_LIST = ["A", "B", "C", "D"]
current_year = 2025
AY_LIST = [f"AY {y}-{str(y+1)[2:]}" for y in range(current_year, current_year + 6)]
GOLD_COLOR = (184, 134, 11)
# --- Loading Logic ---
if 'ai_loaded' not in st.session_state:
with st.spinner("💫 Loading AI Engine... | جاري تحميل المحرك..."):
from rembg import remove
st.session_state['ai_loaded'] = True
st.session_state['remove_fn'] = remove
else:
from rembg import remove
# --- UI Tabs ---
tab1, tab2 = st.tabs(["🚀 Generator | المولد", "📖 How to Use | طريقة الاستخدام"])
with tab1:
st.title("⭐ Al Dhafra Star of the Week")
st.sidebar.header("Photo Settings | إعدادات الصورة")
selected_ay = st.sidebar.selectbox("Academic Year | السنة الدراسية", AY_LIST)
selected_term = st.sidebar.selectbox("Select Term | اختر الفصل الدراسي", ["Term 1", "Term 2", "Term 3"])
selected_week = st.sidebar.selectbox("Select Week | اختر الأسبوع", [f"Week {i}" for i in range(1, 13)])
border_color = st.sidebar.color_picker("Border Color | لون الإطار", "#001F3F")
h_color = border_color.lstrip('#')
rgb_border = tuple(int(h_color[i:i+2], 16) for i in (0, 2, 4))
num_students = st.number_input("Number of students | عدد الطلاب:", min_value=1, step=1)
students_data = []
for i in range(num_students):
with st.expander(f"Student {i+1} | الطالب {i+1}", expanded=True):
col1, col2 = st.columns([1, 1])
with col1:
name = st.text_input(f"Full Name | الاسم الكامل", key=f"n{i}")
sub_col1, sub_col2 = st.columns(2)
with sub_col1:
grade = st.selectbox(f"Grade | الصف", GRADE_LIST, key=f"g{i}")
with sub_col2:
section = st.selectbox(f"Section | الشعبة", SECTION_LIST, key=f"s{i}")
with col2:
img = st.file_uploader(f"Upload Photo | رفع الصورة", type=['jpg', 'png', 'jpeg'], key=f"i{i}")
if name and img:
students_data.append({"name": name, "grade": grade, "section": section, "image": img})
def create_pdf(data, border_rgb, term, week, ay):
pdf = FPDF()
for student in data:
pdf.add_page()
# 1. Border
pdf.set_draw_color(*border_rgb)
pdf.set_line_width(5)
pdf.rect(10, 10, 190, 277)
if os.path.exists(LOGO_PATH):
pdf.image(LOGO_PATH, x=170, y=12, w=20)
# 2. Header (Term | Week | AY)
pdf.set_xy(15, 15)
pdf.set_font("Arial", 'B', 11)
pdf.set_text_color(160, 160, 160)
pdf.cell(0, 10, f"{term} | {week} | {ay}", ln=True)
# 3. AI Processing (Background Removal & Smart Crop)
raw_img = Image.open(student["image"])
processed_img = st.session_state['remove_fn'](raw_img, alpha_matting=True)
bbox = processed_img.getbbox()
if bbox:
processed_img = processed_img.crop(bbox)
with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp:
processed_img.save(tmp.name, format='PNG')
temp_path = tmp.name
# 4. Golden Title
pdf.set_y(28)
pdf.set_font("Arial", 'B', 32)
pdf.set_text_color(*GOLD_COLOR)
pdf.cell(200, 20, "STAR OF THE WEEK", ln=True, align='C')
# 5. Combined Single Line: NAME - GRADE - SECTION
# We use a slightly smaller font (28) to ensure long names fit on one line
pdf.set_y(48)
pdf.set_font("Arial", 'B', 28)
pdf.set_text_color(*border_rgb)
combined_text = f"{student['name'].upper()} - {student['grade']}-{student['section']}"
pdf.cell(200, 15, combined_text, ln=True, align='C')
# 6. Student Photo (Proportional Scaling & Maximum Space)
# Photo now starts at y=65 since we saved space by combining lines
pdf.image(temp_path, x=35, y=65, w=140, h=0)
os.unlink(temp_path)
return pdf.output(dest='S').encode('latin-1')
if st.button("✨ Generate Star of the Week Photos | إنشاء الصور"):
if not students_data:
st.warning("Please fill details | يرجى ملء البيانات")
else:
with st.spinner("🎨 Creating... | جاري الإنشاء..."):
pdf_out = create_pdf(students_data, rgb_border, selected_term, selected_week, selected_ay)
st.balloons()
st.success("✅ Ready! | جاهز")
st.download_button(
label="📥 Download Photos PDF | تحميل الملف",
data=pdf_out,
file_name=f"Star_of_the_Week_{selected_ay}.pdf",
mime="application/pdf",
use_container_width=True
)