#27 Ajout des cases à griser pour chaque questions. Prise en compte de certains parametres fournis dans le fichier config.txt (mélange des questions et des réponses) (à compléter)

This commit is contained in:
NicolasLACROIX 2019-10-30 20:36:34 +01:00
parent ff5c223161
commit 431d8eb5c9

View File

@ -3,6 +3,7 @@ package GenerateurPdf;
import java.awt.Color; import java.awt.Color;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPage;
@ -13,6 +14,7 @@ import org.apache.pdfbox.pdmodel.font.PDType1Font;
import config.Config; import config.Config;
import config.Question; import config.Question;
import config.Reponse;
// infos concernant strok, fill, ... : https://stackoverflow.com/a/27959484 // infos concernant strok, fill, ... : https://stackoverflow.com/a/27959484
@ -329,6 +331,7 @@ public class SubjectGenerator {
} }
public void generateHeader() { public void generateHeader() {
// TODO: change text considering config data
try { try {
PDPage page = this.pdDocument.getPage(0); PDPage page = this.pdDocument.getPage(0);
@ -405,7 +408,7 @@ public class SubjectGenerator {
} }
} }
public void generateBody() { public void generateBody(boolean isCorrected) {
try { try {
PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument,
this.pdDocument.getPage(0), PDPageContentStream.AppendMode.APPEND, true); this.pdDocument.getPage(0), PDPageContentStream.AppendMode.APPEND, true);
@ -416,20 +419,25 @@ public class SubjectGenerator {
int heightOffset = 265; int heightOffset = 265;
int pageIndex = 0; int pageIndex = 0;
// System.out.println(this.config.getQuestions()); // System.out.println(this.config.getQuestions());
for (Question q : this.config.getQuestions()) { // pour chaque question
ArrayList<Question> questions = this.config.getQuestions();
// si les questions doivent etre melangees
if (this.config.getParam().get("ShuffleQuestions") == "1") {
Collections.shuffle(questions);
}
for (Question q : questions) {
q.setTitre(q.getTitre().replace("\n", "")); // /\ TODO: must be done in Config /\ q.setTitre(q.getTitre().replace("\n", "")); // /\ TODO: must be done in Config /\
int height = (int) this.pdDocument.getPage(0).getMediaBox().getHeight();
PDPage page = this.pdDocument.getPage(pageIndex); PDPage page = this.pdDocument.getPage(pageIndex);
this.generateQ(q, qIndex, this.pdDocument, page, 25, heightOffset); this.generateQCM(q, qIndex, this.pdDocument, page, 25, heightOffset, isCorrected);
qIndex++; qIndex++;
heightOffset += 100; heightOffset += 100;
if (heightOffset > (height - 10)) { // si on depasse la longeur de la page
heightOffset = 265; if (heightOffset > (this.height - 10)) {
pageIndex++; pageIndex++; // on va a la page suivante
heightOffset = 55; // on se place en haut de la page
} }
} }
pdPageContentStream.close(); pdPageContentStream.close();
} }
@ -438,8 +446,11 @@ public class SubjectGenerator {
} }
} }
public void generateQ(Question q, int qIndex, PDDocument pdDocument, PDPage curPage, int widthOffset, public void generateQCM(Question q, int qIndex, PDDocument pdDocument, PDPage curPage, int widthOffset,
int heightOffset) { int heightOffset, boolean isCorrected) {
// TODO: calculer automatiquement widthOffset
// TODO: regler probleme de debordement de page (verifiee pour chaque question
// mais pas pour chaque reponse)
try { try {
// Il faut rendre plus générale la génération des Q (en fonction du nombre de // Il faut rendre plus générale la génération des Q (en fonction du nombre de
// réponses, recycler le heightOffset) // réponses, recycler le heightOffset)
@ -457,6 +468,7 @@ public class SubjectGenerator {
// Titre // Titre
// Si titre plus long que largeur page -> mise sur plusieurs lignes // Si titre plus long que largeur page -> mise sur plusieurs lignes
// TODO: revoir structure (factorisation possible)
if (titleLength > (this.width - 20)) { if (titleLength > (this.width - 20)) {
pdPageContentStream.beginText(); pdPageContentStream.beginText();
pdPageContentStream.newLineAtOffset(widthOffset, this.height - heightOffset); pdPageContentStream.newLineAtOffset(widthOffset, this.height - heightOffset);
@ -478,17 +490,35 @@ public class SubjectGenerator {
pdPageContentStream.endText(); pdPageContentStream.endText();
} }
// Reponses (QCM) ArrayList<Reponse> reponses = q.getReponses();
/// Rectangle // si les reponses doivent etre melangees
// pdPageContentStream.addRect(widthOffset + 20, height - heightOffset - 15, if (this.config.getParam().get("ShuffleAnswers") == "1") {
// 100, 100); Collections.shuffle(reponses);
}
/// Texte // pour chaque reponse
for (int i = 0; i < q.getReponses().size(); i++) { for (Reponse r : reponses) {
/**
* if (heightOffset > (this.height - 10)) { pageIndex++; // on va a la page
* suivante heightOffset = 55; // on se place en haut de la page }
*/
// on ecrit la reponse
pdPageContentStream.beginText(); pdPageContentStream.beginText();
pdPageContentStream.newLineAtOffset(widthOffset + 40, this.height - heightOffset - 15); pdPageContentStream.newLineAtOffset(widthOffset + 40, this.height - heightOffset - 15);
pdPageContentStream.showText(q.getReponses().get(i).getIntitule()); pdPageContentStream.showText(r.getIntitule());
pdPageContentStream.endText(); pdPageContentStream.endText();
// on ajoute une zone pour cocher (carre)
pdPageContentStream.addRect(widthOffset + 20, this.height - heightOffset - 16, 10, 10);
// si l'on souhait generer le corrige
if (isCorrected) {
// si c'est une bonne reponse
if (r.isJuste()) {
pdPageContentStream.fillAndStroke(); // carre noirci
} else {
pdPageContentStream.stroke(); // carre vide
}
} else {
pdPageContentStream.stroke(); // carre vide
}
heightOffset += 17.5; heightOffset += 17.5;
} }
@ -509,6 +539,10 @@ public class SubjectGenerator {
} }
} }
public void generateOpenQ() {
}
public static ArrayList<String> setTextOnMultLines(String text, int widthOffset, PDDocument pdDocument, PDFont font, public static ArrayList<String> setTextOnMultLines(String text, int widthOffset, PDDocument pdDocument, PDFont font,
int fontSize) { int fontSize) {
// TODO: voir si l'on laisse en static ou non // TODO: voir si l'on laisse en static ou non
@ -584,6 +618,7 @@ public class SubjectGenerator {
// instanciate a new SubjectGenerator // instanciate a new SubjectGenerator
// TODO: change PDRectangle.A4 to the format specified in the config // TODO: change PDRectangle.A4 to the format specified in the config
// TODO: number of page = automatic
SubjectGenerator subjectGenerator = new SubjectGenerator(c, 5, PDRectangle.A4); SubjectGenerator subjectGenerator = new SubjectGenerator(c, 5, PDRectangle.A4);
subjectGenerator.generateHeader(); subjectGenerator.generateHeader();
@ -591,7 +626,7 @@ public class SubjectGenerator {
// subjectGenerator.generateNumEtudAreaBis(); // subjectGenerator.generateNumEtudAreaBis();
// subjectGenerator.generateNameArea(); // subjectGenerator.generateNameArea();
subjectGenerator.generateFooter(); subjectGenerator.generateFooter();
subjectGenerator.generateBody(); subjectGenerator.generateBody(false); // false = on genere le sujet, pas le corrige
subjectGenerator.save("E:\\testPDFMarks.pdf"); subjectGenerator.save("E:\\testPDFMarks.pdf");