diff --git a/NGCC/src/GenerateurPdf/.gitkeep b/NGCC/src/GenerateurPdf/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/NGCC/src/GenerateurPdf/SubjectGenerator.java b/NGCC/src/GenerateurPdf/SubjectGenerator.java new file mode 100644 index 0000000..7cfade7 --- /dev/null +++ b/NGCC/src/GenerateurPdf/SubjectGenerator.java @@ -0,0 +1,342 @@ +package GenerateurPdf; + +import java.awt.Color; +import java.io.IOException; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDType1Font; + +// infor concernant strok, fill, ... : https://stackoverflow.com/a/27959484 + +public class SubjectGenerator { + + private static void drawDotedLine(PDPageContentStream contentStream, int xi, int yi, int xf, int yf) + throws IOException { + contentStream.moveTo(xi, yi); + for (int i = xi; i <= xf; i += 3) { + contentStream.lineTo(i, yf); + contentStream.moveTo(i + 2, yf); + + } + // contentStream.fill(); + } + + private static void drawCircle(PDPageContentStream contentStream, int cx, int cy, int r) throws IOException { + // https://stackoverflow.com/a/42836210 + final float k = 0.552284749831f; + contentStream.moveTo(cx - r, cy); + contentStream.curveTo(cx - r, cy + (k * r), cx - (k * r), cy + r, cx, cy + r); + contentStream.curveTo(cx + (k * r), cy + r, cx + r, cy + (k * r), cx + r, cy); + contentStream.curveTo(cx + r, cy - (k * r), cx + (k * r), cy - r, cx, cy - r); + contentStream.curveTo(cx - (k * r), cy - r, cx - r, cy - (k * r), cx - r, cy); + contentStream.fill(); + } + + public static PDDocument generateFooter(PDDocument pdDocument) { + int nbTotal = pdDocument.getNumberOfPages(); + int count = 1; + + try { + for (PDPage page : pdDocument.getPages()) { + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPageContentStream.AppendMode.APPEND, true); + PDFont font = PDType1Font.TIMES_ROMAN; + int width = (int) page.getMediaBox().getWidth(); + int fontSize = 10; + pdPageContentStream.setFont(font, fontSize); + String footer = String.valueOf(count) + " / " + String.valueOf(nbTotal); + float titleWidth = (font.getStringWidth(footer) / 1000) * fontSize; + float titleHeight = (font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000) * fontSize; + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset((width - titleWidth) / 2, (35 - titleHeight)); + pdPageContentStream.showText(footer); + pdPageContentStream.endText(); + pdPageContentStream.close(); + count++; + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } + return pdDocument; + + } + + public static PDDocument generateMarks(PDDocument pdDocument) { + for (PDPage page : pdDocument.getPages()) { + try { + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPageContentStream.AppendMode.APPEND, true); + PDFont font = PDType1Font.TIMES_ROMAN; + + int height = (int) page.getMediaBox().getHeight(); + int width = (int) page.getMediaBox().getWidth(); + + // Set a Color for the marks + pdPageContentStream.setNonStrokingColor(Color.BLACK); + pdPageContentStream.setNonStrokingColor(0, 0, 0); // black text + pdPageContentStream.setFont(font, 9); + + // generate circle marks in corners + SubjectGenerator.drawCircle(pdPageContentStream, 20, height - 30, 5); // top left + SubjectGenerator.drawCircle(pdPageContentStream, width - 20, height - 30, 5); // top right + SubjectGenerator.drawCircle(pdPageContentStream, 20, 30, 5); // bottom left + SubjectGenerator.drawCircle(pdPageContentStream, width - 20, 30, 5); // bottom right + + pdPageContentStream.setLineWidth(0.6f); // largeur du contour des rectangles + + // generate rectangles id (?) + for (int i = 0; i < 12; i++) { + // draw first range of rectangles + pdPageContentStream.addRect(170 + (9 * i), height - 15, 9, 9); + // + 9 * i = position du ieme carre + // draw second range of rectangles + pdPageContentStream.addRect(170 + (9 * i), height - 27, 9, 9); + // + 9 * i = position du ieme carre + } + + pdPageContentStream.setFont(font, 10); + + // draw the separative line + pdPageContentStream.moveTo(28, height - 239); + pdPageContentStream.lineTo(width - 28, height - 239); + + // pdPageContentStream.lineTo(width - 28, height - 239); + pdPageContentStream.stroke(); // stroke + + pdPageContentStream.setFont(font, 11); + + // number (top of page) +n/n/nn+ + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset((width / 2) + 86, height - 30); + pdPageContentStream.showText("+1/1/60+"); + pdPageContentStream.endText(); + + // Sujet + // center text : https://stackoverflow.com/a/6531362 + String subject = "Exemple PT S3T : de 1970 à l’an 2000, 30 ans d’histoire"; + int fontSize = 12; + pdPageContentStream.setFont(font, fontSize); + float titleWidth = (font.getStringWidth(subject) / 1000) * fontSize; + float titleHeight = (font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000) * fontSize; + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset((width - titleWidth) / 2, (height - 57 - titleHeight)); + pdPageContentStream.showText(subject); + pdPageContentStream.endText(); + + String subtitle = "Tricherie : Toutes consultations de sources numériques sont interdites !!"; + titleWidth = (font.getStringWidth(subtitle) / 1000) * fontSize; + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset((width - titleWidth) / 2, (height - 71 - titleHeight)); + pdPageContentStream.showText(subtitle); + pdPageContentStream.endText(); + + fontSize = 10; + + // 1st line + pdPageContentStream.setFont(font, fontSize); + String numConsignePart1 = " Veuillez coder votre numéro"; + + titleWidth = (font.getStringWidth(numConsignePart1) / 1000) * fontSize; + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset(width - 224, height - 94 - titleHeight); + pdPageContentStream.showText(numConsignePart1); + pdPageContentStream.endText(); + + // 2nd line + String numConsignePart2 = " d’étudiant ci-contre et écrire votre nom"; + + titleWidth = (font.getStringWidth(numConsignePart2) / 1000) * fontSize; + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset(width - 244, height - 105 - titleHeight); + pdPageContentStream.showText(numConsignePart2); + pdPageContentStream.endText(); + + // 3rd line + String numConsignePart3 = " dans la case ci-dessous."; + + titleWidth = (font.getStringWidth(numConsignePart3) / 1000) * fontSize; + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset(width - 244, height - 118 - titleHeight); + pdPageContentStream.showText(numConsignePart3); + pdPageContentStream.endText(); + + pdPageContentStream.close(); + + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + return pdDocument; + } + + /* + * public static PDDocument generateIDPageArea(PDDocument pdDocument) { + * + * } + */ + + public static PDDocument generateNameArea(PDDocument pdDocument) { + try { + PDPage page = pdDocument.getPage(0); + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPageContentStream.AppendMode.APPEND, true); + PDFont font = PDType1Font.TIMES_ROMAN; + + // Set a Color for the marks + pdPageContentStream.setNonStrokingColor(Color.BLACK); + pdPageContentStream.setNonStrokingColor(0, 0, 0); // black text + pdPageContentStream.setFont(font, 9); + + int height = (int) page.getMediaBox().getHeight(); + int width = (int) page.getMediaBox().getWidth(); + + // generate rectangle nom + pdPageContentStream.addRect(width - 238, height - 196, 155, 50); // RECT + // text + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset(width - 236, height - 156); + pdPageContentStream.showText("Ecrivez votre Nom"); + pdPageContentStream.endText(); + + // dot lines + // TODO: Enleve car difficulte d'ocr du fait de la presence des pointilles + // SubjectGenerator.drawDotedLine(pdPageContentStream, width - 233, height - + // 175, width - 90, height - 175); + // SubjectGenerator.drawDotedLine(pdPageContentStream, width - 233, height - + // 190, width - 90, height - 190); + + pdPageContentStream.stroke(); // stroke + + // pdPageContentStream.fill(); + pdPageContentStream.closeAndStroke(); + + pdPageContentStream.close(); + + } catch (IOException ioe) { + ioe.printStackTrace(); + } + return pdDocument; + } + + public static PDDocument generateNumEtudAreaBis(PDDocument pdDocument) { + try { + PDPage page = pdDocument.getPage(0); + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPageContentStream.AppendMode.APPEND, true); + PDFont font = PDType1Font.TIMES_ROMAN; + + // Set a Color for the marks + pdPageContentStream.setNonStrokingColor(Color.BLACK); + pdPageContentStream.setNonStrokingColor(0, 0, 0); // black text + pdPageContentStream.setFont(font, 9); + + int height = (int) page.getMediaBox().getHeight(); + int width = (int) page.getMediaBox().getWidth(); + + // num rectangle + pdPageContentStream.addRect(width / 4, height - 146, 150, 40); + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset((width / 4) + 2, height - 115); + pdPageContentStream.showText("Ecrivez votre Numéro d'étudiant"); + pdPageContentStream.endText(); + + // note rectangle + pdPageContentStream.addRect(width / 4, height - 200, 150, 40); + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset((width / 4) + 2, height - 170); + pdPageContentStream.showText("Note"); + pdPageContentStream.endText(); + + pdPageContentStream.moveTo((width / 4) + 75, height - 160); + pdPageContentStream.lineTo((width / 4) + 75, height - 200); + + // dotedlines + + // SubjectGenerator.drawDotedLine(pdPageContentStream, width - 233, height - + // 175, width - 90, height - 175); + + pdPageContentStream.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + return pdDocument; + } + + public static PDDocument generateNumEtudArea(PDDocument pdDocument) { + try { + PDPage page = pdDocument.getPage(0); + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPageContentStream.AppendMode.APPEND, true); + PDFont font = PDType1Font.TIMES_ROMAN; + + // Set a Color for the marks + pdPageContentStream.setNonStrokingColor(Color.BLACK); + pdPageContentStream.setNonStrokingColor(0, 0, 0); // black text + pdPageContentStream.setFont(font, 9); + + int height = (int) page.getMediaBox().getHeight(); + + // generate rectangles numero etudiant + for (int i = 0; i <= 9; i++) { + // draw first range of rectangles + pdPageContentStream.addRect(80 + (22 * i), height - 107, 11, 11); + // write first range of numbers + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 105); + pdPageContentStream.showText(String.valueOf(i)); + pdPageContentStream.endText(); + // draw second range of rectangles + pdPageContentStream.addRect(80 + (22 * i), height - 124, 11, 11); + // write second range of numbers + pdPageContentStream.beginText(); + pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 122); + pdPageContentStream.showText(String.valueOf(i)); + pdPageContentStream.endText(); + } + + pdPageContentStream.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + return pdDocument; + } + + public void generateHeader(PDDocument pdDocument) { + try { + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, pdDocument.getPage(0)); + PDFont font = PDType1Font.HELVETICA_BOLD; + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + + public static void main(String args[]) throws IOException { + // Create a Document object. + PDDocument pdDocument = new PDDocument(); + // Create a Page object + PDPage pdPage1 = new PDPage(PDRectangle.A4); + // System.out.println("Height : " + pdPage1.getMediaBox().getHeight()); + // System.out.println("Width : " + pdPage1.getMediaBox().getWidth()); + PDPage pdPage2 = new PDPage(PDRectangle.A4); + PDPage pdPage3 = new PDPage(PDRectangle.A4); + + // Add the page to the document and save the document to a desired file. + pdDocument.addPage(pdPage1); + pdDocument.addPage(pdPage2); + pdDocument.addPage(pdPage3); + + pdDocument = SubjectGenerator.generateMarks(pdDocument); + pdDocument = SubjectGenerator.generateNumEtudAreaBis(pdDocument); + pdDocument = SubjectGenerator.generateNameArea(pdDocument); + pdDocument = SubjectGenerator.generateFooter(pdDocument); + + // pdDocument.save("C:\\Users\\Nico\\Desktop\\testPDFMarks.pdf"); + pdDocument.save("E:\\testPDFMarks.pdf"); + pdDocument.close(); + System.out.println("PDF saved to the location !!!"); + } +}