File size: 1,806 Bytes
39cf2d7
0f1afca
39cf2d7
 
2c466a1
39cf2d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph

TIME_SLOTS = ["9:00-10:30", "10:30-12:00", "12:00-1:30", "1:30-3:00"]
DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]

def export_timetable_pdf(timetable_dict, output_file="timetable.pdf"):
    doc = SimpleDocTemplate(output_file, pagesize=A4)
    elements = []
    
    # Multi-line style
    style = ParagraphStyle(name="Normal", fontSize=9, leading=12)
    
    for cls, timetable in timetable_dict.items():
        # Class/Program Name on top
        elements.append(Paragraph(f"<b>{cls}</b>", ParagraphStyle(name="Heading", fontSize=14)))
        elements.append(Paragraph("<br/>", style))
        
        # Table header
        data = [["Day"] + TIME_SLOTS]
        
        for day in DAYS:
            row = [day]
            for slot in TIME_SLOTS:
                info = timetable[day][slot]
                if info:
                    text = f"{info['Course']}\n{info['Teacher']}\n{info['Room']}"
                    row.append(Paragraph(text, style))
                else:
                    row.append("")
            data.append(row)
        
        table = Table(data, repeatRows=1, colWidths=[60]+[100]*len(TIME_SLOTS))
        table.setStyle(TableStyle([
            ('GRID', (0,0), (-1,-1), 1, colors.black),
            ('BACKGROUND', (0,0), (-1,0), colors.lightblue),
            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
            ('ALIGN', (0,0), (-1,0), 'CENTER'),
            ('ALIGN', (0,1), (-1,-1), 'CENTER'),
        ]))
        elements.append(table)
        elements.append(Paragraph("<br/><br/>", style))
    
    doc.build(elements)
    return output_file