math_test/
pdf.rs

1use crate::{exam::Exam, question_type};
2use genpdf::{style::Style, Document};
3
4use crate::question::Question;
5
6/// Genrates a Pdf file given an Exam
7#[allow(dead_code)]
8pub fn generate_pdf<T: Question>(exam: &Exam<T>) {
9    println!("Generating PDF file...");
10
11    let font_family = genpdf::fonts::from_files("./fonts", "LiberationSans", None)
12        .expect("Failed to load font family");
13    let mut doc = genpdf::Document::new(font_family);
14    doc.set_title("Math Test");
15    let mut decorator = genpdf::SimplePageDecorator::new();
16    decorator.set_margins(10);
17    doc.set_page_decorator(decorator);
18    if exam.get_question_type()
19        == question_type::QuestionType::Equation(question_type::EquationType::TwoVariables)
20    {
21        doc.set_font_size(11);
22    } else {
23        doc.set_font_size(12);
24    }
25
26    let questions = exam.get_questions();
27    let mut counter = 1;
28    for question in questions {
29        push_question(question, counter, &mut doc);
30        counter += 1;
31    }
32
33    let file_name = "math_test.pdf";
34    doc.render_to_file(file_name)
35        .expect("Failed to write PDF file");
36
37    println!("File {} generated", file_name);
38}
39
40/// Writes a Question into the Pdf file
41fn push_question<T: Question>(question: &T, id: i32, doc: &mut Document) {
42    let title = format!("Question {}: ", id);
43
44    let mut title_element = genpdf::elements::Paragraph::new("");
45    let style = Style::new();
46    let style = style.bold();
47    title_element.push_styled(title, style);
48
49    doc.push(title_element);
50    for line in question.to_string().lines() {
51        doc.push(genpdf::elements::Paragraph::new(line));
52    }
53
54    doc.push(genpdf::elements::Paragraph::new(""));
55    let separator = "=============";
56    doc.push(genpdf::elements::Paragraph::new(separator));
57    doc.push(genpdf::elements::Paragraph::new(""));
58}