Пример #1
0
        public ActionResult Edit(EditCurriculumViewModel cvm)
        {
            if (ModelState.IsValid)
            {
                Curriculum curriculum = db.Curricula.Where(o => o.Id == cvm.Curriculum.Id)
                                        .Include(o => o.Student)
                                        .FirstOrDefault();
                //Curriculum curriculum = db.GetFromDatabase<Curriculum>(cvm.Curriculum.Id);
                curriculum.Naam = cvm.Curriculum.Naam;
                var oldList = curriculum.Topics;

                List <Topic> newList = new List <Topic>();
                foreach (int id in cvm.TopicIds)
                {
                    newList.Add(db.GetFromDatabase <Topic>(id));
                    var curriculumTopic = db.CurriculumTopics.Where(ct => ct.Topic.Id == id && ct.Curriculum.Id == curriculum.Id).FirstOrDefault();
                    // if null means a new curriculumtopic needs to be added.
                    if (curriculumTopic == null)
                    {
                        Topic           topic = db.GetFromDatabase <Topic>(id);
                        CurriculumTopic t     = new CurriculumTopic {
                            TopicId = topic.Id, Topic = topic, Curriculum = curriculum, CurriculumId = curriculum.Id
                        };
                        oldList.Add(t);
                    }
                }

                // oldList has more items than newlist so we need to remove items.
                if (oldList.Count > newList.Count)
                {
                    List <CurriculumTopic> removeList = new List <CurriculumTopic>();
                    foreach (var curriculumTopic1 in oldList)
                    {
                        var a = newList.Where(t => t.Id == curriculumTopic1.TopicId).FirstOrDefault();
                        if (a == null)
                        {
                            // verwijder curriculumtopic uit oudelijst
                            var curriculumTopic = db.CurriculumTopics.Where(ct => ct.Curriculum.Id == curriculum.Id && ct.Topic.Id == curriculumTopic1.TopicId).FirstOrDefault();
                            removeList.Add(curriculumTopic);
                        }
                    }
                    foreach (var item in removeList)
                    {
                        oldList.Remove(item);
                    }
                }

                db.Entry(curriculum).State = EntityState.Modified;
                db.SaveChanges();
                return(RedirectToAction("Details", "Student", new { id = curriculum.Student.Id }));
            }
            //curriculumTemplateViewModel.AlleTopics = db.Topics.ToList();
            return(View());
        }
Пример #2
0
        public ActionResult Create([Bind(Include = "StudentId,CurriculumTemplateId")] CurriculumViewModel curriculumViewModel)
        {
            if (ModelState.IsValid)
            {
                Student    student            = db.GetFromDatabase <Student>(curriculumViewModel.StudentId);
                var        curriculumTemplate = db.GetFromDatabase <CurriculumTemplate>(curriculumViewModel.CurriculumTemplateId);
                var        topics             = curriculumTemplate.Topics;
                Curriculum curriculum         = new Curriculum();
                curriculum.Naam = curriculumTemplate.Naam;

                foreach (var topic in topics)
                {
                    //var topic1 = db.GetFromDatabase<Topic>(topic.Id);
                    CurriculumTopic t = new CurriculumTopic {
                        TopicId = topic.Id, Topic = topic, Curriculum = curriculum, CurriculumId = curriculum.Id
                    };
                    curriculum.Topics.Add(t);
                }


                curriculum.Student = student;
                student.Curricula.Add(curriculum);
                db.Curricula.Add(curriculum);
                db.Entry(student).State = EntityState.Modified;

                db.SaveChanges();

                //// COMMENT: This code can probably be removed
                //if (curriculumViewModel.StudentId != 0)
                //  return RedirectToAction("Details", "Student", new { id = curriculumViewModel.StudentId });


                return(RedirectToAction("Details", "Student", new { id = curriculumViewModel.StudentId }));
            }
            return(View());
            //curriculumTemplateViewModel.AlleTopics = db.Topics.Where(t => !t.IsDeleted).ToList();
            //curriculumTemplateViewModel.AlleTopics = db.Topics.ToList();
            //return View(curriculumTemplateViewModel);
        }
Пример #3
0
        public string ImportCourse(ScheduleCourse scheduleCourse)
        {
            string msg;

            _Logger.DebugFormat("Importiere Fach: {0}", scheduleCourse.Name);
            _report.AppendFormat("<h1>Erzeuge LV \"{0} ({1})\" - [{2}]</h1>", scheduleCourse.Name, scheduleCourse.ShortName,
                                 scheduleCourse.CourseId);
            _report.AppendLine();

            var db = new TimeTableDbContext();

            var organiser = db.Organisers.SingleOrDefault(s => s.Id == _orgId);
            var sem       = db.Semesters.SingleOrDefault(s => s.Id == _semId);

            long msStart = sw.ElapsedMilliseconds;
            var  course  = new Course
            {
                ExternalSource = "JSON",
                ExternalId     = scheduleCourse.CourseId,
                Organiser      = organiser,
                ShortName      = scheduleCourse.ShortName,
                Name           = scheduleCourse.Name,
                Description    = scheduleCourse.Description,
                Occurrence     = CreateDefaultOccurrence(scheduleCourse.SeatRestriction ?? 0),
                IsInternal     = true,
            };

            // Kurs sofort speichern, damit die ID gesichert ist
            db.Activities.Add(course);
            db.SaveChanges();
            long msEnd = sw.ElapsedMilliseconds;

            _Logger.DebugFormat("Dauer: {0}ms", msEnd - msStart);
            msStart = msEnd;

            _report.AppendLine("<h2>Bezeichnungen</h2>");
            _report.AppendLine("<table>");
            _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name);
            _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName);
            _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description);
            _report.AppendLine("</table>");


            // jetzt die Gruppen
            foreach (var scheduleGroup in scheduleCourse.Groups)
            {
                // Fakultät ermitteln
                var org = db.Organisers.SingleOrDefault(x => x.ShortName.Equals(scheduleGroup.FacultyName));

                // Studiengang innerhalb der Fakultät ermitteln
                var curr = org.Curricula.SingleOrDefault(x => x.ShortName.Equals(scheduleGroup.CurriculumShortName));
                if (curr == null)
                {
                    curr = new TimeTable.Data.Curriculum
                    {
                        ShortName = scheduleGroup.CurriculumShortName,
                        Name      = scheduleGroup.CurriculumName,
                        Organiser = org
                    };
                    db.Curricula.Add(curr);
                    db.SaveChanges();
                }

                // Studiengruppe innerhalb des Studiengangs ermitteln
                var groupName = scheduleGroup.GroupName;

                // Sonderlocke FK 11
                // aus der LV-Nummer das Semester raussuchen

                /* OHI 20180720: wieder ausgebaut, weil Schnittstelle jetzt sauber befüllt ist
                 * if (org.ShortName.Equals("FK 11"))
                 * {
                 *  if (!string.IsNullOrEmpty(course.ShortName))
                 *  {
                 *      groupName = course.ShortName[1].ToString();
                 *
                 *  }
                 *  else
                 *  {
                 *      groupName = "#N.V.";
                 *  }
                 * }
                 */

                var currGroup = curr.CurriculumGroups.SingleOrDefault(x => x.Name.Equals(groupName));
                if (currGroup == null)
                {
                    currGroup = new CurriculumGroup
                    {
                        Curriculum     = curr,
                        Name           = groupName,
                        IsSubscribable = true,
                    };
                    db.CurriculumGroups.Add(currGroup);
                    db.SaveChanges();
                }

                // Kapazitätsgruppe innerhalb der Studiengruppe ermitteln
                CapacityGroup capGroup = null;
                if (string.IsNullOrEmpty(scheduleGroup.SubGroupName))
                {
                    capGroup = currGroup.CapacityGroups.SingleOrDefault(x => string.IsNullOrEmpty(x.Name));
                    if (capGroup == null)
                    {
                        capGroup = new CapacityGroup
                        {
                            CurriculumGroup = currGroup,
                            Name            = string.Empty,
                            InSS            = scheduleGroup.SemesterName.StartsWith("SS"),
                            InWS            = scheduleGroup.SemesterName.StartsWith("WS")
                        };
                        db.CapacityGroups.Add(capGroup);
                        db.SaveChanges();
                    }
                }
                else
                {
                    capGroup = currGroup.CapacityGroups.SingleOrDefault(x => !string.IsNullOrEmpty(x.Name) && x.Name.Equals(scheduleGroup.SubGroupName));
                    if (capGroup == null)
                    {
                        capGroup = new CapacityGroup
                        {
                            CurriculumGroup = currGroup,
                            Name            = scheduleGroup.SubGroupName,
                            InSS            = scheduleGroup.SemesterName.StartsWith("SS"),
                            InWS            = scheduleGroup.SemesterName.StartsWith("WS")
                        };
                        db.CapacityGroups.Add(capGroup);
                        db.SaveChanges();
                    }
                }

                // Semester ermitteln
                var semester = db.Semesters.SingleOrDefault(x => x.Name.Equals(scheduleGroup.SemesterName));

                if (semester.Id == sem.Id)
                {
                    // jetzt können wir die Semestergruppe ermitteln
                    var semGroup =
                        db.SemesterGroups.SingleOrDefault(x => x.Semester.Id == semester.Id &&
                                                          x.CapacityGroup.Id == capGroup.Id);
                    if (semGroup == null)
                    {
                        semGroup = new SemesterGroup
                        {
                            Semester      = semester,
                            CapacityGroup = capGroup,
                            IsAvailable   = false // zu Beginn nicht freigegeben
                        };
                        db.SemesterGroups.Add(semGroup);
                        db.SaveChanges();
                    }

                    course.SemesterGroups.Add(semGroup);
                    semGroup.Activities.Add(course);

                    // zu jeder Semestergruppe gibt es dann noch eine
                    // Gruppe für Platzverlosung
                    var occGroup =
                        course.Occurrence.Groups.SingleOrDefault(
                            gg => gg.SemesterGroups.Any(s => s.Id == semGroup.Id));

                    if (occGroup == null)
                    {
                        occGroup = new OccurrenceGroup
                        {
                            Capacity            = 0,
                            FitToCurriculumOnly = true,
                            Occurrence          = course.Occurrence
                        };
                        occGroup.SemesterGroups.Add(semGroup);
                        semGroup.OccurrenceGroups.Add(occGroup);
                        course.Occurrence.Groups.Add(occGroup);
                        db.OccurrenceGroups.Add(occGroup);
                    }

                    // NEU: Chapter und Topics
                    if (!string.IsNullOrEmpty(scheduleGroup.ChapterName) &&
                        !string.IsNullOrEmpty(scheduleGroup.TopicName))
                    {
                        var chapter = curr.Chapters.FirstOrDefault(x => x.Name.Equals(scheduleGroup.ChapterName));
                        if (chapter == null)
                        {
                            chapter = new CurriculumChapter
                            {
                                Curriculum = curr,
                                Name       = scheduleGroup.ChapterName
                            };
                            db.CurriculumChapters.Add(chapter);
                        }

                        var topic = chapter.Topics.FirstOrDefault(x => x.Name.Equals(scheduleGroup.TopicName));
                        if (topic == null)
                        {
                            topic = new CurriculumTopic
                            {
                                Chapter = chapter,
                                Name    = scheduleGroup.TopicName
                            };
                            db.CurriculumTopics.Add(topic);
                        }

                        var semTopic = db.SemesterTopics.FirstOrDefault(x =>
                                                                        x.Semester.Id == sem.Id && x.Topic.Id == topic.Id);

                        if (semTopic == null)
                        {
                            semTopic = new SemesterTopic
                            {
                                Semester = sem,
                                Topic    = topic,
                            };
                            db.SemesterTopics.Add(semTopic);
                        }

                        semTopic.Activities.Add(course);
                    }
                }
                // else => Semestergruppe wird nicht angelegt
            }

            db.SaveChanges();

            if (!course.SemesterGroups.Any())
            {
                _Logger.ErrorFormat("Kurs {0} ohne Gruppe", scheduleCourse.CourseId);
            }

            // zum Schluss die Termine
            _report.AppendLine("<h2>Neue Termine</h2>");
            _report.AppendLine("<table>");

            foreach (var scheduleDate in scheduleCourse.Dates)
            {
                // Der Tag
                var occDate = scheduleDate.Begin.Date;

                bool isVorlesung = true;
                foreach (var sd in _semester.Dates)
                {
                    // Wenn der Termin in eine vorlesungsfreie Zeit fällt, dann nicht importieren
                    if (sd.From.Date <= occDate.Date &&
                        occDate.Date <= sd.To.Date &&
                        sd.HasCourses == false)
                    {
                        isVorlesung = false;
                    }
                }

                if (isVorlesung)
                {
                    var occ = new ActivityDate
                    {
                        Begin      = scheduleDate.Begin,
                        End        = scheduleDate.End,
                        Activity   = course,
                        Occurrence = CreateDefaultOccurrence(),
                    };
                    _report.AppendLine("<tr>");
                    _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", occ.Begin.ToShortDateString(), occ.Begin.ToShortTimeString(), occ.End.ToShortTimeString());

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateRoom in scheduleDate.Rooms)
                    {
                        _report.AppendFormat("<p>{0}", scheduleDateRoom.RoomNumber);
                        if (!string.IsNullOrEmpty(scheduleDateRoom.RoomNumber))
                        {
                            var room = db.Rooms.SingleOrDefault(r => r.Number.Equals(scheduleDateRoom.RoomNumber));
                            if (room == null)
                            {
                                room = new Room
                                {
                                    Number      = scheduleDateRoom.RoomNumber,
                                    Capacity    = 0,
                                    Description = string.Empty,
                                    Owner       = string.Empty,
                                };
                                db.Rooms.Add(room);
                                db.SaveChanges();

                                _numRooms++;
                                _report.AppendFormat(" !!!NEUER RAUM!!!");
                            }


                            var assignment = db.RoomAssignments.SingleOrDefault(x =>
                                                                                x.Room.Id == room.Id &&
                                                                                x.Organiser.Id == organiser.Id);
                            if (assignment == null)
                            {
                                assignment = new RoomAssignment
                                {
                                    Organiser = organiser,
                                    InternalNeedConfirmation = false, // offen für interne
                                    ExternalNeedConfirmation = true   // geschlossen für externe
                                };

                                room.Assignments.Add(assignment);
                                db.RoomAssignments.Add(assignment);
                                db.SaveChanges();
                            }

                            occ.Rooms.Add(room);
                            _report.AppendFormat("</p>");
                        }
                    }
                    _report.AppendFormat("</td>");

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateLecturer in scheduleDate.Lecturers)
                    {
                        _report.AppendFormat("<p>{0} ({1})", scheduleDateLecturer.Name, scheduleDateLecturer.ShortName);

                        var lecturer = organiser.Members.SingleOrDefault(l => l.ShortName.Equals(scheduleDateLecturer.ShortName));
                        if (lecturer == null)
                        {
                            lecturer = new OrganiserMember
                            {
                                ShortName   = scheduleDateLecturer.ShortName,
                                Name        = scheduleDateLecturer.Name,
                                Role        = String.Empty,
                                Description = String.Empty
                            };
                            organiser.Members.Add(lecturer);
                            db.Members.Add(lecturer);
                            db.SaveChanges();
                            _numLecturers++;
                            _report.AppendFormat(" !!!NEUER DOZENT!!!");
                        }

                        occ.Hosts.Add(lecturer);
                        _report.AppendFormat("</p>");
                    }
                    _report.AppendFormat("</td>");

                    db.ActivityDates.Add(occ);

                    _report.AppendLine();
                    _report.AppendLine("</tr>");
                }
            }

            _report.AppendLine("</table>");
            db.SaveChanges();

            msEnd = sw.ElapsedMilliseconds;
            _Logger.DebugFormat("Dauer {0}ms", msEnd - msStart);

            msg = $"Kurs {course.ShortName} mit Terminen importiert";

            return(msg);
        }
Пример #4
0
        public static void Create(PdfViewModel pdfvm, Curriculum curriculum)
        {
            // CuriculumModel curriculum = db.Curiculums.Include("StudentId").Where(m => m.CuriculumId == pdfvm.curriculumId).FirstOrDefault();
            List <CurriculumTopic> curriculumTopics = curriculum.Topics.ToList();
            Student student = curriculum.Student;


            // TODO: Sort and group topics by first Certification
            SortedDictionary <string, List <Topic> > groupedTopics = new SortedDictionary <string, List <Topic> >();

            foreach (var topic in curriculumTopics)
            {
                string first = String.Empty;
                if (topic.Topic.Certificeringen.Count != 0)
                {
                    first = topic.Topic.Certificeringen.First().Naam;
                }

                if (!groupedTopics.ContainsKey(first))
                {
                    groupedTopics.Add(first, new List <Topic>());
                    groupedTopics[first].Add(topic.Topic);
                }
                else
                {
                    groupedTopics[first].Add(topic.Topic);
                }
            }

            PdfDocument document = new PdfDocument();
            PdfPage     page     = document.AddPage();
            XGraphics   gfx      = XGraphics.FromPdfPage(page);
            var         tf       = new XTextFormatter(gfx);

            XStringFormat stringFormat = new XStringFormat();

            stringFormat.LineAlignment = XLineAlignment.Near;
            stringFormat.Alignment     = XStringAlignment.Near;

            var basepath = AppDomain.CurrentDomain.BaseDirectory;
            var path     = String.Concat(basepath, "App_Data\\logo_itvitae_learning_liggend.png");

            //var path = Server.MapPath(@"~/App_Data/logo_itvitae_learning_liggend.png");
            XImage logo = XImage.FromFile(path);

            gfx.DrawImage(logo, new XPoint(430, 5));

            //Fonts
            XFont Calibri20Bold       = new XFont("calibri", 20, XFontStyle.Bold);
            XFont Calibri20BoldItalic = new XFont("calibri", 20, XFontStyle.BoldItalic);
            XFont LabelFont           = new XFont("calibri", 11, XFontStyle.Regular);

            //Title Header
            gfx.DrawString("Persoonlijk Curriculum", Calibri20Bold, XBrushes.Black,
                           new XRect(0, 20, page.Width, 0), XStringFormats.Center);
            gfx.DrawString("ITvitae learning", Calibri20BoldItalic, XBrushes.Black,
                           new XRect(0, 41, page.Width, 0), XStringFormats.Center);
            //XImage ITvitaeLogo = XImage.FromFile(string.Empty);
            //gfx.DrawImage(ITvitaeLogo, new XRect(0, 0, 0, 0));

            //30-100-30 -100 -75-100-30 -100 -30
            //0 |30 |130|160|260|335|435|465|565|595
            //Student Info
            int col1x = 30; int col2x = 135; int col3x = 335; int col4x = 435;
            int colwidth = 100; int rowheight = 12;
            int row1 = 60; int row2 = 80; int row3 = 100;

            DrawLabel("Naam:", col1x, row1, colwidth, rowheight, gfx);
            DrawLabel(student.VolledigeNaam, col2x, row1, colwidth, rowheight, gfx);

            DrawLabel("Geboortedatum:", col1x, row2, colwidth, rowheight, gfx);
            DrawLabel(pdfvm.DoB.ToShortDateString(), col2x, row2, colwidth, rowheight, gfx);

            DrawLabel("StartDatum:", col1x, row3, colwidth, rowheight, gfx);
            DrawLabel(pdfvm.StartDate.ToShortDateString(), col2x, row3, colwidth, rowheight, gfx);

            DrawLabel("Einddatum:", col3x, row3, colwidth, rowheight, gfx);
            DrawLabel(pdfvm.EndDate.ToShortDateString(), col4x, row3, colwidth, rowheight, gfx);

            DrawLabel("Niveau:", col3x, row1, colwidth, rowheight, gfx);
            DrawLabel(pdfvm.Niveau, col4x, row1, colwidth, rowheight, gfx);

            DrawLabel("Richting:", col3x, row2, colwidth, rowheight, gfx);
            DrawLabel(pdfvm.Course, col4x, row2, colwidth, rowheight, gfx);

            //Topics
            //595 into 3 columns starting on Y = 150
            int   YPointer = 150;
            int   topicColumnWidth = 159;
            int   topicColumn1 = 30; int topicColumn2 = 30 + topicColumnWidth; int topicColumn3 = 2 * topicColumnWidth + 60;
            XFont certFont = new XFont("calibri", 11, XFontStyle.Regular);
            XPen  pen      = new XPen(XColors.LightGray);

            //Add headers
            DrawLabel("Modules", topicColumn1, YPointer, topicColumnWidth, rowheight, gfx);
            if (pdfvm.Leerdoel)
            {
                DrawLabel("Leerdoelen", topicColumn2, YPointer, topicColumnWidth, rowheight, gfx);
            }
            if (pdfvm.Certificeringen)
            {
                DrawLabel("Certificeringen", topicColumn3, YPointer, topicColumnWidth, rowheight, gfx);
            }
            YPointer += rowheight;

            //List<Topic> topics = curriculum.Topics.ToList();
            List <CurriculumTopic> topics = curriculum.Topics.ToList();

            for (int i = 0; i < curriculum.Topics.Count; i++)
            {
                List <DrawStringListItem> drawList = new List <DrawStringListItem>();

                //Update YPointer;
                YPointer += 4;
                CurriculumTopic topic = topics[i];

                //measure topic
                XSize topicSize = gfx.MeasureString(topic.Topic.NaamCode, certFont);
                //make rect
                int    rectWidth    = topicColumnWidth;
                double rectRows     = 1;
                int    CertYPointer = 0;
                if (topicSize.Width > topicColumnWidth)
                {
                    rectRows = topicSize.Width / topicColumnWidth;
                    if (rectRows % 1 > 0)
                    {
                        rectRows++;
                    }
                    rectRows = Math.Floor(rectRows);
                }
                //check if new page is needed
                if (YPointer + (rowheight * rectRows) > 780)
                {
                    gfx = NewPage(document, out page, gfx, out tf, out YPointer, logo);
                }
                //Make topicrect
                XRect topicRect = new XRect(topicColumn1, 0, rectWidth, rowheight * rectRows);
                //Add string to drawlist
                drawList.Add(new DrawStringListItem(topic.Topic.NaamCode, certFont, XBrushes.Black, topicRect));

                if (pdfvm.Leerdoel)
                {
                    //measure leerdoel
                    XSize leerdoelSize = gfx.MeasureString(topic.Topic.Leerdoel, certFont);
                    //make rect
                    if (leerdoelSize.Width / topicColumnWidth > rectRows)
                    {
                        rectRows = leerdoelSize.Width / topicColumnWidth;
                        if (rectRows % 1 > 0)
                        {
                            rectRows++;
                        }
                        rectRows = Math.Floor(rectRows);
                    }
                    //check if new page is needed
                    if (YPointer + (rowheight * rectRows) > 780)
                    {
                        gfx = NewPage(document, out page, gfx, out tf, out YPointer, logo);
                    }
                    XRect leerdoelRect = new XRect(topicColumn2, 0, rectWidth, rowheight * rectRows);
                    //update height and y pointer
                    drawList.Add(new DrawStringListItem(topic.Topic.Leerdoel, certFont, XBrushes.Black, leerdoelRect));
                }

                if (pdfvm.Certificeringen)
                {
                    List <Certificering> certs = topic.Topic.Certificeringen.ToList();
                    for (int j = 0; j < certs.Count; j++)
                    {
                        //measure each cert
                        XSize certSize = gfx.MeasureString(certs[j].Naam, certFont);
                        //make rect for each cert
                        double certRows = 1;
                        if (certSize.Width / topicColumnWidth > certRows)
                        {
                            certRows = certSize.Width / topicColumnWidth;
                            if (certRows % 1 > 0)
                            {
                                certRows++;
                            }
                            certRows = Math.Floor(certRows);
                        }
                        XRect certRect = new XRect(topicColumn3, CertYPointer, rectWidth, rowheight * certRows);
                        //Add each cert to drawlist
                        drawList.Add(new DrawStringListItem(certs[j].Naam, certFont, XBrushes.Black, certRect));
                        //update CertYPointer for the next cert
                        CertYPointer += rowheight * (int)certRows;
                    }
                    //Check if certs go over the footer
                    if (YPointer + CertYPointer > 780)
                    {
                        gfx = NewPage(document, out page, gfx, out tf, out YPointer, logo);
                    }
                }

                //Draw all the things relative to YPointer
                gfx.DrawLine(pen, topicColumn1, YPointer - 2, topicColumn3 + topicColumnWidth, YPointer - 2);
                foreach (var item in drawList)
                {
                    XRect r = new XRect(item.Rect.X, item.Rect.Y + YPointer, item.Rect.Width, item.Rect.Height);
                    tf.DrawString(item.Text, item.Font, item.Brush, r);
                }
                YPointer += (rowheight * (int)rectRows) > CertYPointer ? (rowheight * (int)rectRows) : CertYPointer;
            }

            //add footers
            gfx.Dispose();
            int pageNumber = 1; int outOf = document.Pages.Count;

            foreach (PdfPage pdfPage in document.Pages)
            {
                gfx = XGraphics.FromPdfPage(pdfPage);
                int   footerY    = 802;
                XFont footerFont = new XFont("verdana", 10, XFontStyle.Italic);
                gfx.DrawLine(pen, 0, footerY, page.Width, footerY);
                gfx.DrawString($"Pagina {pageNumber}/{outOf}", footerFont, XBrushes.SlateGray, new XPoint(455, footerY + 20));
                gfx.DrawString("Versie 1.0", footerFont, XBrushes.SlateGray, new XPoint(65, footerY + 20));
                pageNumber++;
            }



            string filename = student + $"{ DateTime.Now.Millisecond.ToString()}.pdf";

            // $"Hello_{DateTime.Now.Millisecond.ToString()}.pdf";
            document.Save(filename);
            Process.Start(filename);
        }