SetFont('Courier', '', 10); $this->Cell(0, 8, iconv('UTF-8','cp874','ใบควบคุมผลการเรียน'), 0, 1, 'C'); $this->Ln(2); } function footer() { $this->SetY(-15); $this->SetFont('Courier', '', 8); $this->Cell(0, 10, iconv('UTF-8','cp874','หน้าที่ ').$this->PageNo().'/{nb}', 0, 0, 'C'); } } $pdf = new SummaryPDF('P', 'mm', 'A4'); $pdf->AliasNbPages(); $pdf->SetMargins(8, 10, 8); $pdf->AddPage(); // Student info $pdf->SetFont('Courier', '', 9); $info = [ ['รหัสนักศึกษา:', $student['student_code']], ['ชื่อ-นามสกุล:', $student['name_th'] . ' (' . $student['name_en'] . ')'], ['สาขาวิชา:', $student['curriculum_code'] . ' - ' . $student['curriculum_name']], ['คณะ:', $student['faculty'] ?: '-'], ['สถาบันที่จบ:', $student['graduated_institution'] ?: '-'], ['ปีการศึกษา:', $student['enrollment_year']], ]; foreach ($info as $row) { $pdf->Cell(45, 5, iconv('UTF-8','cp874',$row[0]), 0, 0); $pdf->Cell(0, 5, iconv('UTF-8','cp874//IGNORE',$row[1]), 0, 1); } $pdf->Ln(1); $remaining = max(0, $total_curriculum_credits - $total_completed); $pct = $total_curriculum_credits > 0 ? round(($total_completed / $total_curriculum_credits) * 100) : 0; $pdf->SetFont('Courier', 'B', 9); $pdf->Cell(0, 6, iconv('UTF-8','cp874','เทียบโอน: '.$transfer_credits_total.' | เรียนแล้ว: '.$total_completed.' | คงเหลือ: '.$remaining.' | คิดเป็น '.$pct.'%'), 0, 1); $pdf->Ln(3); // Render tree recursively $level = 0; renderPdfTree($summary['groups'], $pdf, $level); // Summary table $pdf->Ln(3); $pdf->SetFont('Courier', 'B', 9); $pdf->Cell(0, 6, iconv('UTF-8','cp874','--- สรุปรายวิชาที่เรียนผ่านแล้วทั้งหมด ---'), 0, 1); $pdf->Ln(1); $pdf->SetFont('Courier', '', 8); $pdf->Cell(28, 4, iconv('UTF-8','cp874','รหัสวิชา'), 1, 0); $pdf->Cell(46, 4, iconv('UTF-8','cp874','ชื่อวิชา'), 1, 0); $pdf->Cell(12, 4, iconv('UTF-8','cp874','หน่วยกิต'), 1, 0, 'C'); $pdf->Cell(10, 4, iconv('UTF-8','cp874','เกรด'), 1, 0, 'C'); $pdf->Cell(16, 4, iconv('UTF-8','cp874','ภาคเรียน'), 1, 0, 'C'); $pdf->Cell(16, 4, iconv('UTF-8','cp874','ปีการศึกษา'), 1, 0, 'C'); $pdf->Cell(19, 4, iconv('UTF-8','cp874','ประเภท'), 1, 1); $total = 0; foreach ($student_courses as $sc) { $total += $sc['credits']; $name = mb_substr($sc['course_name_th'], 0, 24, 'UTF-8'); $type = iconv('UTF-8','cp874//IGNORE', $sc['course_type'] ?: ($sc['source_type'] == 'transfer' ? 'เทียบโอน' : 'เรียน')); $sem = $sc['semester'] ? 'ภาค '.$sc['semester'] : '-'; $yr = $sc['academic_year'] ?: '-'; $grade = $sc['grade'] ?: '-'; $pdf->SetFont('Courier', '', 8); $pdf->Cell(28, 4, iconv('UTF-8','cp874//IGNORE',$sc['course_code']), 1, 0); $pdf->Cell(46, 4, iconv('UTF-8','cp874//IGNORE',$name), 1, 0); $pdf->Cell(12, 4, $sc['credits'], 1, 0, 'C'); $pdf->Cell(10, 4, $grade, 1, 0, 'C'); $pdf->Cell(16, 4, iconv('UTF-8','cp874//IGNORE',$sem), 1, 0, 'C'); $pdf->Cell(16, 4, iconv('UTF-8','cp874//IGNORE',$yr), 1, 0, 'C'); $pdf->Cell(19, 4, $type, 1, 1); } $pdf->SetFont('Courier', 'B', 8); $pdf->Cell(147, 5, iconv('UTF-8','cp874','รวมหน่วยกิตที่เรียนผ่านแล้วทั้งหมด: '.$total.' หน่วยกิต'), 0, 1); $pdf->Ln(3); if ($remaining <= 0) { $pdf->SetFont('Courier', 'B', 10); $pdf->Cell(0, 6, iconv('UTF-8','cp874','*** ครบตามหลักสูตรแล้ว ***'), 0, 1, 'C'); } else { $pdf->SetFont('Courier', '', 9); $pdf->Cell(0, 6, iconv('UTF-8','cp874','หน่วยกิตคงเหลือที่ต้องเรียน: '.$remaining.' หน่วยกิต'), 0, 1); } $filename = 'Summary_' . $student['student_code'] . '_' . date('Ymd') . '.pdf'; $pdf->Output('I', $filename); // ============================================================ function renderPdfTree($nodes, &$pdf, $level) { foreach ($nodes as $node) { $g = $node['group']; $has_courses = !empty($node['courses']); $has_children = !empty($node['children']); $indent = $level * 4; $pdf->SetX(8 + $indent); if ($level == 0) { $pdf->SetFont('Courier', 'B', 9); } elseif ($level == 1) { $pdf->SetFont('Courier', 'B', 8); } else { $pdf->SetFont('Courier', '', 8); } $title = $g['name_th']; if ($g['min_credits'] > 0) $title .= ' ('.iconv('UTF-8','cp874','ไม่น้อยกว่า ').$g['min_credits'].iconv('UTF-8','cp874',' หน่วยกิต').')'; $pdf->Cell(0, 5, iconv('UTF-8','cp874//IGNORE',$title), 0, 1); if ($has_courses) { $pdf->SetX(8 + $indent); $pdf->SetFont('Courier', '', 7); $pdf->Cell(30, 3, iconv('UTF-8','cp874','รหัสวิชา'), 0, 0); $pdf->Cell(50, 3, iconv('UTF-8','cp874','ชื่อวิชา'), 0, 0); $pdf->Cell(12, 3, iconv('UTF-8','cp874','หน่วยกิต'), 0, 0, 'C'); $pdf->Cell(10, 3, iconv('UTF-8','cp874','เกรด'), 0, 0, 'C'); $pdf->Cell(18, 3, iconv('UTF-8','cp874','ประเภท'), 0, 1); foreach ($node['courses'] as $course) { $status_text = ''; $grade_text = ''; if (isset($course['_completed'])) { $sc = $course['_completed']; $status_text = iconv('UTF-8','cp874//IGNORE', $sc['course_type'] ?: ($sc['source_type'] == 'transfer' ? 'เทียบโอน' : 'เรียนแล้ว')); $grade_text = $sc['grade'] ?: '-'; } $name = mb_substr($course['name_th'], 0, 28, 'UTF-8'); $pdf->SetX(8 + $indent); $pdf->SetFont('Courier', '', 8); $pdf->Cell(30, 4, iconv('UTF-8','cp874//IGNORE',$course['code']), 0, 0); $pdf->Cell(50, 4, iconv('UTF-8','cp874//IGNORE',$name), 0, 0); $pdf->Cell(12, 4, $course['credits'], 0, 0, 'C'); $pdf->Cell(10, 4, $grade_text, 0, 0, 'C'); $pdf->Cell(18, 4, $status_text, 0, 1); } $pdf->Ln(1); } if ($has_children) { renderPdfTree($node['children'], $pdf, $level + 1); } } }